Android recovery支持adb shell

时间:2024-03-21 09:43:31

最近开发过程注意到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

[plain] view plain copy
  1. <span style="font-size:14px;">service adbd /sbin/adbd--root_seclabel=u:r:su:s0 --device_banner=recovery  
  2.    disabled  
  3.    socket adbd stream 660 system system  
  4.    seclabel u:r:adbd:s0  
  5.    
  6. # Always start adbd on userdebug and engbuilds  
  7. on property:ro.debuggable=1  
  8.    write /sys/class/android_usb/android0/enable 1  
  9.    start adbd  
  10.    
  11. # Restart adbd so it can run as root  
  12. on property:service.adb.root=1  
  13.    write /sys/class/android_usb/android0/enable 0  
  14.    restart adbd  
  15. write/sys/class/android_usb/android0/enable 1</span>  

从上面可知init.rc 中adbd 是配置的,disabled 表示开机不启动,如  ro.debuggable 被置为1,那么adb 就会开启,或是service.adb.root设置为1,则重启adbd。

 

ro.debuggable 在\build\core\main.mk下面的内容赋值

[plain] view plain copy
  1. <span style="font-size:14px;">ifeq (true,$(strip$(enable_target_debugging)))  
  2.   #Target is more debuggable and adbd is on by default  
  3.  ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1</span>  

enable_target_debugging 在\build\core\main.mk下面的内容赋值:

[plain] view plain copy
  1. <span style="font-size:14px;">## user/userdebug ##  
  2.    
  3. user_variant := $(filter useruserdebug,$(TARGET_BUILD_VARIANT))  
  4. enable_target_debugging := true  
  5. tags_to_install :=  
  6. ifneq (,$(user_variant))  
  7.   #Target is secure in user builds.  
  8.  ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1  
  9.    
  10.  ifeq ($(user_variant),userdebug)  
  11.     #Pick up some extra useful tools  
  12.    tags_to_install += debug  
  13.    
  14.     #Enable Dalvik lock contention logging for userdebug builds.  
  15.    ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.lockprof.threshold=500  
  16.  else  
  17.     #Disable debugging in plain user builds.  
  18.    enable_target_debugging :=  
  19.    
  20.     #Add for testUsbDebugging()  
  21.    ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=1  
  22.   Endif  
  23. …  
  24. Endif</span>  

可知默认为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的

[plain] view plain copy
  1. <span style="font-size:14px;">service console /system/bin/sh  
  2.    class core  
  3.    console  
  4.    disabled  
  5.    user shell  
  6.    group shell log  
  7.    seclabel u:r:shell:s0  
  8.    
  9. on property:ro.debuggable=1  
  10. start console</span>  

可知是启动了sh这控制台的,所以需要在bootable\recovery\etc\init.rc增加相应的内容:

 Android recovery支持adb shell

图1

我们知道out\debug\target\product\xxx\recovery\root\system下没有bin文件夹(当然也没有sh),所以需要在编译的时候创建,需要\build\core\Makefile增加创建目录和把out目录下的/system/bin/sh拷贝到out/recovery/system/bin目录下

 Android recovery支持adb shell

图2

但这样还是不行,后来知道recovery可执行文件是静态编译的,之所以这样是因为recovery模式中没有共享库还有缺动态链接库加载器(/system/bin/linker,android动态连接器linker与静态连接器ld)。

 

所以\external\mksh\Android.mk

Android recovery支持adb shell

图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


原文链接:http://blog.csdn.net/loongembedded/article/details/67638687