Как мне разобраться с неизвестным кодом ошибки установки -505?

9

У меня есть Nexus 7, и он только что обновился до Android 5.

Два приложения доставляют мне неприятности после обновления системы - игры, в которые играют мои дети. Тупые способы умереть и ВВВВВВ. После обновления у обоих значков были значки, но при нажатии появилось всплывающее окно с сообщением «Приложение не установлено». Я пытаюсь установить их. Загрузка в порядке. Установка начинается. И тогда сообщение об ошибке:

Неизвестный код ошибки при установке приложения: «-505»

Точно такая же ошибка для обоих приложений. Я перезапустил устройство безрезультатно.

Я понятия не имею, что делать дальше. Пожалуйста, могла бы какая-нибудь добрая душа дать мне совет, как мне решить эту проблему.

Дэвид Хеффернан
источник

Ответы:

10

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 установки и установки после этого изменения.

Это изменение восстанавливает все приложения, которые были установлены в течение времени, описанного выше, путем одноразовой проверки, чтобы убедиться, что сертификаты фактически равны.


Пожалуйста, обратитесь к старой версии для других предлагаемых решений.

Андрей Т.
источник
У меня так же, как у Дэвида: ничего не удаляется с устройства, ADB не видит мое устройство, попытки установить заново приводят к -505 из Google Play и неописуемой ошибке при установке из локального APK. Переключение на Гость также не помогает.
Роман Р.
2
Ну, я просто понял, что тоже столкнулся с этой проблемой. Я успешно удалил проблемные приложения adb, но не смог переустановить их. Обратите внимание, что приложение, которое я хочу установить, имеет air.comпрефикс в качестве имени пакета. Похоже, это скорее проблема между Google, Adobe Air и разработчиками приложений. Пока хотя бы один из них не исправит это, приложение будет невозможно установить. Я пометил проблему, чтобы получить обновление от Google.
Андрей Т.
3
У меня такая же ошибка на 5.1.1 (cyanogenmod 12.1 galaxy s3 последняя ночная). У них как-то был старый код, или это более поздняя ошибка?
икэ
1
У меня эта проблема на Android 6.0 Marshmallow. Было ли какое-то решение для этого или просто ждать ОТА?
Бен
2
@Ben, в этом посте упоминаются проблемы с INSTALL_FAILED_DUPLICATE_PERMISSION, которая была исправлена ​​в 5.0.1. Я получил эту ошибку с Marshmellow из-за INSTALL_FAILED_CONFLICTING_PROVIDER. Я использую провайдера диалога Facebook SDK Share, который был объявлен в обеих сборках отладки и выпуска, предотвращая установку сборки выпуска из Google Play Store. Вы можете увидеть точное сообщение, просматривая ваш adb logcat. В моем случае я решил переименовать <провайдер> моей отладочной сборки с помощью manifestPlaceholder в моем имени провайдера.
Майк Ламберт