Android recovery支持adb shell


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM