有没有办法检索用于签署APK的密钥的签名?我用密钥库中的密钥签署了我的APK。如何以编程方式检索它?
发布于 2011-04-07 17:57:48
您可以使用PackageManager类http://developer.android.com/reference/android/content/pm/PackageManager.html像这样访问APK的签名
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的一种方式。
发布于 2013-05-01 01:12:35
包管理器将为您提供任何已安装包的签名证书。然后可以打印出签名密钥的详细信息,例如
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();
}
}
}发布于 2016-07-27 23:18:03
我的情况是我有一个预装的apk,它使用了错误的密钥库。因此直接安装会因为签名不一致而失败,我需要先检查签名,以确保它可以顺利安装。
这是我的解决方案。
正如this code所说,您可以从已安装的apk中获取签名。
详细信息:
Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];其次:获取releaseApk hashCode进行比较。在我的例子中,我从我的服务器上下载了这个apk,并将它放在sd_card中。
Signature releaseSig = context.getPackageManager().getPackageArchiveInfo("/mnt/sdcard/myReleaseApk.apk", PackageManager.GET_SIGNATURES).signatures[0];最后,比较hashCode。
return sig.hashCode() == releaseSig.hashCode;我已经尝试了上面的代码,它工作得很好。如果hashCode是不同的,你应该只是运行旧的uninstall,或者如果它是一个系统应用程序,并且设备是根的,你可以只使用remove it来运行,然后安装新的签名apk。
https://stackoverflow.com/questions/5578871
复制相似问题