recover模式下的adbd

recover模式下的adbd是用了一个libminadbd的静态库,我们来看下mk文件

LOCAL_SRC_FILES := \
    fuse_adb_provider.cpp \
    minadbd.cpp \
    minadbd_services.cpp \

LOCAL_CLANG := true
LOCAL_MODULE := libminadbd
LOCAL_CFLAGS := $(minadbd_cflags)
LOCAL_CONLY_FLAGS := -Wimplicit-function-declaration
LOCAL_C_INCLUDES := bootable/recovery system/core/adb
LOCAL_WHOLE_STATIC_LIBRARIES := libadbd
LOCAL_STATIC_LIBRARIES := libcrypto libbase

include $(BUILD_STATIC_LIBRARY)

主函数minadbd.cpp如下,这个就是adbd的简单流程,当然这里用了libadbd的静态库。

#include "minadbd.h"

#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

#include "adb.h"
#include "adb_auth.h"
#include "transport.h"

int minadbd_main() {
    adb_device_banner = "sideload";

    signal(SIGPIPE, SIG_IGN);

    // We can't require authentication for sideloading. http://b/22025550.
    auth_required = false;

    init_transport_registration();
    usb_init()
<think>我们面临的核心问题:在Recovery模式下启动并启用ADB调试。根据引用[3]和引用[4]提供的信息,Recovery模式下启用ADB需要满足两个条件:1.设置系统属性,使adb服务在Recovery模式下自动启动。2.解决设备授权问题(因为Recovery模式下没有用户界面进行授权确认)。具体步骤:步骤1:修改系统属性(需要root权限或通过刷机方式)-在正常系统下,通过ADB获取root权限(如果设备已root):adbrootadbremount#重新挂载系统分区为可写-编辑系统属性文件`/system/build.prop`,添加以下两行:persist.sys.usb.config=mtp,adbro.adb.secure=0#如果设置为0,则关闭adb授权验证;但注意,这可能有安全风险。或者按照引用[4]的方法,预先写入公钥。或者按照引用[3]的建议,设置`ro.adb.secure=1`的同时,需要预先将电脑的公钥写入设备的`/data/misc/adb/adb_keys`文件(但Recovery模式下可能无法访问/data分区,所以这种方法在Recovery中可能不适用)。引用[3]指出:在Recovery中启用adb需要预设`persist.sys.usb.config=mtp,adb`来默认开启adb服务,并且设置`ro.adb.secure=1`来关闭授权确认?实际上,`ro.adb.secure=1`是开启授权确认,而设置为0才是关闭。但关闭授权确认(即设置为0)会带来安全风险。另一种方法(引用[4])是在Recovery模式下将电脑的adb公钥写入设备的`/data/misc/adb/adb_keys`文件(需要设备在Recovery模式下能挂载/data分区,并且有写权限)。但是,在Recovery模式下,/data分区可能默认没有挂载,或者即使挂载了,也可能因为文件系统加密而无法写入。步骤2:在Recovery模式下挂载必要分区-进入Recovery模式后,通常需要手动挂载/system和/data分区(如果Recovery支持且设备未加密)。-使用Recovery菜单中的“Mount”选项挂载/system和/data。步骤3:在Recovery模式下启动adbd服务-实际上,大多数Recovery已经内置了adbd服务,但默认可能没有启动。我们可以通过Recovery的终端或者通过修改启动脚本(如`/init.rc`或Recovery的初始化脚本)来启动。但是,用户通常无法直接修改Recovery的初始化脚本(除非自定义Recovery)。因此,更实际的做法是:方法A:使用支持ADB的Recovery(如TWRP)-刷入第三方Recovery(如TWRP),它默认支持ADB且不需要授权(或者授权已关闭)。方法B:修改系统属性(在正常系统中)使Recovery模式默认启用ADB-修改`/system/build.prop`文件,添加:persist.service.adb.enable=1persist.sys.usb.config=adbro.adb.secure=0-或者,修改Recovery镜像中的默认设置(需要解包和重新打包Recovery镜像,高级用户操作)。方法C:在Recovery模式下通过终端命令启动ADB(需要Recovery支持)-在Recovery模式下,如果有终端(如TWRP的Advanced->Terminal),可以执行:setproppersist.sys.usb.configadbstartadbd-但是,这依赖于Recovery是否提供了这些命令。根据引用[4]的博客,还有一种思路:在Recovery模式下将电脑的公钥写入设备的`/data/misc/adb/adb_keys`文件(需要Recovery能挂载/data分区且具有写权限)。步骤:1.在Recovery模式下挂载/data分区。2.将电脑的公钥(通常位于`~/.android/adbkey.pub`)写入到设备的`/data/misc/adb/adb_keys`文件中(注意:如果该文件已存在,则追加到文件末尾;如果不存在则创建)。3.重启设备进入Recovery模式,此时adb连接应该被授权。具体命令(在电脑上执行):-首先,确保电脑已经生成adb密钥(如果没有,运行`adbkeygen~/.android/adbkey`)。-然后,将公钥文件推送到设备的临时位置(比如/sdcard/):adbpush~/.android/adbkey.pub/sdcard/-接着,在Recovery模式下进入adbshell(如果Recovery已经启动adb服务,但未授权,则这一步可能不行,所以需要先通过Recovery自带的文件管理功能挂载/data,然后通过终端操作)。实际上,在Recovery模式下,我们可以通过以下步骤(假设Recovery已经启动adb服务,但未授权):1.电脑上执行:adbkill-server2.电脑上执行:adbshell(此时会提示未授权,但我们可以尝试在Recovery的终端里操作)由于在Recovery模式下,我们可能没有adbshell权限(因为未授权),所以更可行的做法是:-在正常系统下,将公钥写入到/data/misc/adb/adb_keys(需要root):adbrootadbremountadbpush~/.android/adbkey.pub/data/misc/adb/adb_keys#注意:如果adb_keys已经存在,则需要追加,而不是覆盖#或者使用追加方式adbshell'cat/sdcard/adbkey.pub>>/data/misc/adb/adb_keys'-然后重启进入Recovery模式,此时电脑连接Recovery的adb应该不需要授权。但是,注意:不同设备的adb_keys位置可能不同,有些设备可能在`/adb_keys`(在根目录)或者`/data/.adb_keys`,具体需要看设备。总结:最可靠的方法还是使用第三方Recovery(如TWRP),它已经解决了ADB授权问题。如果用户希望在原厂Recovery中启用ADB,则需要修改系统属性,并解决授权问题,但原厂Recovery通常不支持这些修改。因此,我们给出两种方案:方案一:使用第三方Recovery(推荐)1.解锁Bootloader。2.刷入TWRPRecovery(或其他支持ADB的Recovery)。3.进入TWRP后,默认ADB已开启,且无需授权(或授权已关闭)。方案二:修改系统以支持原厂Recovery启用ADB(高级,有风险)步骤:1.在正常系统中获取root权限。2.修改`/system/build.prop`,添加:persist.service.adb.enable=1persist.sys.usb.config=adbro.adb.secure=0#关闭授权验证(注意安全风险)3.或者,如果不想关闭授权验证,则需将电脑的公钥写入设备的`/data/misc/adb/adb_keys`(需要root):adbrootadbremountadbpush~/.android/adbkey.pub/sdcard/#先推送到sdcardadbshellsucat/sdcard/adbkey.pub>>/data/misc/adb/adb_keyschmod0600/data/misc/adb/adb_keys#设置权限exitexit4.重启进入Recovery模式(原厂Recovery),此时ADB应该可用且已授权。注意:原厂Recovery可能没有adbd服务,或者即使有也可能因为系统属性设置而无法启动。因此,方案二不一定适用于所有设备。根据引用[3],在Recovery中启用adb需要预设`persist.sys.usb.config=mtp,adb`,并且设置`ro.adb.secure=1`(但这样设置会导致授权问题,因为Recovery中没有确认界面)。所以,如果我们同时设置`ro.adb.secure=0`,则跳过授权。因此,在修改`build.prop`时,最好同时设置:persist.sys.usb.config=mtp,adbro.adb.secure=0但请注意,将`ro.adb.secure=0`会降低设备安全性(在正常系统中也会跳过adb授权)。结论:在Recovery模式下启用ADB调试需要根据设备的具体情况选择方法。推荐使用第三方Recovery(如TWRP)是最简单可靠的方法。操作步骤总结(方案二,修改原厂系统):1.设备正常启动进入系统,并开启USB调试和root权限。2.电脑上执行:adbrootadbremountadbshell"echo'persist.sys.usb.config=mtp,adb'>>/system/build.prop"adbshell"echo'ro.adb.secure=0'>>/system/build.prop"#或者使用编辑器编辑/system/build.prop,确保这两行存在3.重启设备进入Recovery模式(原厂Recovery),此时连接电脑,使用adbdevices应该可以看到设备,并且可以直接使用adbshell。但是,原厂Recovery可能没有包含adbd,因此即使设置了属性,也可能无法启动adb。所以,此方法不保证100%成功。如果设备已经无法进入系统,只能进入Recovery,那么:-如果Recovery是第三方Recovery(如TWRP),则直接连接电脑使用adb即可。-如果是原厂Recovery,且之前没有修改过系统属性,则无法启用ADB(因为原厂Recovery通常不会开启adb服务,即使开启了也需要授权,而授权无法在Recovery界面确认)。因此,对于无法进入系统的设备,如果原厂Recovery不支持ADB,则只能尝试刷入第三方Recovery(通过Fastboot模式):fastbootflashrecoverytwrp.imgfastbootrebootrecovery然后,在TWRP中就可以使用adb了。最后,注意:操作前请备份重要数据,修改系统有风险。引用说明:-引用[3]:说明了在Recovery中启用adb需要设置的属性[^3]。-引用[4]:提供了在Recovery中写入adb公钥的方法[^4]。根据用户的需求,我们提供了多种方法,用户可以根据设备情况选择。相关问题:1.如何刷入第三方Recovery(如TWRP)?2.在修改系统属性时,如何避免系统无法启动?3.如何解决Recovery模式下adb无法识别设备的问题?</think>在Recovery模式下启用ADB调试需要修改系统配置或使用特殊方法,以下是详细步骤和注意事项: ### 🔧 核心原理 1. **Recovery与ADB关系** Recovery模式有自己的独立内核,需单独配置ADB服务。正常系统的ADB设置在Recovery中无效[^3]。 2. **授权问题** Recovery无用户界面,需关闭授权验证(`ro.adb.secure=0`)或预置公钥[^3][^4]。 --- ### ✅ 启用ADB的三种方法 #### 方法1:修改系统属性(需root权限) ```bash # 进入正常系统后操作 adb root # 获取root权限[^1] adb remount # 挂载系统分区为可写[^1] adb shell # 修改build.prop echo "persist.service.adb.enable=1" >> /system/build.prop echo "persist.sys.usb.config=mtp,adb" >> /system/build.prop echo "ro.adb.secure=0" >> /system/build.prop # 关闭授权验证[^3] # 重启进入Recovery reboot recovery ``` #### 方法2:预置ADB公钥(推荐更安全) ```bash # 电脑端生成密钥(若无可跳过) adb keygen ~/.android/adbkey # 推送公钥到设备 adb push ~/.android/adbkey.pub /sdcard/ # 设备内操作(需root) adb shell su mkdir -p /data/misc/adb cat /sdcard/adbkey.pub >> /data/misc/adb/adb_keys chmod 0600 /data/misc/adb/adb_keys # 关键权限设置[^4] ``` #### 方法3:通过Recovery终端启用 1. 进入Recovery的**Advanced → Terminal** 2. 执行命令: ```bash setprop persist.sys.usb.config adb start adbd ``` --- ### ⚠️ 注意事项 1. **分区挂载** 在Recovery中需手动挂载`/system`和`/data`分区(通过"Mount"菜单)。 2. **授权错误处理** 若出现`device unauthorized`: ```bash adb kill-server # 重启ADB服务[^3] adb devices # 重新检测 ``` 3. **Recovery兼容性** 原厂Recovery可能限制ADB功能,推荐刷入[TWRP](https://twrp.me)等第三方Recovery。 > 📌 修改`build.prop`存在风险,操作前建议备份数据。若设备无法启动系统,可通过Fastboot刷入已启用ADB的Recovery镜像: > `fastboot flash recovery twrp_adb_enabled.img` --- ### 🌐 引用说明 - 修改`ro.adb.secure`属性解决授权问题[^3] - 预置公钥实现免授权调试[^4] - `adb remount`获取分区写入权限[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值