【技术】【adb】python 脚本在 cmd 控制 adb

由于最近需要写脚本,控制 cmd 执行 adb 指令,但是 Android 环境是 magisk root 的 Android 10,所以直接在 cmd 无法用 adb 执行需要 root 权限的指令(adbd cannot run as root in production builds),试了改 ro.debuggable 和 ro.secure 都不行,于是找到了如下解决方案。实现 __python 脚本在 cmd 执行 adb 那些需要 root 的指令的方法__。

法1 脚本在 cmd 执行 adb 普通指令

如,直接脚本运行 adb shell logcat | grep xxx 会报错 grep,可以借助

1
2
3
import os
adbCmd = 'adb shell "logcat | grep xxx"'
os.popen(adbCmd)

法2 脚本在 cmd 执行 adb root 指令

上述有些指令需要 adb root,但是 adb shell 只能在进入后依靠 su 进入 root,要靠如下指令实现

1
2
3
import os
adbCmd = 'adb shell "su -c am start -n xxx.xx/.xActivity"'
os.popen(adbCmd)

法3 脚本在 cmd 执行多行 adb 指令/进入 adb shell

有时执行一条指令不够

法3.1

通过 && 连接多个 cmd 语句,从而达到执行多行 adb 语句

1
adbCmd = 'adb shell "logcat | grep xxx" && adb shell "su -c am start -n xxx/.xActivity"'

法3.2

靠脚本控制 cmd 进入 adb shell,体验感与直接在 cmd 进入 adb shell 最相似的方案

1
2
3
4
5
6
7
import subprocess
handler = subprocess.Popen("adb shell", stdout = subprocess.PIPE, stdin = subprocess.PIPE)
handler.stdin.write(b"su\n")
handler.stdin.write(b"am start xxx.xx/xActivity")
hanlder.stdin.close()
for output_line in handler.stdout.readlines():
print(output_line)