出于安全考虑,安卓禁止开发者进行事件注入。仅有系统级权限的应用才可以进行事件注入。

获得系统级权限的方法有两个:

  1. root手机
  2. 对应用进行签名

root手机

Disclaimer: root会给手机带来极大风险,请责任自负。

Root之后可以给应用执行SU命令,可以实现一些按钮,屏幕滑动等事件的注入。但是想要完全绕开 INJECT_EVENT权限的限制还是需要进行签名。

由于安卓生态的复杂性,root手机的方法多样。最常用的方法是twrp+Magisk方法。

工具准备:

  • Android SDK Platform Tools (https://developer.android.com/studio/releases/platform-tools)
  • TWRP (https://twrp.me/)
  • Magisk (https://forum.xda-developers.com/apps/magisk/official-magisk-v7-universal-systemless-t3473445)

首先确定自己的手机是否支持root,这一点包括确定:

  • TWRP/devices列表是否包括这款手机
  • Magisk是否支持该操作系统(仔细阅读Magisk的论坛帖)
  • 手机是否有OEM锁,且是否可以解锁
  • 设备厂商是否对root有其他限制,例如保修条款等

如果有不确定的地方,仍可以进行root操作,不过设备有可能被损坏。请确定厂商是否有提供factory image 以供恢复之需。例如我用的平台是Pixel 3 XL (crosshatch),谷歌提供了factory image:https://developers.google.com/android/images

root教程:https://www.xda-developers.com/google-pixel-3-unlock-bootloader-root-magisk/

root之后,将应用移到/system/app文件夹下。然后通过adb shell进行权限修改: (https://android.stackexchange.com/questions/180347/installing-apk-as-system-app-directly-with-root)

adb shell
su
mount -o rw,remount /system
chmod 755 /system/app/my-app
chmod -R 644 /system/app/my-app
ls -l /system/app/my-app
ls -l /system/app | grep "my-app"
reboot

重启之后应用会自动安装为系统应用,之后仿照这位老哥 的做法给系统注入用户输入。安卓KeyEvent看官方文档

另外在Android Studio开发时怎么自动部署到/system/app目录,看这里: https://stackoverflow.com/questions/28302833/how-to-install-an-app-in-system-app-while-developing-from-android-studio 迟点我会上传一个自己修改过的版本到gist

对应用进行签名

这部分没有做过,仅说下我的理解

用系统秘钥进行签名后的应用拥有系统级权限,可以绕过所有INJECT_EVENT限制。一般来说,可公开下载 的系统镜像的秘钥不会公开。例如安卓官方镜像的秘钥是找不到的,否则其系统将暴露在极大的安全风险之 中。可能通过内部渠道获得。

另一个方法是从源代码编译自己的安卓系统,因为是自己的操作系统所以不会有安全方面的顾虑。Build的方法 在这里:https://source.android.com/setup/build/requirements

https://android.googlesource.com/platform/build/ 这里有目前最近的安卓源代码,平台秘钥在 target/product/security/platform.x509.pem(证书)和target/product/security/platform.pk8(私钥) 里面。

签名方法:https://stackoverflow.com/questions/3635101/how-to-sign-android-app-with-system-signature