TL; DR
Ця проблема виникає, коли програма намагається повторно оголосити існуючий дозвіл із повідомленням про помилку INSTALL_FAILED_DUPLICATE_PERMISSION
. В основному це стосується програм, що базуються на Adobe AIR (префікс пакета з com.air
). Основна причиною є різним виконанням коду в Lollipop 5.0 при перевірці сигнатури сертифіката , яка використовується для підпису додатка. Для рішення просто перейдіть до частини "Рішення".
Оновлення : Google вирішив цю проблему на Lollipop 5.0.1.
Технічні деталі
Витяги з програми відстеження випуску Android L Developer Preview , пов’язані із записом у трекері випуску AOSP ,
Пост №4 :
logcat повідомляє мені, що під час встановлення конфлікт із переоформленням дозволів (у моєму випадку Amazon намагається змінити декларування getui.permission.GetuiService, який вже належить Camera 360)
LogCat допису №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
Витяги з трекера випуску AOSP ,
Пост №4
В API19 новий X509CertImpl (encCert) загортає сертифікат (який вже розібраний і готовий до обчислення SHA1), тоді як в API 21 сертифікат передається як байтовий потік, знову аналізується і обробляється заводом сертифікатів. Яка фабрика це, залежить від контексту. У випадку пристроїв L, на яких я тестував, фабрика створить сертифікат OpenSSLX509Certificate. На жаль, у нашому сертифікаті є щось, що у openssl має проблеми, і відбиток пальців змінюється під час обробки openssl. Я можу це відтворити також за допомогою інструмента openssl, коли я конвертую наш сертифікат в інший формат (наприклад, PEM).
Якщо SHA1 буде обчислено безпосередньо на "encCert.getEncoded ()", це було б правильно в обох випадках.
Рішення
Оновлення : Станом на 2014-12-04, Google вирішив цю проблему на Lollipop 5.0.1. Для тих, хто не зробив жодного рішення, намагаючись перевстановити додаток, ви можете спалахнути зображення Lollipop 5.0.1, коли воно буде готове / дочекайтеся OTA.
Пост №20, №21
Схоже, це було виправлено в 5.0.1:
https://android.googlesource.com/platform/libcore/+/6632d8c9d8d1a3ac338d541676148677641bafe3
https://android.googlesource.com/platform/frameworks/base/+/32a22c44b8351c1cccd3a1f9c47a33469d9378e0
Статус: Випущено
Примітка комітента
Відновлення програм із неправильними сертифікатами.
У Lollipop було вікно часу, де ми зберігали сертифікати після того, як вони пройшли цикл декодування / кодування. Добре написана бібліотека OpenSSL була ліберальною при розшифровці (дозволяючи розібрати злегка неправильно сформовані серти), але потім сувора при кодуванні, що дало нам різні байти для ефективності того ж сертифіката.
Пов'язана зміна libcore (0c990ab4a90b8a5492a67b2b728ac9a4a1ccfa1b) тепер повертає початкові байти дослівно, виправляючи як встановлення, так і встановлення до Lollipop після цієї зміни.
Ця зміна відновлює будь-які програми, які були встановлені протягом описаного вище вікна часу, одноразово перевіряючи, чи дійсно дорівнює кількість сертифікатів.
Будь ласка, зверніться до попередньої версії щодо інших запропонованих рішень.