Android recovery支持adb shell
近期開發過程注意到recovery不支持adb shell。為了便於調試方便,決定添加此功能。
剛開始我們採用的是user版本號系統,進入recovery后,輸入adb shell命令。提示“error: no devices/emulators found”。我們先確認recovery.img是否包括有adb,看out\debug\target\product\xxx\recovery\root\sbin是否有adb文件(源碼\system\core\adb),然后檢查\bootable\recovery\etc\init.rc下關於adbd
service adbd /sbin/adbd--root_seclabel=u:r:su:s0 --device_banner=recovery
disabled
socket adbd stream 660 system system
seclabel u:r:adbd:s0
# Always start adbd on userdebug and engbuilds
on property:ro.debuggable=1
write /sys/class/android_usb/android0/enable 1
start adbd
# Restart adbd so it can run as root
on property:service.adb.root=1
write /sys/class/android_usb/android0/enable 0
restart adbd
write/sys/class/android_usb/android0/enable 1
從上面可知init.rc 中adbd 是配置的,disabled 表示開機不啟動,如 ro.debuggable 被置為1。那么adb 就會開啟,或是service.adb.root設置為1,則重新啟動adbd。
ro.debuggable 在\build\core\main.mk以下的內容賦值
ifeq (true,$(strip$(enable_target_debugging)))
#Target is more debuggable and adbd is on by default
ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1
enable_target_debugging 在\build\core\main.mk以下的內容賦值:
## user/userdebug ##
user_variant := $(filter useruserdebug,$(TARGET_BUILD_VARIANT))
enable_target_debugging := true
tags_to_install :=
ifneq (,$(user_variant))
#Target is secure in user builds.
ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1
ifeq ($(user_variant),userdebug)
#Pick up some extra useful tools
tags_to_install += debug
#Enable Dalvik lock contention logging for userdebug builds.
ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.lockprof.threshold=500
else
#Disable debugging in plain user builds.
enable_target_debugging :=
#Add for testUsbDebugging()
ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=1
Endif
…
Endif
可知默覺得enable_target_debugging := true,依據user_variant的值假設為user。則enable_target_debugging :=。這又和TARGET_BUILD_VARIANT有關,此變量相應於VARIANT_CHOICES=(user userdebug eng)中的一個值。由我們來選擇,相關的實如今\build\envsetup.sh中。
依據上面可知。編譯時假設選擇userdebug或是eng。則ro.debuggable=1。以下我們選擇eng版本號編譯recovery.img。進入recovery后,輸入adb shell命令。提示:
Exec ‘/system/bin/sh’ failed:No such fileor directory(2)
表示沒有sh這個文件。無法進入shell,檢查ramdisk 文件系統 system 文件夾為(out\debug\target\product\xxx\recovery\root\system)空。但我們知道boot.img下是能夠的,看\system\core\rootdir\init.rc檢查boot.img 啟動的init.rc 關於sh的
service console /system/bin/sh
class core
console
disabled
user shell
group shell log
seclabel u:r:shell:s0
on property:ro.debuggable=1
start console
可知是啟動了sh這控制台的。所以須要在bootable\recovery\etc\init.rc添加相應的內容:
圖1
我們知道out\debug\target\product\xxx\recovery\root\system下沒有bin文件夾(當然也沒有sh),所以須要在編譯的時候創建。須要\build\core\Makefile添加創建文件夾和把out文件夾下的/system/bin/sh復制到out/recovery/system/bin文件夾下
圖2
但這樣還是不行,后來知道recovery可運行文件是靜態編譯的。之所以這樣是由於recovery模式中沒有共享庫還有缺動態鏈接庫載入器(/system/bin/linker,Android動態連接器linker與靜態連接器ld)。
所以\external\mksh\Android.mk
圖3
參考鏈接:
Android recovery.img 支持adb shell
http://blog.csdn.net/chituhuan/article/details/52383655
[IMX6Q][Android5.1]移植筆記 --- Recovery mode的shell功能實現(sh+toolbox)
http://blog.csdn.net/kris_fei/article/details/50921384
Android Recovery 支持 Adb
http://www.jianshu.com/p/a0bdcce0a5e1