Comment obtenir la signature D'APK?

Est-il un moyen de récupérer la signature de la clé utilisée pour signer un APK? J'ai signé mon APK avec ma clé de mon keystore. Comment puis-je le récupérer par programmation?

56
demandé sur Yojimbo 2011-04-07 13:27:28

3 réponses

vous pouvez accéder à la signature APK comme ceci en utilisant la classe 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());
}

j'ai utilisé ceci pour comparer avec le hashcode de ma clé de débogage, comme moyen d'identifier si L'APK est une APK de débogage ou une APK de sortie.

61
répondu Ollie C 2011-04-07 09:57:48

le gestionnaire de paquets vous remettra le certificat de signature pour tout paquet installé. Vous pouvez ensuite imprimer les détails de la clé de signature, par exemple

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();
        }
    }
}
25
répondu Yojimbo 2016-11-16 22:44:48

Ma situation est que j'ai un apk pré-installé qui utilisent un mauvais magasin de clés . Ainsi l'installation directe donnera un échec en raison de la signature incohérente.Je dois d'abord vérifier la signature pour m'assurer qu'elle peut être installée en douceur.

voici ma solution .

comme ce code dit, Vous pouvez obtenir la signature d'un apk installé.

détails:

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

Deuxièmement: obtenir le hashcode releaseApk pour comparer. Dans mon cas, j'ai téléchargé cet apk depuis mon serveur, et je l'ai mis dans la carte sd_.

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

enfin,comparez le hashCode.

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

j'ai essayé le code ci-dessus, il fonctionne très bien. Si le hashCode est différent, vous devez juste désinstaller l'ancienne apk ou si c'est une application système et le périphérique est enraciné, vous pouvez juste utiliser runtime pour supprimer , puis installer la nouvelle signature apk.

2
répondu Shengfeng Li 2017-10-20 20:19:00