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

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

Два приложения вызывают у меня проблемы после обновления системы, игры, в которые играют мои дети. Dumb Ways to Die и VVVVVV. У обоих из них были значки после обновления, но при нажатии появилось всплывающее окно с сообщением «Приложение не установлено». Я пытаюсь их установить. Загрузка в порядке. Установка начинается. А потом сообщение об ошибке:

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

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

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

Ответы (1)

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()', он был бы правильным в обоих случаях.


Решение

Обновление : по состоянию на 04.12.2014 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. Переключение на гостя тоже не помогает.
Ну, я только что понял, что тоже столкнулся с этой проблемой. Я успешно удалил проблемные приложения с помощью adb, но не смог переустановить его. Обратите внимание, что приложение, которое я хочу установить, имеет air.comпрефикс в качестве имени пакета. Похоже, это больше проблема между Google, Adobe Air и разработчиками приложений. Пока хотя бы один из них не исправит это, установить приложение будет невозможно. Я пометил проблему, чтобы получить обновление от Google.
Отредактируйте свой ответ своим комментарием. Эта информация полезна. +1
У меня такая же ошибка на 5.1.1 (cyanogenmod 12.1 galaxy s3 последняя ночная). Был ли у них какой-то старый код, или это более поздняя ошибка?
У меня возникла эта проблема на Android 6.0 Marshmallow. Было ли какое-то решение этой проблемы, или просто ждать OTA?
@Ben, в этом сообщении упоминаются проблемы с INSTALL_FAILED_DUPLICATE_PERMISSION, которые были исправлены в версии 5.0.1. Я получил эту ошибку с Marshmellow из-за INSTALL_FAILED_CONFLICTING_PROVIDER. Я использую поставщика диалогового окна Facebook SDK Share, который был объявлен как в моей отладочной, так и в релизной сборке, что предотвращает установку релизной сборки из Google Play Store. Вы можете увидеть точное сообщение, просматривая ваш лог-код adb. В моем случае я решил переименовать <provider> моей отладочной сборки с помощью manifestPlaceholders в имени моего провайдера.