Android recovery支持adb shellandroid
近期開發過程注意到recovery不支持adb shell。爲了便於調試方便,決定添加此功能。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下關於adbdsocket
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。post
ro.debuggable 在\build\core\main.mk如下的內容賦值ui
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如下的內容賦值:spa
## 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中。.net
依據上面可知。編譯時假設選擇userdebug或是eng。則ro.debuggable=1。如下咱們選擇eng版本號編譯recovery.img。進入recovery後,輸入adb shell命令。提示:debug
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的rest
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