TL;DR
Este problema ocurre cuando una aplicación intenta volver a declarar un permiso existente, con el mensaje de error INSTALL_FAILED_DUPLICATE_PERMISSION
. Principalmente afectó a aplicaciones basadas en Adobe AIR (paquete con prefijo com.air
). La causa principal es la diferente implementación de código en Lollipop 5.0 al verificar la firma de un certificado utilizado para firmar una aplicación. Para la solución, simplemente vaya 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 vista previa para desarrolladores de Android L que están vinculados desde una entrada en el rastreador de problemas de AOSP,
Publicación #4:
logcat me dice que hay un conflicto al volver a declarar permisos durante la instalación (en mi caso, Amazon está intentando volver a declarar getui.permission.GetuiService, que ya está en propiedad de Camera 360)
LogCat de la publicació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: Cancelling 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 la computación SHA1), mientras que en API 21, el certificado se reenvía como flujo de bytes, se analiza nuevamente y se procesa mediante una fábrica de certificados. Qué fábrica es esa, depende del contexto. En el caso de los dispositivos L en los que probé, la fábrica creará un OpenSSLX509Certificate. Desafortunadamente, hay algo en nuestro certificado con lo que OpenSSL tiene problemas y la huella digital cambia durante el procesamiento de openssl. También puedo reproducir esto 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 quienes no hicieron ningún otro intento 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 ha sido solucionado en 5.0.1:
https://android.googlesource.com/platform/libcore/+/6632d8c9d8d1a3ac338d541676148677641bafe3
https://android.googlesource.com/platform/frameworks/base/+/32a22c44b8351c1cccd3a1f9c47a33469d9378e0
Estado: Publicado
Nota del comitter
Recuperar aplicaciones con certificados defectuosos.
Hubo un período de tiempo en Lollipop donde persistimos los certificados después de pasar por un ciclo de decodificación/codificación. La bien escrita biblioteca OpenSSL era liberal al decodificar (permitiendo que se analizaran certificados ligeramente defectuosos), pero luego estricta al codificar, dándonos diferentes bytes para un certificado efectivamente igual.
Un cambio relacionado en libcore (0c990ab4a90b8a5492a67b2b728ac9a4a1ccfa1b) ahora devuelve los bytes originales textualmente, arreglando tanto las instalaciones previas a Lollipop como las instalaciones después de ese cambio.
Este cambio recupera cualquier aplicación que se haya instalado durante el período de tiempo descrito anteriormente realizando una verificación única para ver si los certificados son efectivamente iguales.
Por favor, consulte la revisión anterior para otras soluciones sugeridas.