¿Cómo obtener la firma de firma de APK?
¿Existe 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 mediante programación?
Puede acceder a la firma de firma del APK de esta manera usando 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());
}
He usado esto para comparar 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. Luego puede imprimir los detalles de la clave de firma, por ejemplo
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();
}
}
}
Mi situación es que tengo una apk preinstalada que utiliza un almacén de claves incorrecto. Por lo tanto, la instalación directa fallará debido a una firma inconsistente. Primero necesito verificar la firma para asegurarme de que se pueda instalar sin problemas.
Aquí está mi solución .
Como dice este código , puedes obtener la firma desde una apk 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é esta apk de mi servidor y la puse en la tarjeta sd_card.
Signature releaseSig = context.getPackageManager().getPackageArchiveInfo("/mnt/sdcard/myReleaseApk.apk", PackageManager.GET_SIGNATURES).signatures[0];
Finalmente, compare el código hash.
return sig.hashCode() == releaseSig.hashCode;
Probé el código anterior, funciona bien. Si el código hash es diferente, simplemente debe desinstalar la apk anterior o si es una aplicación del sistema y el dispositivo está rooteado, puede usar el tiempo de ejecución para eliminarla y luego instalar la nueva apk de firma.