项目上安卓系统在升级时,经常有不成功的情况,想看下recovery下的情况,recovery下adb shell又用不了,如是决定把adb shell功能加上,下次OTA出问题时好定位。

安卓8.1系统,在debug模式下,有启动adbd服务,可以运行adb pull, adb reboot 等操作,但不能执行adb shell。修改涉及到二个部分,第一部分不管debug模式还是user模式,都启动adbd服务;第二部分是完善recoery的文件系统,我加了sh和busybox。

  • (一)启动adbd服务

打开/bootable/recovery/etc/init.rc ,里面有启动adbd服务,修改成始终打开,我是改成我的SDK版本为条件,其他安卓系统修改下数字27就可以了。

# Always start adbd on userdebug and eng builds
#on property:ro.debuggable=1
on property:ro.build.version.sdk=27
    write /sys/class/android_usb/android0/enable 1
    start adbd

  加了这个后,在正常模式下,adb reboot recovery 应该可以看到下面这个设备

# adb devices
List of devices attached
1bab414a        recovery

  • (二)完善文件系统

1)打开external/mksh/Android.mk,将sh修改成静态链接的可执行程序,recovery没有完整的文件系统,不能做动态链接;

#LOCAL_SYSTEM_SHARED_LIBRARIES := libc
LOCAL_STATIC_LIBRARIES := libc
LOCAL_FORCE_STATIC_EXECUTABLE := true

LOCAL_C_INCLUDES := $(MKSH_INCLUDES)

2)添加busybox工具

    本来想用安卓本身的toybox,但发现要编译成如1)的静态链接程序有点麻烦,手头刚好有现成的busybox,就用他了。在PRODUCT_COPY_FILES里加上busybox,将它copy到system/xbin/busybox;busybox下载

3)将sh和busybox加到recovery文件系统

    修改build/make/core/Makefile的define build-recoveryimage-target定义

define build-recoveryimage-target
  @echo ----- Making recovery image ------
  ------
  # Copy adbd from system/bin to recovery/root/sbin
  $(hide) cp -f $(TARGET_OUT_EXECUTABLES)/adbd $(TARGET_RECOVERY_ROOT_OUT)/sbin/adbd
  #以下是我添加的
  # Copy sh from system/bin to recovery
  $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/system $(TARGET_RECOVERY_ROOT_OUT)/system/bin
  $(hide) cp -f $(TARGET_OUT_EXECUTABLES)/sh $(TARGET_RECOVERY_ROOT_OUT)/system/bin/sh
  $(hide) cp -f $(TARGET_OUT)/xbin/busybox $(TARGET_RECOVERY_ROOT_OUT)/sbin/busybox

通过上面的几步简单的操作,我们就可以进入recovery的adb shell了

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐