Android recovery.img 支持adb shell
android recovery 模式下出于安全的考虑,一般禁止adb 和adb shell 登陆。如果需要在recovery 模式下debug ,会带来很大的不方便。
首先配置recovery 模式下adb 启动。检查 out/*/recovery/root/sbin 目录下是否有adbd 文件。然后检查init.rc 中是否有adb 配置:
recovery 是否开启adb:
此处)折叠或打开
1. 96 service adbd /sbin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery
2. 97 disabled
3. 98 socket adbd stream 660 system system
4. 99 seclabel u:r:adbd:s0
5. 100
6. 101 # Always start adbd on userdebug and eng builds
7. 102 on property:ro.debuggable=1
8.
9. 104 write /sys/class/android_usb/android0/enable 1
10. 105 start adbd
11. 106
12. 107 # Restart adbd so it can run as root
13. 108 on property:service.adb.root=1
14. 109 write /sys/class/android_usb/android0/enable 0
15. 110 restart adbd
16. 111 write /sys/class/android_usb/android0/enable 1
在init.rc 中adbd 是配置的, disabled 表示但是开机不启动,下面的 ro.debuggable 会被置为1,那么adb 就会开启。所以编译eng 版本或者userdebug 版本,ro.debuggable 就会值1 adb 就会启动。
刷完eng 版本的recovery.img 进入recovery 模式,adb shell ,却提示 exec '/system/bin/sh' failed: No such file or directory (2) - 。没有sh. 无法进入shell. 检查ramdisk 文件系统 system 目录为空。没有sh 文件,无法进入控制台。检查boot.img 启动的init.rc 文件发现:
此处)折叠或打开
1. service console /system/bin/sh
2. 493 class core
3. 494 console
4. 495 disabled
5. 496 user shell
6. 497 group shell log
7. 498 seclabel u:r:shell:s0
8. 499
9. 500 on property:ro.debuggable=1
10. 501 start console
11. 502
12. 503 # adbd is controlled via property triggers in init..usb.rc
13. 504 service adbd /sbin/adbd --root_seclabel=u:r:su:s0
14. 505 class core
15. 506 socket adbd stream 660 system system
16. 507 disabled
17. 508 seclabel u:r:adbd:s0
开启控制台:
- service console /system/bin/sh
因此,在recovery 的init.rc 中添加配置:
此处)折叠或打开
1. +service console /system/bin/sh
2. + console
3. + disabled
4. + user shell
5. + group shell log
6. + seclabel u:r:shell:s0
7. +
8. service recovery /sbin/recovery
9. seclabel u:r:recovery:s0
10.
11. @@ -93,6 +100,7 @@ service adbd /sbin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery
12.
13. # Always start adbd on userdebug and eng builds
14. on property:ro.debuggable=1
15. + start console
16. write /sys/class/android_usb/android0/enable 1
17. start adbd
这样在recovery 下开启了console ,把system 下的sh 文件放到文件系统的system/bin/ 目录下,重新制作recovery. 烧机后adb shell ,无反应。在recovery模式下,二进制文件都是静态连接方式,检查sh 连接的动态库:
$ arm-linux-android-objdump -x ystem/bin/sh | grep NEEDED NEEDED
libc.so
需要动态连接libc.修改Android.mk 静态连接libc 。sh 代码在external/mksh,或者使用busybox sh, busybox 太大,这里用mksh.
此处)折叠或打开
1. diff --git a/Android.mk b/Android.mk
2. index 9989f67..5042734 100644
3. --- a/Android.mk
4. +++ b/Android.mk
5. @@ -28,7 +28,9 @@ LOCAL_SRC_FILES:= src/lalloc.c src/edit.c src/eval.c src/exec.c \
6. src/lex.c src/main.c src/misc.c src/shf.c \
7. src/syn.c src/tree.c src/var.c
8.
9. -LOCAL_SYSTEM_SHARED_LIBRARIES:= libc
10. +#LOCAL_SYSTEM_SHARED_LIBRARIES:= libc
11. +LOCAL_STATIC_LIBRARIES := libc
12. +LOCAL_FORCE_STATIC_EXECUTABLE := true
重新编译,烧机,adb shell 终于可以了。
总结一下,recovery 下要支持adb shell:
1. 开启adb 支持。
2. 开启console 控制台支持。
3. sh 文件正确。
android recovery 模式下出于安全的考虑,一般禁止adb 和adb shell 登陆。如果需要在recovery 模式下debug ,会带来很大的不方便。
首先配置recovery 模式下adb 启动。检查 out/*/recovery/root/sbin 目录下是否有adbd 文件。然后检查init.rc 中是否有adb 配置:
recovery 是否开启adb:
此处)折叠或打开
1. 96 service adbd /sbin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery
2. 97 disabled
3. 98 socket adbd stream 660 system system
4. 99 seclabel u:r:adbd:s0
5. 100
6. 101 # Always start adbd on userdebug and eng builds
7. 102 on property:ro.debuggable=1
8.
9. 104 write /sys/class/android_usb/android0/enable 1
10. 105 start adbd
11. 106
12. 107 # Restart adbd so it can run as root
13. 108 on property:service.adb.root=1
14. 109 write /sys/class/android_usb/android0/enable 0
15. 110 restart adbd
16. 111 write /sys/class/android_usb/android0/enable 1
在init.rc 中adbd 是配置的, disabled 表示但是开机不启动,下面的 ro.debuggable 会被置为1,那么adb 就会开启。所以编译eng 版本或者userdebug 版本,ro.debuggable 就会值1 adb 就会启动。
刷完eng 版本的recovery.img 进入recovery 模式,adb shell ,却提示 exec '/system/bin/sh' failed: No such file or directory (2) - 。没有sh. 无法进入shell. 检查ramdisk 文件系统 system 目录为空。没有sh 文件,无法进入控制台。检查boot.img 启动的init.rc 文件发现:
此处)折叠或打开
1. service console /system/bin/sh
2. 493 class core
3. 494 console
4. 495 disabled
5. 496 user shell
6. 497 group shell log
7. 498 seclabel u:r:shell:s0
8. 499
9. 500 on property:ro.debuggable=1
10. 501 start console
11. 502
12. 503 # adbd is controlled via property triggers in init..usb.rc
13. 504 service adbd /sbin/adbd --root_seclabel=u:r:su:s0
14. 505 class core
15. 506 socket adbd stream 660 system system
16. 507 disabled
17. 508 seclabel u:r:adbd:s0
开启控制台:
- service console /system/bin/sh
因此,在recovery 的init.rc 中添加配置:
此处)折叠或打开
1. +service console /system/bin/sh
2. + console
3. + disabled
4. + user shell
5. + group shell log
6. + seclabel u:r:shell:s0
7. +
8. service recovery /sbin/recovery
9. seclabel u:r:recovery:s0
10.
11. @@ -93,6 +100,7 @@ service adbd /sbin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery
12.
13. # Always start adbd on userdebug and eng builds
14. on property:ro.debuggable=1
15. + start console
16. write /sys/class/android_usb/android0/enable 1
17. start adbd
这样在recovery 下开启了console ,把system 下的sh 文件放到文件系统的system/bin/ 目录下,重新制作recovery. 烧机后adb shell ,无反应。在recovery模式下,二进制文件都是静态连接方式,检查sh 连接的动态库:
$ arm-linux-android-objdump -x ystem/bin/sh | grep NEEDED NEEDED
libc.so
需要动态连接libc.修改Android.mk 静态连接libc 。sh 代码在external/mksh,或者使用busybox sh, busybox 太大,这里用mksh.
此处)折叠或打开
1. diff --git a/Android.mk b/Android.mk
2. index 9989f67..5042734 100644
3. --- a/Android.mk
4. +++ b/Android.mk
5. @@ -28,7 +28,9 @@ LOCAL_SRC_FILES:= src/lalloc.c src/edit.c src/eval.c src/exec.c \
6. src/lex.c src/main.c src/misc.c src/shf.c \
7. src/syn.c src/tree.c src/var.c
8.
9. -LOCAL_SYSTEM_SHARED_LIBRARIES:= libc
10. +#LOCAL_SYSTEM_SHARED_LIBRARIES:= libc
11. +LOCAL_STATIC_LIBRARIES := libc
12. +LOCAL_FORCE_STATIC_EXECUTABLE := true
重新编译,烧机,adb shell 终于可以了。
总结一下,recovery 下要支持adb shell:
1. 开启adb 支持。
2. 开启console 控制台支持。
3. sh 文件正确。