¿Cómo se obtiene la firma de firmas APK?

¿Hay alguna forma de recuperar la firma de la clave utilizada para firmar un APK? Firmé mi APK con mi clave de mi almacén de claves. ¿Cómo puedo recuperarlo programáticamente?

Puede acceder a la firma de firma de APK de esta manera con la clase 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()); } 

Lo he usado para compararlo con el código hash de mi clave de depuración, como una forma de identificar si el APK es un APK de depuración o un APK de lanzamiento.

El administrador de paquetes le dará el certificado de firma de cualquier paquete instalado. A continuación, puede imprimir los detalles de la clave de firma, por ejemplo

 final PackageManager packageManager = context.getPackageManager(); final List 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("
" + strName + " / " + strVendor + "
"); 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() + "
"); sb.append("Certificate issuer: " + x509Cert.getIssuerDN() + "
"); sb.append("Certificate serial number: " + x509Cert.getSerialNumber() + "
"); sb.append("
"); } catch (CertificateException e) { // e.printStackTrace(); } } }

Mi situación es que tengo una aplicación preinstalada que usa un almacén de claves incorrecto. Entonces la instalación directa dará un error debido a la firma inconsistente. Necesito verificar primero la firma para asegurarme de que pueda instalarse sin problemas.

Aquí está mi solución .

Como dice este código , puede obtener la firma de una aplicación instalada.

detalles:

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

En segundo lugar, obtenga el código hash de releaseApk para comparar. En mi caso, descargué este apk de mi servidor y lo puse en la tarjeta sd.

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

Finalmente, compare el hashCode.

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

He intentado con el código anterior, funciona bien. Si hashCode es diferente, solo debe desinstalar la antigua aplicación o si se trata de una aplicación del sistema y el dispositivo está rooteado, puede usar el tiempo de ejecución para eliminarlo y luego instalar la nueva firma apk.