Есть ли способ получить подпись ключа, используемого для подписи APK? Я подписал APK с моим ключом из своего хранилища ключей. Как я могу получить его программно?
Как получить подпись подписи APK?
Ответ 1
Вы можете получить доступ к подписью подписи APK, как это, используя класс PackageManager http://developer.android.com/reference/android/content/pm/PackageManager.html
Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
for (Signature sig : sigs)
{
    Trace.i("MyApp", "Signature hashcode : " + sig.hashCode());
}
Я использовал это для сравнения с хэш-кодом для моего отладочного ключа, чтобы определить, является ли APK отладчиком APK или APK выпуска.
Ответ 2
Менеджер пакетов предоставит вам сертификат подписи для любого установленного пакета. Затем вы можете распечатать детали ключа подписи, например.
final PackageManager packageManager = context.getPackageManager();
final List<PackageInfo> packageList = packageManager.getInstalledPackages(PackageManager.GET_SIGNATURES);
for (PackageInfo p : packageList) {
    final String strName = p.applicationInfo.loadLabel(packageManager).toString();
    final String strVendor = p.packageName;
    sb.append("<br>" + strName + " / " + strVendor + "<br>");
    final Signature[] arrSignatures = p.signatures;
    for (final Signature sig : arrSignatures) {
        /*
        * Get the X.509 certificate.
        */
        final byte[] rawCert = sig.toByteArray();
        InputStream certStream = new ByteArrayInputStream(rawCert);
        try {
            CertificateFactory certFactory = CertificateFactory.getInstance("X509");
            X509Certificate x509Cert = (X509Certificate) certFactory.generateCertificate(certStream);
            sb.append("Certificate subject: " + x509Cert.getSubjectDN() + "<br>");
            sb.append("Certificate issuer: " + x509Cert.getIssuerDN() + "<br>");
            sb.append("Certificate serial number: " + x509Cert.getSerialNumber() + "<br>");
            sb.append("<br>");
        }
        catch (CertificateException e) {
            // e.printStackTrace();
        }
    }
}
		Ответ 3
Моя ситуация в том, что у меня есть предварительно установленный apk, который использует неправильный магазин ключей. Поэтому прямое установление приведет к сбою из-за несогласованной подписи. Мне нужно сначала проверить подпись, чтобы убедиться, что она может быть установлена плавно.
Вот мое решение.
Как этот код говорит, вы можете получить подпись из установленного apk.
детали:
Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];
Во-вторых: сравните hashCode releaseApk. В моем случае я загрузил этот apk с моего сервера и поместил его в sd_card.
Signature releaseSig = context.getPackageManager().getPackageArchiveInfo("/mnt/sdcard/myReleaseApk.apk", PackageManager.GET_SIGNATURES).signatures[0];
Наконец, сравните hashCode.
return sig.hashCode() == releaseSig.hashCode;
Я пробовал код выше, он работает отлично. Если hashCode отличается, вы должны просто удалить старый apk, или если это системное приложение и устройство внедрено, вы можете просто использовать runtime для удалите его, а затем установите новую подпись apk.