背景
我们都知道AndroidManifest.xml配置如下属性
<pre style="margin: 15px 0px; padding: 1em 1.2em; border: 1px solid rgb(204, 204, 204); font-size: 13px; vertical-align: baseline; box-sizing: border-box; word-wrap: normal; white-space: pre; display: block; line-height: 18px; background: rgb(246, 246, 246); border-radius: 3px; font-family: Consolas, Menlo, Monaco, Courier, monospace, monospace; overflow-x: auto; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">android:sharedUserId="android.uid.system"</pre>
直接运行是跑不起来的,我们只有拿到了平台的pk8/x509.pem文件通过如下签名命令:
java -jar signapk.jar platform.x509.pem platform.pk8 old.apk [new].apk
才能获得与android.uid.system相同的权限,才能调用系统api,这种情况会给开发带来很大的困扰,代码调试不方便,影响开发效率。
现在有一种方法将pk8/x509.pem导入到keystore,然后我们运行代码的时候使用keystore进行签名就可以获得与android.uid.system相同的权限,不需要再次进行系统签名
环境准备
以windows为例首先需要下载openssl ,根据自己的 实际情况选择版本
[图片上传失败...(image-3681ed-1552999268535)]
下载后直接安装,安装完成环境变量Path只想到bin目录,如下图:
、[图片上传失败...(image-731f27-1552999268535)]
导入到keystore
第一步
cd到pk8以及x509.pem文件的目录执行如下命令,把platform.pk8生成了.pem 文件:
openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.priv.pem -nocrypt
其中platform.pk8为pk8文件名,platform.priv.pem为.pem 文件文件名可以随意修改,执行成功后,会在目录下生成pem文件如下:[图片上传失败...(image-a12bb7-1552999268535)]
第二步
执行如下命令,生成pkcs12格式的密钥文件,生成platform.pk12文件,最后的android是keystore的alias,这里默认为android_box, platform.pk12是pk12文件名,需要输入两次密码,我们这里默认为android_box
openssl pkcs12 -export -in platform.x509.pem -inkey platform.priv.pem -out platform.pk12 -name android_box
需要输入两次密码,我们这里默认为android_box
[图片上传失败...(image-61a030-1552999268535)]
会在目录下生成pk12文件,如下图:
[图片上传失败...(image-cd3046-1552999268535)]
第三步
执行如下命令生成keystore文件,
keytool -importkeystore -destkeystore platform.keystore -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass android_box -alias android_box
platform.keystore是生成的keystore文件,也可以是jks,-srcstorepass后面的android_box 是keystore的密码,-alias 后面的android_box是keystore的alias,这个需要与第二步中的alias一致,否则报错如下:
[图片上传失败...(image-f5a7b5-1552999268535)]
需要输入第二步中生成pk12的password,否则报错如下图
[图片上传失败...(image-f740be-1552999268535)]
正确输入 密码后,keystore文件生成好了,接下我们在项目中无论是debug还是release都可以获得与android.uid.system相同的权限。