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)
Пост # 12 в LogCat :
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, на которых я тестировал, фабрика создаст сертификат OpenSSLX509. К сожалению, в нашем сертификате есть что-то, с чем у 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 установки и установки после этого изменения.
Это изменение восстанавливает все приложения, которые были установлены в течение времени, описанного выше, путем одноразовой проверки, чтобы убедиться, что сертификаты фактически равны.
Пожалуйста, обратитесь к старой версии для других предлагаемых решений.