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连接和串口操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于JQUERY的WEB在线流程图设计器
- 下一篇: 你应该知道的,十二大CNN算法