前言

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连接和串口操作相关推荐

  1. HDFS HA模式下支持只连接其中Active的NameNode

    HDFS HA模式下支持只连接其中Active的NameNode:

  2. android返回后屏幕旋转了,Android recovery 模式下屏幕显示旋转

    Android recovery 模式下屏幕显示旋转 大家在网上搜索 Android屏幕旋转,成千上万的文章,但是没有几个是写recovery 模式的.难道你们只旋转正常模式下的屏幕方向,不管reco ...

  3. kali liunx使用心得之命令行模式下如何配置连接无线网络

    kali liunx使用心得之命令行模式下如何配置连接无线网络 最近在使用kali时出现了一点小小的问题,由于我安装的是win10和kali双系统,为了能够在kali界面下自由操作win10下的磁盘, ...

  4. Android recovery 模式下屏幕显示旋转

    Android recovery 模式下屏幕显示旋转 大家在网上搜索 Android屏幕旋转,成千上万的文章,但是没有几个是写recovery 模式的.难道你们只旋转正常模式下的屏幕方向,不管reco ...

  5. 在recovery模式下命令控制手机_安卓手机开机密码忘记,解锁教程

    第一种方法:用别人的手机打你的电话, 然后手机就会进入系统,再进设置里去掉自动锁屏.当提示输入gmail密码的时候填写:"null"(补充说明,适用部分机子,跟ROM关系也很大,成 ...

  6. Windows下解决adb连接不上的终极解决方案

    这几天突然从Mac系统换到Windows系统做Android开发,最头疼的是adb总是连接不上或是5037端口被占用,随后尝试关闭各种第三方的adb连接软件,还是有问题,无奈,转变一下思路,修改adb ...

  7. Android创建文件为unix格式,Recovery模式下/cache/recovery/目录下创建文件,开机后文件被删除...

    在一次需求的实现过程中需要在remcovery模式下,在/cache/recovery/目录下创建一个日志文件用于记录相关的日志信息,以便于在开机后读取这些日志信息,再根据日志信息做出相应的处理,但是 ...

  8. console linux 分辨率,让Console模式下支持宽屏分辨率!

    玩Linux的途中,大家或多或少都会在控制台(Console)模式下进行工作.控制台对于大多数最终用户来说,用的已是越来越少了.但是学会在控制台模式下工作,还是能解决很多的问题. 以前一直以为控制台模 ...

  9. Android Mediatek 增加Recovery模式下读cmdline的强制工厂重置选项

    目录 修改的文件: 文件修改说明: 1. recovery.cpp 2. mt_boot.c 3. platform.c 4. codegen.dws 这个修改主要是在多个文件中增加了一个选项,当设备 ...

最新文章

  1. 深圳某女孩身家上千万,却称自己不配追求大厂程序员
  2. 陈道明还原度最高!AI 脑补宋明清皇帝长相,四大模型构想真实五官
  3. java元婴期(24)----java进阶(mybatis(3)---动态sql(重点))
  4. 确定最佳聚类数matlab代码_详解DBSCAN聚类
  5. k8s中流量分离以及资源隔离实战
  6. python读取文件乱码
  7. 解决百度ueditor插入动态地图空白 支持iframe方法
  8. 2017年5月13日 恒生电子笔试题
  9. XML Notepad 2007 汉化版发布
  10. 读书笔记之《史记》读后感心得体会
  11. 高度的思想境界的几个特征
  12. 【黑金原创教程】【Modelsim】【第五章】仿真就是人生
  13. 【BLENDER】-渲染 背景设置
  14. Win10家庭版没有权限访问网上邻居,不能连接共享打印机的解决办法
  15. [软考]协议VS合同
  16. hive学习笔记-数据操作
  17. 2020最新的web前端体系和路线图,想学web前端又不知道从哪开始的快来瞧一瞧呀
  18. SQL数据库可疑恢复 挂起恢复 置疑恢复 SQL数据库无法附加修复 附加报错 9003
  19. 机器学习:回归分析——基于线性回归的股票预测
  20. CKA考试笔记,仅做个人学习使用

热门文章

  1. C# OLE DB 的连接方式下 对 sql 参数的操作 需要改成 ? 号
  2. ibator1.2.2
  3. 微博平台StatusNet研究(4):快速安装
  4. python 学习笔记一
  5. [转载]VirtualBox网络配置详解
  6. Spring全家桶面试真题
  7. 荣耀magic3会用鸿蒙,赵明:荣耀Magic3芯片领先行业,大家看到以后会换掉手机!...
  8. 深度学习目标检测之 YOLO v4
  9. python网络攻击代码_Python-python网络编程写arp攻击代码
  10. 单例设计模式-懒汉式(线程不安全)