如何获得APK签名签名?

有没有办法检索用于签名APK的密钥的签名? 我用我的密钥库中的密钥签署了我的APK。 我怎样才能以编程方式检索它?

您可以使用PackageManager类访问APK的签名签名,如下所示: 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()); } 

我已经使用这个来比较我的debugging密钥的哈希码,以此来识别APK是debuggingAPK还是发布APK。

软件包pipe理员将为您提供任何已安装软件包的签名证书。 然后您可以打印出签名密钥的详细信息,例如

 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使用错误的键盘存储。 所以直接安装会因签名不一致而失败。我需要首先检查签名,确保可以顺利安装。

这是我的解决scheme

正如这段代码所说,你可以从已安装的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是不同的,你应该只卸载旧的apk,或者如果它是一个系统的应用程序,并设备是根,你可以使用运行时将其删除 ,然后安装新的签名apk。