TL; DR
Este problema ocurre cuando una aplicación intenta volver a declarar un permiso existente, con un mensaje de error INSTALL_FAILED_DUPLICATE_PERMISSION
. Afectó principalmente a las aplicaciones basadas en Adobe AIR (prefijo de paquete con com.air
). La causa principal es la implementación de código diferente en Lollipop 5.0 al verificar la firma de un certificado utilizado para firmar una aplicación. Para la solución, salte a la parte "Solución".
Actualización : Google ha solucionado este problema en Lollipop 5.0.1.
Detalles técnicos
Extractos del rastreador de problemas de Android L Developer Preview que están vinculados desde una entrada en el rastreador de problemas de AOSP ,
Publicación # 4 :
logcat me dice que hay un conflicto con la redeclaración de permisos durante la instalación (en mi caso, Amazon está intentando redeclarar getui.permission.GetuiService, que ya es propiedad de Camera 360)
LogCat de la publicación n. ° 12 :
10-25 08:06:37.805 749 824 W PackageManager: Package com.tencent.mm attempting to redeclare permission com.google.android.c2dm.permission.SEND already owned by com.google.android.gsf
10-25 08:06:37.926 4812 4812 D Finsky : [1] PackageInstallerImpl.cancelSession: Canceling session 121130466 for com.tencent.mm
10-25 08:06:37.926 4812 4812 E Finsky : [1] PackageInstallerImpl.handleCommitCallback: Error -505 while installing com.tencent.mm: INSTALL_FAILED_DUPLICATE_PERMISSION: Package com.tencent.mm attempting to redeclare permission com.google.android.c2dm.permission.SEND already owned by com.google.android.gsf
10-25 08:06:37.926 4812 4812 W Finsky : [1] 4.installFailed: Install failure of com.tencent.mm: -505 null
10-25 08:06:37.933 749 749 D ZenLog : intercepted: 0|com.android.vending|-973170826|null|10017,!priority
10-25 08:06:37.933 749 749 V NotificationService: pkg=com.android.vending canInterrupt=false intercept=true
10-25 08:06:37.964 4812 4812 D Finsky : [1] InstallerTask.cancelCleanup: Cancel running installation of com.tencent.mm
Extractos del rastreador de problemas de AOSP ,
Publicación # 4
En API19, el nuevo X509CertImpl (encCert) envuelve el certificado (que ya está analizado y listo para el cálculo SHA1), mientras que en API 21, el certificado se reenvía como flujo de bytes, se analiza nuevamente y se procesa en una fábrica de certificados. Qué fábrica es, depende del contexto. En el caso de los dispositivos L que probé, la fábrica creará un certificado OpenSSLX509. Desafortunadamente, hay algo en nuestro certificado con el que openssl tiene problemas y la huella digital cambia durante el procesamiento de openssl. Puedo reproducir esto también con la herramienta openssl, cuando convierto nuestro certificado a algún otro formato (por ejemplo, PEM).
Si el SHA1 se calculara directamente en 'encCert.getEncoded ()', sería correcto en ambos casos.
Solución
Actualización : A partir del 2014-12-04, Google ha solucionado este problema en Lollipop 5.0.1. Para aquellos que no hicieron ninguna solución al tratar de reinstalar la aplicación, pueden flashear la imagen de Lollipop 5.0.1 cuando esté lista / esperar la OTA.
Publicación # 20, # 21
Parece que esto se ha solucionado en 5.0.1:
https://android.googlesource.com/platform/libcore/+/6632d8c9d8d1a3ac338d541676148677641bafe3
https://android.googlesource.com/platform/frameworks/base/+/32a22c44b8351c1cccd3a1f9c47a33469d9378e0
Estado: liberado
Nota del comitente
Recupere aplicaciones con certificados malformados.
Hubo una ventana de tiempo en Lollipop donde persistimos los certificados después de haber pasado por un ciclo de decodificación / codificación. La biblioteca OpenSSL bien escrita era liberal cuando se decodificaba (lo que permitía analizar certificados ligeramente mal formados), pero luego era estricta cuando se codificaba, dándonos diferentes bytes para efectivamente el mismo certificado.
Un cambio relacionado de libcore (0c990ab4a90b8a5492a67b2b728ac9a4a1ccfa1b) ahora devuelve los bytes originales textualmente, reparando las instalaciones e instalaciones previas a Lollipop después de ese cambio.
Este cambio recupera cualquier aplicación que se haya instalado durante el período de tiempo descrito anteriormente mediante una verificación única para ver si los certificados son efectivamente iguales.
Consulte la revisión anterior para otras soluciones sugeridas.