recovery模式下支持ADB连接和串口操作
前言
Android平台下我们有时候会进入recovery下做一些操作,不管是通过ADB连接还是通过串口操作,都需要你的平台支持,不支持的话可以按照我们这篇文章进行修改。
正文
ADB连接
进入recovery后,我通过ADB连接会有如下报错
exec "/system/bin/sh": No such file or directory
1
根据提示,应该是需要把sh打包到recovery.img里面,不过这里要注意的是,recovery下执行的bin文件需要静态编译才行,所以我们需要修改sh编译的Android.bp文件:
diff --git a/external/mksh/Android.bp b/external/mksh/Android.bp
index 2bca561e9d..5fb3c67ad7 100644
--- a/external/mksh/Android.bp
+++ b/external/mksh/Android.bp
@@ -120,6 +120,7 @@ cc_defaults {cc_binary {name: "sh",
+ static_executable: true,defaults: ["sh-defaults"],}
1234567891011
然后将编译出来的sh文件打包到recovery.img里面:
diff --git a/build/make/core/Makefile b/build/make/core/Makefile
index c58eb39839..027a32aee8 100644
--- a/build/make/core/Makefile
+++ b/build/make/core/Makefile
@@ -1398,6 +1398,8 @@ define build-recoveryimage-targetcp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/$(newline))$(hide) $(foreach item,$(recovery_fstab), \cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab)
+ $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/system/bin
+ $(hide) cp -r $(PRODUCT_OUT)/system/bin/sh $(TARGET_RECOVERY_ROOT_OUT)/system/bin$(if $(strip $(recovery_wipe)), \$(hide) cp -f $(recovery_wipe) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.wipe)$(hide) cp $(RECOVERY_INSTALL_OTA_KEYS) $(TARGET_RECOVERY_ROOT_OUT)/res/keys
@@ -1411,9 +1413,7 @@ define build-recoveryimage-target$(hide) ln -sf prop.default $(TARGET_RECOVERY_ROOT_OUT)/default.prop$(BOARD_RECOVERY_IMAGE_PREPARE)$(if $(filter true,$(BOARD_BUILD_SYSTEM_ROOT_IMAGE)), \
- $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/system_root; \
- rm -rf $(TARGET_RECOVERY_ROOT_OUT)/system; \
- ln -sf /system_root/system $(TARGET_RECOVERY_ROOT_OUT)/system) # Mount the system_root_image to /system_root and symlink /system.
+ $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/system_root;)$(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_RECOVERY_ROOT_OUT) | $(MINIGZIP) > $(recovery_ramdisk)$(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)), \$(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1).unsigned, \
123456789101112131415161718192021222324
以上操作后,就能正常ADB连接设备了。
串口操作
想要串口也能操作,也同样需要上面的步骤,除此之外还需要额外的修改,在进入recovery后需要拉起console服务:
diff --git a/device/emdoor/em_t6230_p4mme/init.recovery.mt8167.rc b/device/emdoor/em_t6230_p4mme/init.recovery.mt8167.rc
old mode 100644
new mode 100755
index f8ff23c8de..bb0087a70b
--- a/device/emdoor/em_t6230_p4mme/init.recovery.mt8167.rc
+++ b/device/emdoor/em_t6230_p4mme/init.recovery.mt8167.rc
@@ -14,12 +14,29 @@ on initmkdir /config/usb_gadget/g1/configs/b.1 0777 shell shellmkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shellmkdir /config/usb_gadget/g1/functions/ffs.adb
+
+on post-fs
+ # start console service earlier here
+ start console
+
+on property:ro.debuggable=1
+ start console
+
+service console /system/bin/sh
+ class core
+ console
+ disabled
+ user root
+ group shell log readproc
+ seclabel u:r:shell:s0
+ setenv HOSTNAME consoleon property:ro.debuggable=0# distinguish USB shoulde connect or not, i.e. CDP vs SDPwrite /sys/class/udc/musb-hdrc/device/cmode 2# set charging free due to it wait for USB activationstart adbd
+ start consoleon property:sys.usb.ffs.ready=1write /config/usb_gadget/g1/UDC "none"
123456789101112131415161718192021222324252627282930313233343536
其它
虽然现在我们能ADB连接和串口操作了,但是常用的ls等命令却使用不了,因为recovery下system分区没有挂载,toybox和busybox等工具都没有,自然无法使用shell命令。这次我把toybox工具移植到recovery中,你也可以移植busybox和toolbox。
我们看external/toybox/Android.mk有专门编译给recovery使用的选项:
############################################
# static version to be installed in recovery
############################################include $(CLEAR_VARS)
LOCAL_MODULE := toybox_static
LOCAL_SRC_FILES := $(common_SRC_FILES)
LOCAL_CFLAGS := $(common_CFLAGS)
LOCAL_STATIC_LIBRARIES := $(toybox_libraries)
# libc++_static is needed by static liblog
LOCAL_CXX_STL := libc++_static
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_POST_INSTALL_CMD := $(hide) $(foreach t,$(ALL_TOOLS),ln -sf ${LOCAL_MODULE} $(LOCAL_MODULE_PATH)/$(t);)
include $(BUILD_EXECUTABLE)
123456789101112131415
只要把编译的模块名toybox_static加入到下面的文件就可以了:
diff --git a/system/core/shell_and_utilities/Android.bp b/system/core/shell_and_utilities/Android.bp
index 2e42b70993..ec53e59de6 100644
--- a/system/core/shell_and_utilities/Android.bp
+++ b/system/core/shell_and_utilities/Android.bp
@@ -17,5 +17,6 @@ phony {"toolbox_vendor","toybox","toybox_vendor",
+ "toybox_static",],}
1234567891011
结语
上面说了一大堆,其实最简单的方法只要在recovery启动的rc脚本中把system分区挂载一下就好了(逃~)。
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
嵌入式Linux
微信扫描二维码,关注我的公众号
recovery模式下支持ADB连接和串口操作相关推荐
- HDFS HA模式下支持只连接其中Active的NameNode
HDFS HA模式下支持只连接其中Active的NameNode:
- android返回后屏幕旋转了,Android recovery 模式下屏幕显示旋转
Android recovery 模式下屏幕显示旋转 大家在网上搜索 Android屏幕旋转,成千上万的文章,但是没有几个是写recovery 模式的.难道你们只旋转正常模式下的屏幕方向,不管reco ...
- kali liunx使用心得之命令行模式下如何配置连接无线网络
kali liunx使用心得之命令行模式下如何配置连接无线网络 最近在使用kali时出现了一点小小的问题,由于我安装的是win10和kali双系统,为了能够在kali界面下自由操作win10下的磁盘, ...
- Android recovery 模式下屏幕显示旋转
Android recovery 模式下屏幕显示旋转 大家在网上搜索 Android屏幕旋转,成千上万的文章,但是没有几个是写recovery 模式的.难道你们只旋转正常模式下的屏幕方向,不管reco ...
- 在recovery模式下命令控制手机_安卓手机开机密码忘记,解锁教程
第一种方法:用别人的手机打你的电话, 然后手机就会进入系统,再进设置里去掉自动锁屏.当提示输入gmail密码的时候填写:"null"(补充说明,适用部分机子,跟ROM关系也很大,成 ...
- Windows下解决adb连接不上的终极解决方案
这几天突然从Mac系统换到Windows系统做Android开发,最头疼的是adb总是连接不上或是5037端口被占用,随后尝试关闭各种第三方的adb连接软件,还是有问题,无奈,转变一下思路,修改adb ...
- Android创建文件为unix格式,Recovery模式下/cache/recovery/目录下创建文件,开机后文件被删除...
在一次需求的实现过程中需要在remcovery模式下,在/cache/recovery/目录下创建一个日志文件用于记录相关的日志信息,以便于在开机后读取这些日志信息,再根据日志信息做出相应的处理,但是 ...
- console linux 分辨率,让Console模式下支持宽屏分辨率!
玩Linux的途中,大家或多或少都会在控制台(Console)模式下进行工作.控制台对于大多数最终用户来说,用的已是越来越少了.但是学会在控制台模式下工作,还是能解决很多的问题. 以前一直以为控制台模 ...
- Android Mediatek 增加Recovery模式下读cmdline的强制工厂重置选项
目录 修改的文件: 文件修改说明: 1. recovery.cpp 2. mt_boot.c 3. platform.c 4. codegen.dws 这个修改主要是在多个文件中增加了一个选项,当设备 ...
最新文章
- 深圳某女孩身家上千万,却称自己不配追求大厂程序员
- 陈道明还原度最高!AI 脑补宋明清皇帝长相,四大模型构想真实五官
- java元婴期(24)----java进阶(mybatis(3)---动态sql(重点))
- 确定最佳聚类数matlab代码_详解DBSCAN聚类
- k8s中流量分离以及资源隔离实战
- python读取文件乱码
- 解决百度ueditor插入动态地图空白 支持iframe方法
- 2017年5月13日 恒生电子笔试题
- XML Notepad 2007 汉化版发布
- 读书笔记之《史记》读后感心得体会
- 高度的思想境界的几个特征
- 【黑金原创教程】【Modelsim】【第五章】仿真就是人生
- 【BLENDER】-渲染 背景设置
- Win10家庭版没有权限访问网上邻居,不能连接共享打印机的解决办法
- [软考]协议VS合同
- hive学习笔记-数据操作
- 2020最新的web前端体系和路线图,想学web前端又不知道从哪开始的快来瞧一瞧呀
- SQL数据库可疑恢复 挂起恢复 置疑恢复 SQL数据库无法附加修复 附加报错 9003
- 机器学习:回归分析——基于线性回归的股票预测
- CKA考试笔记,仅做个人学习使用
热门文章
- C# OLE DB 的连接方式下 对 sql 参数的操作 需要改成 ? 号
- ibator1.2.2
- 微博平台StatusNet研究(4):快速安装
- python 学习笔记一
- [转载]VirtualBox网络配置详解
- Spring全家桶面试真题
- 荣耀magic3会用鸿蒙,赵明:荣耀Magic3芯片领先行业,大家看到以后会换掉手机!...
- 深度学习目标检测之 YOLO v4
- python网络攻击代码_Python-python网络编程写arp攻击代码
- 单例设计模式-懒汉式(线程不安全)