基于Termux:Boot的VNC、VPN自启

大类
Env
Util
技术标签
原理研究-Android
环境增强
优先级
Medium
开始日期
Nov 14, 2022
状态
Maintaining
Public
Public
最后更新
Nov 18, 2022

需求

  • 新手机上配置了Termux、Surfboard、droidVNC-ng,除了Termux能用Termux:Boot启动起来,没有一个能自动起来的
    • droidVNC可以自己启动,但是droidVNC没法自动点上各种授权(捕获屏幕、模拟输入)
    • Surfboard就直接人影都不见
  • 但是我的手机是个远程调试机,我肯定不能接受他不能稳定启动
  • 干脆直接用 Termux来把它们全都启动了(
 

方案

总体思路

  • 找到各个app的Activity、Service之类的,然后用am命令启动就可以了

Surfboard自启

Surfboard的很简单,直接把他的VpnService打开就完事了,不需要任何Intent所以直接am start-foreground-service就可以了
#!/data/data/com.termux/files/usr/bin/sh sudo sh -c "PATH=/system/bin am start-foreground-service com.getsurfboard/.ui.service.SurfboardVpn"

droidVNC自启

droidVNC的就复杂的多:
  • droidVNC要求的权限比较敏感,所以需要多次UI确认
    • 控制屏幕需要打开无障碍服务权限
    • 捕获屏幕需要打开PROJECT_MEDIA权限
  • 官方给出了对应的adb命令
    • notion image
  • 从实现上来看:他自带两个Service,MainService和InputService
    • 但是不管怎么开这些service都启动不起来服务
      • 我们直接打开MainService → 黑屏
      • 同时打开MainService和InputService → 黑屏
    • 界面里从来没有同时显示过三个权限全绿,研究是否是权限问题:从官方adb命令入手
      • 第一条命令工作的的很正常
      • 第二条命令有时候能正常,但是刚开机的时候用却不正常
        • 经过调查,发现不正常的时候,无障碍的列表里虽然droidVNC开着,但是显示服务出现错误
  • 仔细研究第二条命令:第二条命令实际上是往enabled_accessibility_services后面append东西
    • 猜测android要在这个settings去变更的时候才去启动对应服务,那我一直put一样的service列表并不能触发
    • 所以将其先设置为null,在设置为我们的InputService
    • 成功
  • 三个全绿之后,手动启动Service仍然黑屏,但是在界面里面启动却可以
    • 直接查看GitHub程序源代码,发现在启动service的intent中需要同时发送act=start
    • 实际上,搞完后才发现作者正在重写这一片
      • notion image
 
#!/data/data/com.termux/files/usr/bin/sh #sudo sh -c 'appops set net.christianbeier.droidvnc_ng PROJECT_MEDIA allow' sudo sh -c 'PATH=/system/bin settings put secure enabled_accessibility_services net.christianbeier.droidvnc_ng/.InputService' sleep 1 sudo sh -c 'PATH=/system/bin settings put secure enabled_accessibility_services null' sleep 1 sudo sh -c 'PATH=/system/bin settings put secure enabled_accessibility_services net.christianbeier.droidvnc_ng/.InputService' sleep 1 #sudo sh -c 'PATH=/system/bin am start net.christianbeier.droidvnc_ng/.MainActivity' #sleep 3 sudo sh -c 'PATH=/system/bin cmd appops set net.christianbeier.droidvnc_ng PROJECT_MEDIA allow' sleep 2 sudo sh -c 'PATH=/system/bin am start-foreground-service -n net.christianbeier.droidvnc_ng/.MainService -a start' #sudo sh -c 'PATH=/system/bin am start-foreground-service net.christianbeier.droidvnc_ng/.InputService' #sudo sh -c 'PATH=/system/bin am start-foreground-service net.christianbeier.droidvnc_ng/.MainService' #sleep 3 #sudo sh -c 'PATH=/system/bin cmd appops set net.christianbeier.droidvnc_ng PROJECT_MEDIA allow'