Android INJECT_EVENTS权限
我试图创build一个应用程序,将有一个服务在后台运行,将能够注入触摸屏事件到任何活动正在运行。 我可以通过调用Instrumentation.sendPointerSync(motionEvent);
将事件注入到作为应用程序一部分的Activity中Instrumentation.sendPointerSync(motionEvent);
但是,如果我尝试从我的应用程序运行没有活动,我得到一个权限错误,说我没有INJECT_EVENTS权限。 我已经将这个权限添加到我的清单中,如下所示: <uses-permission android:name="android.permission.INJECT_EVENTS"></uses-permission>
它仍然抛出相同的权限exception。 经过一番search后,我已经得到了答案,为了获得INJECT_EVENTS权限,你的应用程序必须由系统签名的相同签名来签名。 然而,我不清楚这究竟是什么意思。 我将不得不find一个自定义的ROM构build它,并签署与应用程序签署相同的签名。 然后在我的设备上安装自定义ROM,然后安装我的应用程序,我将能够正确注入触摸事件? 如果是这样的话,我最好从一个已经放在一起的自定义ROM开始,就像这个页面中的一个一样,或者是我需要抓住一个Android项目的git副本,并构build整个事情myslef? 无论哪种方式,任何人都知道一个地方,你可以指向我,这将使我朝着正确的方向工作,使之发生?
实际上,这在根植设备上非常简单。 我认为任何运行/系统的应用程序都可以访问它所需的任何权限。 因此,只需手动将你的应用程序安装到/ system(如http://androidforums.com/droid-all-things-root/64603-installing-apk-system-app-directory.html所述; ):
在terminal仿真程序中执行以下命令,将/ 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 Marketplace的根资源pipe理器来简化这个过程。
或者,请检查: 如何使用系统权限编译Android应用程序
要将事件注入单独的进程,需要将您的应用程序安装到/ system / app中, 并使用系统证书对APK进行签名 。
1.为应用程序清单添加权限
<uses-permission android:name="android.permission.INJECT_EVENTS"/>
2.使用系统证书在APK上签名
这就要求你有AOSP源代码来build立一个keystore,这个keystore用于build立在电话上运行的系统。
鉴于你有一个AOSP目录,@Eli做一个很好的工作,展示如何使用一个很好的脚本'keytool-importkeypair'来构build密钥库,
以IntelliJ为例,从Build菜单中selectGenerate Signed APK .. find上面创build的密钥库,键入给定的密码(例如,android),如果需要的话给密钥相同的密码。 请注意,已签名的apk将写入项目根目录(!)而不是典型位置(./out/production//)。
3.安装到/ system / app /
adb root adb remount adb push MyApp.apk /system/app
“安装”自动发生。 但是,请注意,与正常的应用程序安装过程不同,APK中的任何本地库都不会复制到/ system / lib /中。 如果您正在使用NDK构build并调用您自己的本地库,则需要手动执行此操作。
使用触摸事件:
- 使用与签名相同的签名来签署应用程序
- 下载keytool-importkeypair来做到这一点
- 查找platform.pk8 + platform.x509.pem:{Android Source} / build / target / product / security
-
然后生成一个证书:
./keytool-importkeypair -k google_certificate.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform
-
现在从Eclipse导出您的应用程序,并使用您生成的新证书进行签名
- build立ROM,闪到设备,安装应用程序
从API 18开始,有UiAutomation类,它不绑定到用户权限。
有关更多信息,请参阅http://developer.android.com/reference/android/app/Instrumentation.html#getUiAutomation();
如果有人正在寻找一种解决scheme绕过这个签名级别的权限,并希望创build触摸事件。
我将源代码放到C ++级别,实际上检查是否允许应用程序创build触摸事件。 以下是实际检查应用程序是否被允许的function:
bool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) { return injectorUid == 0 || mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid); }
所以该函数返回true的应用程序的用户ID设置为0。
现在我通过编辑filee /data/system/packages.xml
将我的应用程序更改为0。 这个文件包含分配给每个应用程序的uid。 通过将与您的应用程序相对应的userId
属性设置为0来编辑此文件。
现在,您只需强制closures应用程序并重新启动。 您将能够绕过INJECT_EVENTS
权限。
好的,我终于明白了。 相信我,当我这样说的时候,这可能是最糟糕的解决scheme,如果你可以称之为的话。 这需要root权限,并且将在系统范围内禁用所有软件包的签名validation。 这可能会使您暴露在危险的应用程序replace正常的一堆攻击。
无论如何,在这里,我们走:
- 安装Xposed
- 为Xposed安装XInstaller模块
- 在XInstaller选项中,进入名为“安装”的菜单并选中“检查签名”和“validation应用程序”
重启后你应该很好。 你的应用程序甚至不需要作为系统安装,现在可以在用户空间中运行,因为你不需要复制到/系统/应用程序