Android 8.0以后系统发出来的大部分隐性广播,非系统级APP,都无法接收到,例如android.intent.action.BOOT_COMPLETED
。这时候如果有rom的系统级APP的签名文件,就可以将APP提升为系统级权限来解决。
第一步:在Manifest中的最外层节点,增加
android:sharedUserId="android.uid.system"
此时如果直接运行,会报错INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,这是因为虽然uid改成系统级了,但是签名还是错误的,与系统签名不一致。
那么UID(userid)都有什么作用呢?
众所周知,Android是基于Linux内核的操作系统,一般理解为User Identifier,UID在Linux中就是用户的ID,表明是哪个用户运行了这个程序,主要用于权限的管理。Linux系统中不同的两个普通用户之间如果没有赋予权限是不能互相访问数据的。
而在Android 中又有所不同,因为Android为单用户系统,这时UID 便被赋予了新的使命——数据共享,为了实现数据共享,Android为每个应用几乎都分配了不同的UID,不像传统的Linux,每个进程的用户相同就为之分配相同的UID,(当然这也就表明了一个问题,android只能是单用户系统,在设计之初就被他们的工程师给阉割了多用户),使之成了数据共享的工具。
第二步:使用platform签名
https://android.googlesource.com/platform/build/+/donut-release/target/product/security/
从这里下载platform签名文件。如果rom改动过,需要使用改动过的。
https://github.com/getfatday/keytool-importkeypair
./keytool-importkeypair -k giftedcat.jks -p 123456 -pk8 platform.pk8 -cert platform.x509.pem -alias key0
giftedcat.jks 是生成签名文件的名称
123456 是签名的密码
key0 是签名的别名
这样变得到了jks签名文件,使用这个签名文件签名出来的app,就是系统级app。
参考文献