adb recovery 模式下支持adb shell

本文介绍了解决在recovery模式下无法使用adb shell的问题,通过修改init.rc文件加入shell服务,更新Makefile以复制必要的二进制文件,并调整mksh编译配置,最终实现了adb shell的功能。

问题:在recovery模式下,可以使用adb devices 、adb root、adb remount、adb reboot 但是输入adb shell 提示:exec "/system/bin/sh": No such file or directory 。

解决方法:

1.在bootable\recovery\etc\init.rc增加如下内容:  开启console 控制台支持

 89 service adbd /sbin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery
 90     disabled
 91     socket adbd stream 660 system system
 92     seclabel u:r:adbd:s0
 93 
 94 service console /system/bin/sh
 95      class core
 96      console
 97      disabled
 98      user shell
 99      group shell log readproc
100     seclabel u:r:shell:s0

101 
102 # Always start adbd on userdebug and eng builds
103 on property:ro.debuggable=1
104     start console
105     write /sys/class/android_usb/android0/enable 1
106     start adbd

2.在\build\core\Makefile中增加如下内容:(copy bin 文件的内容到recovery.img中)

1213   @echo Modifying ramdisk contents...
1214   $(if $(BOARD_RECOVERY_KERNEL_MODULES), \
1215     $(call build-image-kernel-modules,$(BOARD_RECOVERY_KERNEL_MODULES),$(TARGET_RECOVERY_ROOT_OUT),,$(call intermediates-dir-for,PACKAGING,depmod_recovery)))
1216   $(hide) rm -f $(TARGET_RECOVERY_ROOT_OUT)/init*.rc
1217   $(hide) cp -f $(recovery_initrc) $(TARGET_RECOVERY_ROOT_OUT)/
1218   $(hide) cp $(TARGET_ROOT_OUT)/init.recovery.*.rc $(TARGET_RECOVERY_ROOT_OUT)/ || true # Ignore error when the src file doesn't exist.
1219   $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/res
1220   $(hide) rm -rf $(TARGET_RECOVERY_ROOT_OUT)/res/*
1221   $(hide) cp -rf $(recovery_resources_common)/* $(TARGET_RECOVERY_ROOT_OUT)/res
1222   $(hide) cp -f $(recovery_font) $(TARGET_RECOVERY_ROOT_OUT)/res/images/font.png
1223   $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/system/bin
1224   $(hide) cp -r $(PRODUCT_OUT)/system/bin/sh $(TARGET_RECOVERY_ROOT_OUT)/system/bin

1225   $(hide) $(foreach item,$(TARGET_PRIVATE_RES_DIRS), \
1226     cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/$(newline))
1227   $(hide) $(foreach item,$(recovery_fstab), \
1228     cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab)

3.在external\mksh\Android.mk中增加如下内容:在recovery模式下,二进制文件都是静态连接方式

 80 #LOCAL_SYSTEM_SHARED_LIBRARIES := libc    (原来就有,注释掉就行)
 81 
 82 LOCAL_STATIC_LIBRARIES := libc

 83 LOCAL_FORCE_STATIC_EXECUTABLE := true

4.重新烧录recovery.img镜像文件,ok。

5.参考链接:

0.

Android recovery.img 支持adb shell

https://blog.youkuaiyun.com/makeyourprogress/article/details/74231123#commentBox

1.

Android recovery.img 支持adb shell

http://blog.youkuaiyun.com/chituhuan/article/details/52383655

2.

[IMX6Q][Android5.1]移植笔记 --- Recovery mode的shell功能实现(sh+toolbox)

http://blog.youkuaiyun.com/kris_fei/article/details/50921384

3.

Android Recovery 支持 Adb

http://www.jianshu.com/p/a0bdcce0a5e1

<think> 我们参考了引用[1]中关于adbd在user版本获取root权限的说明。根据引用内容,在Android 4.1(JB)之后,Google默认移除了user版本adbd的root权限。为了在recovery模式下使用adb root,我们需要修改系统编译选项。 解决方案如下: 1. 修改编译配置:在源代码中,找到`system/core/adb/Android.mk`文件,修改其中的`ALLOW_ADBD_ROOT`选项。将原来的: ```makefile ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT))) ``` 改为: ```makefile ifneq (,$(filter userdebug user eng,$(TARGET_BUILD_VARIANT))) ``` 这样修改后,在user版本编译时也会允许adbd具有root权限。 2. 在修改后,需要重新编译整个Android系统(或至少编译adbd模块),并将生的镜像刷入设备。 3. 另外,在recovery模式下,我们还需要确保recoveryadbd也是以root权限运行。通常,recovery模式adbd配置是独立的,位于`bootable/recovery/etc/init.rc`或类似路径中。需要检查该文件,确保adbd以root身份启动: ``` service adbd /sbin/adbd --root_seclabel=u:r:su:s0 class core socket adbd stream 660 system system disabled seclabel u:r:adbd:s0 ``` 注意:上述配置仅供参考,具体设备可能有所不同。关键是确保adbd以root权限运行。 4. 如果设备已经root,也可以尝试在recovery模式下使用`magisk`等工具来获取root权限,但这种方法依赖于设备的具体情况。 注意:修改系统源代码并重新编译需要具备Android系统编译环境,并且该操作可能会影响设备的保修和安全。请谨慎操作。 由于修改系统源代码并重新编译是一个复杂的过程,建议由有经验的开发人员操作。 如果以上步骤无法解决问题,可能需要检查设备的特定配置,因为不同厂商可能会对recovery模式进行定制。 §§相关问题§§ 1. 如何搭建Android源码编译环境? 2. 除了修改源代码,还有哪些方法可以在user版本获取adb root权限? 3. 在recovery模式下,如何调试adb连接问题? </think>根据引用内容[^1],user版本recovery模式下无法使用adb root的解决方案如下: ### 解决方案 1. **修改编译配置** 在Android源码中修改`system/core/adb/Android.mk`文件: ```makefile # 原始配置(仅允许userdebug/eng版本) ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT))) # 修改为(增加user版本支持) ifneq (,$(filter userdebug user eng,$(TARGET_BUILD_VARIANT))) ``` 此修改会启用`ALLOW_ADBD_ROOT`选项,使adbd在user版本也能根据`ro.secure`属性申请root权限。 2. **设置系统属性** 在`device.mk`或设备配置文件中添加: ```makefile # 允许adbd获取root权限 PRODUCT_PROPERTY_OVERRIDES += ro.secure=0 PRODUCT_PROPERTY_OVERRIDES += ro.adb.secure=0 ``` 或通过`adb shell`临时修改(需临时生效): ```bash adb shell setprop ro.secure 0 adb shell setprop ro.adb.secure 0 ``` 3. **重新编译并刷机** - 执行完整编译:`make -j8` - 刷入新编译的recovery镜像: ```bash fastboot flash recovery out/target/product/<device>/recovery.img ``` ### 关键原理 - **Android 4.1+限制**:Google默认关闭user版本的adbd root权限[^1]。 - **编译选项作用**:`ALLOW_ADBD_ROOT`控制`adb.c`是否检查`ro.secure`属性决定权限。 - **属性优先级**:`ro.secure=0`时adbd以root运行,`=1`时降权为shell用户。 > ⚠️ 注意:修改后需重新编译整个系统,仅替换adbd二进制文件可能不生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c_hnie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值