wake-up-neo.com

Wie bekomme ich eine APK-Signatur?

Gibt es eine Möglichkeit, die Signatur des zum Signieren einer APK verwendeten Schlüssels abzurufen? Ich habe meine APK mit meinem Schlüssel aus meinem Schlüsselspeicher signiert. Wie kann ich es programmgesteuert abrufen?

58
Waypoint

Sie können mit der PackageManager-Klasse http://developer.Android.com/reference/Android/content/pm/PackageManager.html auf die Signatur des APK zugreifen

Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
for (Signature sig : sigs)
{
    Trace.i("MyApp", "Signature hashcode : " + sig.hashCode());
}

Ich habe dies verwendet, um mit dem Hashcode für meinen Debug-Schlüssel zu vergleichen und festzustellen, ob es sich bei dem APK um ein Debug-APK oder ein Release-APK handelt.

62
Ollie C

Der Paketmanager gibt Ihnen das Signaturzertifikat für jedes installierte Paket. Sie können dann die Details des Signaturschlüssels ausdrucken, z.

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

Meine Situation ist, dass ich eine vorinstallierte APK habe, die einen falschen Schlüsselspeicher verwendet. Daher schlägt die Direktinstallation aufgrund inkonsistenter Signatur fehl. Ich muss zuerst die Signatur überprüfen, um sicherzustellen, dass sie reibungslos installiert werden kann.

Hier ist meine Lösung .

Wie dieser Code sagt, können Sie die Signatur von einer installierten apk erhalten.

einzelheiten:

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

Zweitens: Holen Sie sich den releaseApk-Hashcode zum Vergleichen. In meinem Fall habe ich diese apk von meinem Server heruntergeladen und in die sd_card gesteckt.

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

Vergleichen Sie abschließend den hashCode.

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

Ich habe den obigen Code ausprobiert, er funktioniert einwandfrei. Wenn der hashCode anders ist, sollten Sie einfach deinstallieren die alte apk oder wenn es eine System-App ist und das Gerät ist gerootet, können Sie einfach die Laufzeit verwenden, um entfernen und dann installiere die neue Signatur apk.

4
Shengfeng Li