Android recovery支援adb shell

來源:互聯網
上載者:User

標籤:http   else   track   控制   more   get   分享   rest   extra   

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 engbuildson property:ro.debuggable=1   write /sys/class/android_usb/android0/enable 1   start adbd # Restart adbd so it can run as rooton property:service.adb.root=1   write /sys/class/android_usb/android0/enable 0   restart adbdwrite/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 := truetags_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=1start 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

 

Android recovery支援adb shell

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.