如何识别安装应用程序正在使用 android 中的哪个证书

How to identify install application is using which certificate in 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);
            }