问题描述
在有些情况下,向客户推出后我更改了发行apk签名证书。现在,我想使用其他证书发送更新,但是已安装的应用程序已使用先前的证书签名,因此由于签名不匹配,自动更新无法正常工作。
我现在打算使用另一个应用程序来先卸载已安装的应用程序,然后再使用此帮助程序下载并重新安装它。问题是我不想使用versionCode等来确定应卸载较旧应用程序的哪个版本,然后再安装回去。 是否有可能找到任何软件包的证书信息并跟踪它是使用较旧的证书签名的,因此应首先删除等?
假设使用此签名对旧版应用进行了签名:
release {
storeFile file("../myapp-release.keystore")
storePassword "12345"
keyAlias "track-release"
keyPassword "12345"
}
现在目标应用程序正在使用此签名来构建发行版APK:
release_new_devices {
storeFile file("../myapp-release.keystore")
storePassword "12345"
keyAlias "track2-release"
keyPassword "12345"
}
是否可以找到此已安装应用程序的keyAlias并可以识别它?
解决方法
我找到了一种比较签名的方法。首先,需要使用以下命令从旧版APK中获取SHA1值:
keytool -printcert -jarfile myapp.apk
现在,从代码中使用以下方法比较签名。
private static final String APP_SIGNATURE = "12fcR123+k8Yl0V3Ussd2CBpgT43=";
PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(
Your_PACKAGE_NAME,PackageManager.GET_SIGNATURES);
//note sample just checks the first signature
for (Signature signature : packageInfo.signatures) {
// SHA1 the signature
String sha1 = getSHA1(signature.toByteArray());
// check is matches hardcoded value
boolean isMatch = APP_SIGNATURE.equals(sha1);
Log.i(TAG,"SIGnature: " + isMatch +" of sha1: "+sha1);
}