错误
在使用adb 安装应用的时候,有时候会遇到,这样的错误
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE: Reconciliation failed...: Reconcile failed: Package com.xx.xx.xxx has no signatures that match those in shared user android.uid.system; ignoring!
如果是直接安装apk,在手机上的错误提示为: 共享同一个用户的应用需要使用相同签名,安装包的签名与共享用户的应用签名不一致 这样的失败。
原因
这是因为这个App 在打包的时候,在AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。之所以声明这个属性,开发者是希望将自己开发的APP提升为系统级APP,从而具有系统级APP的功能,比如关闭其他APP的功能
开发者把自己的apk提升为系统级APP,在发布的时候需要使用Android的系统密钥对apk进行签名,使得这个apk只能装在这个Android系统中。 很多开发者定制了安卓系统,在系统中内置了app,这些app和系统绑定,即使把这些app的apk 拷贝出来,也无法安装到其他安卓系统中,因为这个安卓系统的私钥还在开发者手里,而这些apk使用了私钥进行加密,下面给出开发者实现这个的步骤,并给出解决办法
开发者实现步骤
1、清单文件增加属性
android:sharedUserId="android.uid.system"
2、清单文件增加系统权限,比如:
<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"
tools:ignore="ProtectedPermissions">
3、使用Android系统签名,对APP进行签名。
-
1.打未签名的apk安装包。
-
2.获取系统签名文件,platform.pk8和platform.x509.pem。这两个文件在Android系统源码中。路径如下:android/build/target/product/security/
-
3.准备签名工具signapk.jar。这个文件在Android源码中。路径如下:android/prebuilt/sdk/tools/lib/
-
4.将未签名的apk、签名文件、签名工具放在同一路径下。开启终端,cd到该目录,运行以下命令,得到签名apk。
java -jar signapk.jar platform.x509.pm platform.pk8 demo.apk signdemo.apk -
5.运行以下命令,安装签名apk。
adb install D:\xxx.apk
解决办法
- 清除该APK的签名档 使用BANDIZIP软件直接打开该APK,进入META-INF\路径 ,删除该路径下 MANIFEST.MF 以外的所有文件.(Tips: 提前备份APK)执行以上操作后,该APK将无签名档,此时仍然无法安装,安装报错信息如下
adb: failed to install F:\security\Demo.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/********** in manifest does not exist]
此时,需要将此APK正确签名后重新安装, 需要找到机器源码路径 build/target/product/security 下的 platform.pk8 和 platform.x509.pem 两文件. 并将APK 和 signapk.jar 放置在同一路径下,然后进行签名。
如果对方使用的Android系统源码没有修改过,(很多人没有改这两个密钥,虽然定制了Android系统,但是密钥并没有改,还是使用的默认的)那可以直接使用Android的默认pem和pk8 下载地址 android.googlesource.com/platform/bu…
java -jar signapk.jar platform.x509.pem platform.pk8 Demo.apk Demo_Signed.apk