zoukankan      html  css  js  c++  java
  • Android recovery支持adb shell

    Android recovery支持adb shell

     

    近期开发过程注意到recovery不支持adb shell。为了便于调试方便,决定添加此功能。

     

    刚開始我们採用的是user版本号系统,进入recovery后,输入adb shell命令。提示“error: no devices/emulators found”。我们先确认recovery.img是否包括有adb,看outdebug argetproductxxx ecovery ootsbin是否有adb文件(源码systemcoreadb),然后检查ootable ecoveryetcinit.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 在uildcoremain.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 在uildcoremain.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)中的一个值。由我们来选择,相关的实如今uildenvsetup.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 文件夹为(outdebug argetproductxxx ecovery ootsystem)空。但我们知道boot.img下是能够的,看systemcore ootdirinit.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 ecoveryetcinit.rc添加相应的内容:

     

    图1

    我们知道outdebug argetproductxxx ecovery ootsystem下没有bin文件夹(当然也没有sh),所以须要在编译的时候创建。须要uildcoreMakefile添加创建文件夹和把out文件夹下的/system/bin/sh复制到out/recovery/system/bin文件夹下

     

    图2

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

     

    所以externalmkshAndroid.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

  • 相关阅读:
    【maven】maven源码打包
    【分布式事务】阿里fescar
    第五章 mybatis批量更新update
    第二十九章 springboot + zipkin + mysql
    第二十八章 springboot + zipkin(brave定制-AsyncHttpClient)
    第二十七章 springboot + zipkin(brave-okhttp实现)
    附8 zipkin
    第二十六章 hystrix-dashboard + turbine
    附7 turbine
    第二章 部署war包到tomcat
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7402487.html
Copyright © 2011-2022 走看看