web-dev-qa-db-fra.com

Comment obtenir la signature de signature APK?

Existe-t-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 magasin de clés. Comment puis-je le récupérer par programme?

58
Waypoint

Vous pouvez accéder à la signature de signature de l'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());
}

Je l'ai utilisé pour comparer avec le code de hachage de ma clé de débogage, comme moyen d'identifier si l'APK est un APK de débogage ou un APK de version.

62
Ollie C

Le gestionnaire de packages vous donnera le certificat de signature pour tout package installé. Vous pouvez ensuite imprimer les détails de la clé de signature, par ex.

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

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

Voici ma solution .

Comme ce code le dit, vous pouvez obtenir la signature d'une apk installée.

détails:

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

Deuxièmement: obtenez le hashCode releaseApk à comparer. Dans mon cas, j'ai téléchargé cette apk depuis mon serveur et l'ai mise dans la sd_card.

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, cela fonctionne très bien. Si le hashCode est différent, vous devez simplement désinstaller l'ancien apk ou s'il s'agit d'une application système et que le périphérique est enraciné, vous pouvez simplement utiliser le runtime pour le supprimer , puis installez le nouvel apk de signature.

4
Shengfeng Li