android - 如何识别安装应用程序正在使用android中的哪个证书
问题描述
我在向客户推出后更改了发布 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);
}
推荐阅读
- javascript - 对于数字数组,返回某个数字出现的次数
- asp.net - 尽管 Web.config 有效,但 IIS 给出 0x8007000d“格式错误的 XML”
- jupyter-lab - 从 JupyterLab 中的 jupyter_notebook_config.py 设置 --no-browser
- javascript - 强大的拨动开关,如何点击标签?
- c# - 让游戏对象以给定的速度转动并在圆圈上移动
- asp.net-core - 有没有办法在断路器打开时存储请求?
- c - 使用 -fprofile-instr-generate 的 Clang 覆盖映射
- c# - 如何在插入 RichEditBox 的图像中显示调整大小的装饰器?
- javascript - 如何将当前 div 中的信息放入模态窗口?
- perl - 无法连接到...提供的节点名或服务名,或未知