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

微信扫描二维码,关注我的公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Get busy living or get busy dying

好久不看大片了,今天花了一些时间仔细看了一遍《肖申克的救赎》,应该是很仔细的看了一遍,这个影片真的震撼心灵,“Get busy living or get busy dying.”(忙着活,还是忙着死)是安迪最重要的一句…

买房这件小事

终于有时间再来讨论这个问题,可能因为在深圳,每次说这个问题时都挺热闹的。— — 为什么想买房?人很奇怪,也很自知,我在上学的时候从来没有过这样大胆的想法。后来突然想买房,一个原因是自己有钱了&#xf…

linux相关命令介绍

1,查看centos版本:cat /etc/redhat-releaseCentOS Linux release 7.3.1611 (Core) 2,在171服务器上登录GREENPLUM数仓:[rootmdw ~]# su - gpadmin ---切换到gpaadmin用户登录[gpadminmdw ~]$ psql -d create_dw_dev --登录POSTGR…

asp.NET自定义服务器控件内部细节系列教程一

如大家要转载,请保留本人的版权:/* *Description:asp.NET自定义服务器控件内部细节系列教程*Auther:崇崇-天真的好蓝 *MSN:chongchong2008msn.com *Dates:2007-05-20*Copyright:ChongChong2008 YiChang HuBei China */关于自定义asp.NET自定义服务器控件文章和源码示…

51单片机——DS18B20

单片机——DS18B20 宗旨:技术的学习是有限的,分享的精神是无限的。 DS18B20——温度传感器,单片机可以通过 1-Wire 和 DS18B20 进行通 信,最终将温度读出。1-Wire 总线的硬件接口很简单,只需要把 18B20 的数据引脚和单…

房价是不是泡沫?

日本买房这件小事记,我在深圳买房继上一篇文章之后,有人说我没有了解中国房地产的历史,就公然写房产的文章。确实,我没有去搜刮很多历史的数据和文章来佐证,也没有引用什么大家之谈,很多都是自己经历的一些…

用Metasploit破解ftp用户名和密码

Metasploit是渗透测试人员在世界各地的资源和工具,比较常用的命令: msfconsole——直接进入 show options——查看 set RHOSTS ip地址/段 use 路径 需要在虚拟机的2003版本下创建FTP服务 将字典密码文件加入到虚拟机的系统里边 命令 ——rz 查看ftp是…

Gulp-静态网页模块化

前言: 在做纯静态页面开发的过程中,难免会遇到一些的尴尬问题。比如:整套代码有50个页面,其中有40个页面顶部和底部模块相同。那么同样的两段代码我们复制了40遍(最难受的方法)。然后,这个问题就…

PWM实现语音播放原理

采用PWM进行播放语音原理1.概述2.声音原理3.DAC产生声音的原理是什么4.PWM又是如何实现的DAC的5.PWM的频率与底噪的关系6.PWM音乐曲目解析7.后续1.概述大多数微控制器上播放音频都是采用DAC进行输出,因为微控制器上都不会去带CODEC编解码芯片,但是DAC不是…

在web.config里注册HttpModule

<add name"随便命名" type"HttpModule命名空间加类名,dll文件名" /> 转载于:https://www.cnblogs.com/tinsuki/archive/2007/09/10/888276.html

51单片机——SPI

单片机——SPI总线 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 UART、 I2C 和 SPI 是单片机系统中最常用的三种通信协议。 1、初步介绍 SPI 是一种高速的、全双工、同步通信总线&#xff0c;标准的 SPI 也仅仅使用 4 个引脚&#xff0c;常用于单片…

CTF 这个看起来有点简单

这个看起来有点简单分值&#xff1a;10 来源&#xff1a; 西普学院难度&#xff1a;易 很明显。过年过节不送礼&#xff0c;送礼就送这个 格式&#xff1a; 解题链接&#xff1a; http://ctf5.shiyanbar.com/8/index.php?id1 解法&#xff1a; 1.手工注入 id1 id1 and 11 id…

操作系统,你搞定了没?

#书籍赠送操作系统一直是比较难学的知识&#xff0c;要学好操作系统的相关内容&#xff0c;需要对硬件、软件、宏观、微观、有非常深刻的理解&#xff0c;而能找到一本讲解比较好的书籍也是非常难得的&#xff0c;恰好&#xff0c;最近有出版社的朋友推荐了这样的一本书籍&…

自学python前戏

为什么需要学python&#xff1f; 一直有这个打算&#xff0c;但总是没有下决心开始。 听说python语言结构简洁优美&#xff0c;功能性强大&#xff0c;可移植性高&#xff0c;各大网站都在用python开发。学习python的想法再一次涌上心头。未来10年到底哪种语言会独领风骚&#…

webcast(利用sharepoint Designer 定制 Office SharePoint Server 2007)学习笔记

讲 师:侯钟雷 微软特约讲师 北京易学育通科技发展有限公司时 间:90 分钟 下载地址:下载地址(需先注册,不过很快)讲座内容&#xff1a;SharePoint Designer是原Frontpage网页工具的演进版本&#xff0c;除了保持了原有强大的功能外&#xff0c;更增加了对SharePoint技术的…

C++ 的几个for 循环,范围for语句

我认为做嵌入式开发也需要学习C开发&#xff0c;可能我们学习的不只是一种编程语言&#xff0c;而是一种编程思想&#xff0c;C相对于C语言来说&#xff0c;会需要更多的想象力&#xff0c;原因就是C的特点太多了。不过&#xff0c;我们可以通过学习C的知识&#xff0c;来掌握面…

51单片机——多功能电子钟

单片机——多功能电子钟 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 实现的功能有&#xff1a;走 时、校时、闹钟、温度、遥控这几个功能。要想实现这几个功能&#xff0c;其中走时所需要的就是时 钟芯片&#xff0c;即 DS1302&#xff1b;时间需要…

用数学运算实现数据无损压缩的算法

用数学运算实现数据无损压缩的算法<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />(An arithmetic On Lossless Data-Compress By Mathematical Operation)王春海1 魏玉冬2&#xff08;[1]河北经贸大学信息技术学院 2河北经贸…

dubbo的监控中心

监控中心实际上就是一个web工程。 是dubbo官方给我们提供的一个war包。 只需要部署在Tomcat中就可以了。 推荐把监控中心与注册中心部署在一台服务器上&#xff0c;这样可以不需要任何配置。 部署完成后直接启动Tomcat就可以使用。 注&#xff1a;tail -f logs/catalina.out即可…

​我敢说,这是最全的常用设计模式汇总

今天&#xff0c;想跟大家聊聊代码能力的提升。想起我刚入行那会&#xff0c;怀抱满腔激情&#xff0c;到处学热门框架&#xff0c;但实际上受限于公司体量和业务逻辑&#xff0c;其实往往用不上&#xff0c;时间久了&#xff0c;不用就忘记了&#xff0c;于是在日复一日的工作…