TL; DR
Questo problema si verifica quando un'app sta tentando di dichiarare nuovamente un'autorizzazione esistente, con un messaggio di errore INSTALL_FAILED_DUPLICATE_PERMISSION
. Ha interessato principalmente le app basate su Adobe AIR (prefisso del pacchetto con com.air
). La causa principale è la diversa implementazione del codice in Lollipop 5.0 durante la verifica della firma di un certificato utilizzata per firmare un'app. Per la soluzione, passa direttamente alla parte "Soluzione".
Aggiornamento : Google ha risolto questo problema su Lollipop 5.0.1.
Dettagli tecnici
Estratti dal tracker del problema Anteprima Android Developer L che sono collegati da una voce sul tracker del problema AOSP ,
Post n. 4 :
logcat mi dice che c'è un conflitto con le autorizzazioni di redeclaring durante l'installazione (nel mio caso, Amazon sta cercando di redeclare getui.permission.GetuiService, che è già di proprietà di Camera 360)
LogCat di Post # 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
Estratti dal tracker dei problemi AOSP ,
Posta n. 4
In API19 il nuovo X509CertImpl (encCert) racchiude il certificato (che è già analizzato e pronto per il calcolo SHA1), mentre in API 21, il certificato viene inoltrato come flusso di byte, analizzato di nuovo ed elaborato da una fabbrica di certificati. Quale fabbrica, dipende dal contesto. Nel caso dei dispositivi L su cui ho provato, la fabbrica creerà un certificato OpenSSLX509. Sfortunatamente, nel nostro certificato è presente qualcosa con cui openssl ha problemi e l'impronta digitale cambia durante l'elaborazione di openssl. Posso riprodurlo anche con lo strumento openssl, quando converto il nostro certificato in qualche altro formato (es. PEM).
Se SHA1 fosse calcolato direttamente su 'encCert.getEncoded ()' sarebbe corretto in entrambi i casi.
Soluzione
Aggiornamento : a partire dal 04-12-2014, Google ha risolto questo problema su Lollipop 5.0.1. Per coloro che non hanno eseguito alcuna soluzione alternativa nel tentativo di reinstallare l'app, è possibile eseguire il flashing dell'immagine Lollipop 5.0.1 quando è pronta / attendere l'OTA.
Posta n. 20, n. 21
Sembra che questo sia stato corretto in 5.0.1:
https://android.googlesource.com/platform/libcore/+/6632d8c9d8d1a3ac338d541676148677641bafe3
https://android.googlesource.com/platform/frameworks/base/+/32a22c44b8351c1cccd3a1f9c47a33469d9378e0
Stato: rilasciato
Nota del committer
Ripristina app con certificati non validi.
C'era una finestra temporale in Lollipop in cui persistevamo i certificati dopo che erano passati attraverso un ciclo di decodifica / codifica. La ben scritta libreria OpenSSL era liberale durante la decodifica (consentendo l'analisi di certs leggermente malformati), ma poi rigorosa durante la codifica, dandoci byte diversi per lo stesso certificato.
Una modifica di libcore correlata (0c990ab4a90b8a5492a67b2b728ac9a4a1ccfa1b) ora restituisce i byte originali alla lettera, riparando sia le installazioni pre-Lollipop che le installazioni successive a quella modifica.
Questa modifica ripristina tutte le app che erano state installate nella finestra temporale sopra descritta facendo un controllo una tantum per vedere se i certificati sono effettivamente uguali.
Fare riferimento alla revisione precedente per altre soluzioni suggerite.