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é à partir de mon fichier de clés. Comment puis-je le récupérer par programmation?

Vous pouvez accéder à la signature de signature de l’APK à l’aide de 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, afin d’identifier si l’APK est un APK de débogage ou une version APK.

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

 final PackageManager packageManager = context.getPackageManager(); final List packageList = packageManager.getInstalledPackages(PackageManager.GET_SIGNATURES); for (PackageInfo p : packageList) { final Ssortingng strName = p.applicationInfo.loadLabel(packageManager).toSsortingng(); final Ssortingng strVendor = p.packageName; sb.append("
" + strName + " / " + strVendor + "
"); final Signature[] arrSignatures = p.signatures; for (final Signature sig : arrSignatures) { /* * Get the X.509 certificatee. */ 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() + "
"); sb.append("Certificate issuer: " + x509Cert.getIssuerDN() + "
"); sb.append("Certificate serial number: " + x509Cert.getSerialNumber() + "
"); sb.append("
"); } catch (CertificateException e) { // e.printStackTrace(); } } }

Ma situation est que j’ai un apk pré-installé qui utilise un magasin de clés incorrect. Donc, installer directement échouera à cause d’une signature incohérente. Je dois d’abord vérifier la signature pour m’assurer qu’elle peut être installée sans problème.

Voici ma solution

Comme le dit ce code , vous pouvez obtenir la signature d’un fichier apk installé.

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é cet apk de mon serveur et l’ai mis 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, ça marche très bien. Si le hashCode est différent, vous devez simplement désinstaller l’ancien fichier apk ou, s’il s’agit d’une application système et que le périphérique est rooté, vous pouvez simplement utiliser le moteur d’exécution pour le supprimer , puis installer le nouveau fichier apk de signature.