我正在尝试创建一个应用程序,该应用程序将在后台运行一个能够将触摸屏事件注入任何正在运行的活动的服务。我可以通过调用Instrumentation.sendPointerSync(motionEvent);
将事件注入到我的应用程序中的Activity中。但是,如果我尝试在没有运行应用程序的活动的情况下执行此操作,则会收到权限错误,说我没有INJECT_EVENTS允许。我已将此权限添加到我的清单中,如下所示:<uses-permission android:name="android.permission.INJECT_EVENTS"></uses-permission>
它仍然会抛出相同的权限异常。经过一些搜索,我得到了答案,为了获得INJECT_EVENTS权限,您的应用必须使用与系统签名相同的签名进行签名。但我不清楚这究竟是什么意思。我将不得不找到一个自定义rom构建它并使用与该应用程序签名相同的签名对其进行签名。然后在我的设备上安装自定义ROM,然后安装我的应用程序,我将能够正确地注入触摸事件?如果是这种情况,我最好从已经放在一起的自定义rom开始,比如一个from this page或者是否需要获取android项目的git副本并构建整件事myslef?无论哪种方式,任何人都知道你可以指出我可以让我朝着正确的方向努力实现这一目标的地方吗?
答案 0 :(得分:18)
要将事件注入单独的流程,需要将您的应用安装到/ system / app ,然后在上签名系统证书。
<uses-permission android:name="android.permission.INJECT_EVENTS"/>
这要求您拥有AOSP源,以便使用用于构建手机上运行的系统的Google密钥构建密钥库。
鉴于你有一个AOSP目录,@ Eli非常出色地展示了如何使用一个名为'keytool-importkeypair'的漂亮脚本来构建密钥库
以IntelliJ为例,从Build菜单中选择Generate Signed APK ..找到上面创建的密钥库,输入给定的密码(例如,android),如果需要,给密钥提供相同的密码。请注意,已签名的apk将写入项目根目录(!)而不是典型位置(./out/production //)。
adb root
adb remount
adb push MyApp.apk /system/app
'安装'会自动发生。但请注意,与普通应用安装过程不同,APK中的任何本机库都不复制到/ system / lib /中。如果您使用NDK构建并调用自己的本机库,则需要手动执行此操作。
答案 1 :(得分:12)
实际上,这在root设备上非常简单。我认为任何正在运行的应用程序/系统都可以访问它所需的任何权限。因此,只需手动将您的应用程序安装到/ system(如此处所述http://androidforums.com/droid-all-things-root/64603-installing-apk-system-app-directory.html):
在终端仿真器中执行以下命令,将/ system目录重新安装为读/写,并将应用程序安装到SDCARD的/ system / app目录中:
su
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
cp /sdcard/APP.apk /system/app
如果您更喜欢在计算机上使用adb,请执行以下命令:
adb remount
adb shell cp /sdcard/APP.apk /system/app
一些用户已经使用Google市场上的root explorer来简化此过程。
或者,请查看:How to compile Android Application with system permissions
答案 2 :(得分:8)
使用触摸事件:
然后生成证书:
./keytool-importkeypair -k google_certificate.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform
现在从Eclipse导出您的应用并使用您生成的新证书进行签名
答案 3 :(得分:6)
从API 18开始,有UiAutomation类,它没有绑定到用户权限。
有关详细信息,请参阅http://developer.android.com/reference/android/app/Instrumentation.html#getUiAutomation()
答案 4 :(得分:4)
如果有人正在寻找绕过此签名级别权限并希望创建触摸事件的解决方案。
我查看了C ++级别的源代码,实际检查是否允许应用程序创建触摸事件。以下是实际检查应该是否允许应用程序的功能:
bool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) {
return injectorUid == 0
|| mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid);
}
因此该函数返回true,应用程序的用户ID设置为0。
现在我通过编辑文件/data/system/packages.xml
将我的应用程序的uid更改为0。此文件包含分配给每个应用程序的uid。通过将与您的应用对应的userId
属性设置为0来编辑此文件。
现在您只需要强制关闭应用并重新启动即可。您将可以绕过INJECT_EVENTS
权限。
答案 5 :(得分:1)
我以前也遇到过同样的问题,下面是我通过KEY_INJECT_EVENT_PERMISSION
问题来解决的问题。
第1步:您需要获取Device ROM的签名(对我来说,文件名为signapk)。
步骤2:然后,您需要获取platform.pk8和platform.x509.pem文件。
第3步:生成应用程序的调试apk。
第4步:将上述所有文件放在一个文件夹中。
第5步:获得所有上述文件后,请运行下面提到的命令。
java -jar signapk.jar platform.x509.pem platform.pk8 your_debug_app.apk customname.apk
第6步:此后,您可以在同一文件夹中获得一个签名的apk(customname.apk)。一旦获得,请运行以下命令。
adb install -r app-release-signed.apk
步骤7:现在将启用Inject_Event_Permisson
。
请参阅以下链接:
https://steveandro.blogspot.com/2019/09/key-injection-android.html
答案 6 :(得分:0)
如果您使用的是实体三星设备,在设备设置中将导航类型从滑动手势更改为按钮似乎可以解决此问题。
答案 7 :(得分:-1)
好吧,我终于得到了这个。相信我,当我说这个,这可能是最糟糕的解决方案,如果你甚至可以称之为。这需要root, 将禁用系统范围内所有软件包的签名验证。这可能会让您面临一系列攻击,其中危险的应用程序取代了正常的应用程序。
无论如何,在这里,我们走了:
重启后你应该好好去。您的应用程序甚至不需要作为系统安装,它现在可以在用户空间中运行,我认为这使得开发更容易,因为您不再需要复制到/ system / app