Как получить подпись подписи APK?



есть ли способ получить подпись ключа, используемого для подписи APK? Я подписал свой APK своим ключом из моего хранилища ключей. Как я могу получить его программно?

641   3  

3 ответов:

вы можете получить доступ к подписи подписи 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.

менеджер пакетов дадут вам сертификат подписи для любого установленного пакета. Затем вы можете распечатать детали ключа подписи, например,

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();
        }
    }
}

моя ситуация заключается в том, что у меня есть предустановленный apk, который использует неправильный ключ-магазин . Поэтому непосредственно установка даст сбой из-за несогласованной подписи.Мне нужно сначала проверить подпись, чтобы убедиться, что она может быть установлена плавно.

вот мой решение.

как код говорит, Вы можете получить подпись из установленного apk.

детали:

Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];

во-вторых: получить releaseApk хэш-код для сравнения. В в моем случае, я загрузил этот apk с моего сервера и поместил его в sd_card.

Signature releaseSig = context.getPackageManager().getPackageArchiveInfo("/mnt/sdcard/myReleaseApk.apk", PackageManager.GET_SIGNATURES).signatures[0];

наконец, сравните хэш-код.

return sig.hashCode() == releaseSig.hashCode;

Я пробовал выше код, он работает просто отлично. Если хэш-код отличается, Вы должны просто удалить старый apk или если это системное приложение и устройство укоренено, вы можете просто использовать runtime to удалить, а затем установить новую подпись apk.

Comments

    Ничего не найдено.