1.背景
在开发过程中,往往会涉及到APP需要调用系统功能,如修改系统时间,系统关机重启,静默安装升级卸载应用等,这个时候需要给APP增加权限。其中一种方法就是在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="xxxx.xxx.xxxx"
android:sharedUserId="android.uid.system" >
</manifest>
通常,通过sharedUserId 给APK配置UserId之后,拥有相同UserId的多个APK可以配置成运行在同一个进程中。那么把程序的UID配置成android.uid.system,也就是让程序运行在系统进程中,这样就拥有了系统权限。
但是,添加这个权限之后,当前项目就不能通过Run等方法在设备上运行或者Debug了,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key。因此需要给APK进行系统签名。
2.系统签名
- 方法1
1)首先,APP根据自己的.jks签名文件正常打包,生成app_release.apk。
2)然后准备系统的两个签名文件,在Android源码目录
build/target/product/security下。
platform.pk8
platform.x509.pem
再用Android提供的Signapk工具来签名,signapk的源代码是在build/tools/signapk下,用法为signapk platform.x509.pem platform.pk8 input.apk output.apk。
将以上准备的工具放到同一个文件夹下,然后将1)中生成的app-release.apk拷贝到同一个目录下,如下图所示。
其中sigin--app-debug.bat批处理里面的内容如下:
java -jar signapk.jar platform.x509.pem platform.pk8 app_release.apk app_release_sign.apk
pause
3)双击执行sigin--app-debug.bat批处理文件,生成app-release_sign.apk文件。然后将该apk安装到对应设备中即可。
- 方法2
该方法是提前对自己的.jks签名文件进行系统签名,然后APP利用Android Studio打包的时候直接用进行了系统签名的.jks进行打包。生成的app_release.apk就可以直接进行安装,是更快捷的一种方式。
1)首先要准备keytool-importkeypair工具,和签名所需的系统签名文件。
2)还是方法1中的几个文件放到同一个目录下
不同的是,需要将提前生成的.jks放入该目录,然后右键git bash(windows平台下暂时只知道git bash能执行成功)执行./keytool-importkeypair -k app.jks -p yourjkspassword -pk8 platform.pk8 -cert platform.x509.pem -alias youralias,将上述命令中需要修改的地方替换成自己的信息。执行成功后会生成一个新的app.jks覆盖掉旧的app.jks文件,然后Android Studio打包的时候就用这个新的app.jks去打包,打包成功后,安装即可。
\