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

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

Solutions Collecting From Web of "Как получить подпись подписи APK?"

Вы можете получить доступ к подписью подписи 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]; 

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

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

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

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

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