INSTALL_FAILED_DUPLICATE_PERMISSION... C2D_MESSAGE

Я использую уведомления Google в своем приложении, и до сих пор я делал ниже в манифесте:

<!-- GCM -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> <!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- Keeps the processor from sleeping when a message is received. --> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <!-- This app has permission to register and receive data message. --> 

<!-- Creates a custom permission so only this app can receive its messages. NOTE: APP_PACKAGE.permission.C2D_MESSAGE -->   
<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myapp.permission.C2D_MESSAGE" />    
<!-- END GCM -->

Он работал отлично, пока я не обновил свой Nexus 7 до Android 5.0.
Теперь, когда я пытаюсь установить приложение на этом устройстве с Eclipse, я получаю эту ошибку:

INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.myapp.permission.C2D_MESSAGE pkg = com.myapp

Я не понимаю, что не так... он работал отлично до Android 5.0.
Я знаю что использую C2D_MESSAGE в две строки, permission а также uses-permission но я скопировал этот код из оригинального руководства Google GCM, поэтому он должен быть в порядке.

25 ответов

Я нашел решение, которое работает для меня.

В моем устройстве (Nexus 7) Android 5.0. Леденец Я следую за этими шагами.

После удаления приложения вы найдете App Name в списке приложений Downloaded Tab.

  • Перейдите в настройки
  • Программы
  • Внизу списка вы найдете YourApp с тегом "НЕ УСТАНОВЛЕНО"
  • открыто
  • Нажмите на OptionMenu и выберите "Удалить для всех пользователей"

После этого процесса я успешно установил новое приложение, и оно работает хорошо.

Удалить

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

Запустите приложение... Затем снова добавьте разрешение и запустите приложение.

Готовы!.

У меня была та же проблема с пользовательским разрешением подписи на Android-21, и я решил ее, убедившись, что выполняю полное удаление.

Это крайний случай, который возникает, когда:

  1. Приложение определяет пользовательское разрешение, используя уровень безопасности подписи
  2. Вы пытаетесь обновить установленное приложение с версией, подписанной с другим ключом
  3. Тестовое устройство работает под управлением Android 21 или более поздней версии с поддержкой нескольких пользователей.

Пример командной строки

Вот транскрипт командной строки, который демонстрирует проблему и как ее решить. На этом этапе установлена ​​отладочная версия, и я пытаюсь установить рабочую версию, подписанную ключом выпуска:

# This fails because the debug version defines the custom permission signed with a different key:

[root@localhost svn-android-apps]# . androidbuildscripts/my-adb-install Example release
920 KB/s (2211982 bytes in 2.347s)
        pkg: /data/local/tmp/Example-release.apk
Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.example.android.example.PERMISSION_EXAMPLE_PLUGIN pkg=com.example.android.example]

# I use uninstall -k because apparently that is similar to uninstalling as a user
# by dragging the app out of the app tray:

[root@localhost svn-android-apps]# /android-sdk-linux/platform-tools/adb uninstall -k com.example.android.example
The -k option uninstalls the application while retaining the data/cache.
At the moment, there is no way to remove the remaining data.
You will have to reinstall the application with the same signature, and fully uninstall it.
If you truly wish to continue, execute 'adb shell pm uninstall -k com.example.android.example'

# Let's go ahead and do that:

[root@localhost svn-android-apps]# /android-sdk-linux/platform-tools/adb shell pm uninstall -k com.example.android.example
Success

# This fails again because the custom permission apparently is part of the data/cache
# that was not uninstalled:

[root@localhost svn-android-apps]# . androidbuildscripts/my-adb-install Example release
912 KB/s (2211982 bytes in 2.367s)
        pkg: /data/local/tmp/Example-release.apk
Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.example.android.example.PERMISSION_EXAMPLE_PLUGIN pkg=com.example.android.example]

# In spite of the warning above, simply doing a full uninstall at this point turned out to 
# work (for me):

[root@localhost svn-android-apps]# /android-sdk-linux/platform-tools/adb uninstall com.example.android.example
Success

# Release version now successfully installs:

[root@localhost svn-android-apps]# . androidbuildscripts/my-adb-install Example release
898 KB/s (2211982 bytes in 2.405s)
        pkg: /data/local/tmp/Example-release.apk
Success

[root@localhost svn-android-apps]# 

Пример Eclipse

Идя в обратном направлении (пытаясь установить отладочную сборку из Eclipse, когда сборка выпуска уже установлена), я получаю следующий диалог:

Eclipse переустановить диалог

Если вы просто ответите "да", то установка будет успешной.

Пример устройства

Как указано в другом ответе, вы также можете перейти на страницу информации о приложении в настройках устройства, щелкнуть меню переполнения и выбрать "Удалить для всех пользователей", чтобы предотвратить эту ошибку.

Я решил это, не прибегая к удалению альтернативного apk в первую очередь (что за боль, верно?). Чтобы успешно установить как отладочную, так и выпускную версию apk, просто используйте встроенный ${applicationId} местозаполнитель gradle в AndroidManifest.xml, чтобы изменить значения android: name разрешений во время компиляции.

Фрагмент файла build.gradle:

buildTypes {
    debug {
        applicationIdSuffix ".debug"
        ...
    }
}

Фрагмент файла AndroidStudio.xml:

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

Вы можете проверить измененный файл AndroidManifest.xml в apk, используя aapt l -a app-debug.apk чтобы убедиться, что заполнитель был правильно применен. Если вы используете различные вкусы продукта, я уверен, что вы можете применить вариант этого метода в соответствии с вашими потребностями.

Удалите все жестко запрограммированные ссылки на имя вашего пакета из файла манифеста.

(Это лучшая практика, даже если вы не используете productFlavors)

Например, если ваш манифест содержит:

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="com.yourpackage.name.permission.C2D_MESSAGE"/>

<permission
    android:name="com.yourpackage.name.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>
<permission
    android:name="com.yourpackage.name.permission.MAPS_RECEIVE"
    android:protectionLevel="signature"/>

Изменил это на:

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>

<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>
<permission
    android:name="${applicationId}.permission.MAPS_RECEIVE"
    android:protectionLevel="signature"/>

Затем в файле Gradle вашего модуля установите соответствующий applicationId:

signingConfigs {
    stage {
        storeFile file('keystore/stage.keystore')
        storePassword 'android'
        keyAlias 'androiddebugkey'
        keyPassword 'android'
    }
    production {
        storeFile file('keystore/playstore.keystore')
        storePassword store_password
        keyAlias key_alias
        keyPassword key_password
    }
}

productFlavors {
    staging {
        signingConfig signingConfigs.staging
        applicationId defaultConfig.applicationId + ".staging"
        versionName defaultConfig.versionName + "-staging"
    }

    production {
        signingConfig signingConfigs.production
    }
}

Вы можете следовать этому руководству для получения дополнительной информации

Попробуйте удалить приложение с помощью ADB:

adb uninstall com.yourpackage

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

  1. Перейдите в настройки
  2. Перейти к приложению
  3. Перейти к списку загруженных приложений
  4. Вы можете увидеть удаленное приложение в списке
  5. Нажмите на приложение, перейдите к дополнительной опции
  6. Нажмите удалить для всех опций пользователей

Проблема решена:D

Устанавливая приложение в OS 5.0, я получаю это сообщение:

INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.myapp.permission.C2D_MESSAGE pkg=com.myapp

Дублированных пакетов нет, и мы можем решить эту проблему, удалив вручную старое приложение или используя adb:

adb uninstall com.yourpackage

Ничто из вышеперечисленного не помогло мне. Мое приложение работало хорошо в предыдущем, чем Lollipop. Но когда я тестировал его на Lollipop, появилась ошибка выше. Он отказался установить. У меня не было никаких предыдущих версий, поэтому все вышеперечисленные решения в моем случае недействительны. Но благодаря этому SO-решению теперь он работает нормально. Как и большинство разработчиков, я следовал вводящему в заблуждение уроку Google и добавил разрешения путем копирования и вставки следующим образом:

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.google.android.permission.C2D_MESSAGE" 
            android:protectionLevel="signature" />

Это будет работать со старыми версиями

<uses-permission android:name="com.mycompany.myappname.c2dm.permission.RECEIVE" />
<permission android:name="com.mycompany.myappname.permission.C2D_MESSAGE" 
            android:protectionLevel="signature" />

В Android 5 проверьте свои настройки -> приложения. Вместо удаления только для активного пользователя (так как в Android 5 может быть несколько пользователей, а в моем телефоне - гостевой пользователь), нажмите на кнопку аксессуаров в верхнем правом углу панели действий / инструментов и выберите "Удалить для всех пользователей". Похоже, что в Android 5 при удалении из панели запуска вы удаляете приложение только для активного пользователя.

Приложение все еще находится на устройстве. Это меня поразило, так как я пытался установить релизную версию, не работало, поэтому я подумал, что правильно, потому что у меня все еще установлена ​​отладочная версия, удалил приложение. Но потом все равно не удалось установить. Первой подсказкой была запись в списке приложений удаленного приложения, рядом с которым было сообщение о том, что оно было удалено (изображение).

Удаленное приложение все еще отображается в приложенияхДеинсталлировано для всех пользователей

CommonsWare прав, но, на мой взгляд, это (ошибка) плохой способ сказать: "Установленный на устройстве apk подписан другим сертификатом, а не новым, который вы пытаетесь установить".

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

Решение, столь болезненное, как это может быть, состоит в том, чтобы удалить приложение это вручную.

Кроме того, что мы сделали для групповой разработки, мы добавили хранилище ключей отладки в наш репозиторий и указали на gradle, чтобы использовать его следующим образом:

android {
    ...
    signingConfigs {
        debug {
            storeFile file("../certificates/debug.keystore")
        }
    }

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

И теперь при передаче устройств между членами команды мы все используем один и тот же сертификат отладки, поэтому проблем не возникает.:)

Для создания приложения и его нескольких экземпляров вы можете напрямую добавить эту строку, после чего вы сможете устанавливать несколько приложений с одним и тем же именем пакета каждый раз, просто изменяя идентификатор приложения:

Пример: идентификатор приложения: XXXX.123 (старый или существующий, который установлен в телефоне)

Теперь сделайте идентификатор приложения как: XXX.1234 и установите приложение.

Формат:

      <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

Посмотрите эту ссылку, там сказано, что она будет работать, когда они подписаны одним и тем же ключом. Ключ релиза и ключ отладки не совпадают.

Так сделай это:

buildTypes {
        release {
            minifyEnabled true
            signingConfig signingConfigs.release//signing by the same key
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-android.txt'

        }
        debug {
            applicationIdSuffix ".debug"
            debuggable true
            signingConfig signingConfigs.release//signing by the same key
        }

    }

 signingConfigs {
        release {
            storeFile file("***\\key_.jks")
            storePassword "key_***"
            keyAlias "key_***"
            keyPassword "key_"***"
        }


}

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

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

com.mypackage.app1
com.mypackage.app2
com.mypackage.app3 
...

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

Чтобы найти все имена пакетов с устройства, я использовал следующее.

adb shell pm list packages

Затем я взял пакеты, которые соответствуют моему имени пакета, который я ищу.

dumpsys | grep -A18 "Package \[com.mypackage\]"

Затем удалили все приложения, имеющие этот домен.

uninstall com.mypackage.app1
uninstall com.mypackage.app2
uninstall com.mypackage.app3
...

Вы также можете удалить приложения с помощью Settingsприложение. Перейти кSettings -> Apps -> Find the app -> Uninstall

Надеюсь, это поможет кому-то, у кого такая же проблема, как и у меня.

Заменить ниже строки:

<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myapp.permission.C2D_MESSAGE" 
android:protectionLevel="signature" /> 

Я перезапустил телефон после удаления приложения, и оно заработало

В моем случае я использовал стороннюю библиотеку (т.е. поставщика), и библиотека поставляется с примером приложения, которое я уже установил на свое устройство. Так что этот пример приложения теперь конфликтовал каждый раз, когда я пытаюсь установить свое собственное приложение, реализующее библиотеку. Так что я просто удалил пример приложения продавца, и он работает потом.

Ранее говорилось, что на устройстве найдено приложение с другой подписью. При установке из IDE также будет спрашивать, хотите ли вы удалить его?

Но я думаю, что с Android 5.0 они изменили причину удаления. Это не происходит, если вы устанавливаете приложение с той же подписью

В моем случае я получил следующую ошибку

Ошибка установки: INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.map.permission.MAPS_RECEIVE pkg=com.abc.Firstapp

Когда я пытался установить приложение с именем пакета com.abc.Secondapp, Здесь дело в том, что приложение с именем пакета com.abc.Firstapp был уже установлен в моем приложении.

Я решил эту ошибку, удалив приложение с именем пакета com.abc.Firstapp а затем установка приложения с именем пакета com.abc.Secondapp

Я надеюсь, что это поможет кому-то во время тестирования.

Я столкнулся с той же проблемой с Nexus 5 Android Lollipop 5.0.1:

Installation error: INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.android.** pkg=com.android.**

И в моем случае я не мог решить эту проблему uninstalling приложение, потому что это было android app, но я должен был изменить свое приложение custom permissions имя в manifest потому что они были такими же, как приложение для Android, которое я не мог удалить или внести какие-либо изменения.

Надеюсь, это кому-нибудь поможет!

В вашем файле AndroidManifest.xml измените специально объявленные имена разрешений, например:

<!-- Creates a custom permission so only this app can receive its messages. NOTE: APP_PACKAGE.permission.C2D_MESSAGE -->   
<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myapp.permission.C2D_MESSAGE" />    
<!-- END GCM -->

к этому,

<!-- Creates a custom permission so only this app can receive its messages. NOTE: APP_PACKAGE.permission.C2D_MESSAGE -->   
<permission android:name="com.myapprocks.permission.C2D_MESSAGE"  android:protectionLevel="signature" />
<uses-permission android:name="com.myapprocks.permission.C2D_MESSAGE" />    
<!-- END GCM -->

com.myapprocks эта часть решает конфликт с другим вашим приложением.

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

Я использую Unity с плагинами Android OneSignal и FirebaseCommon. Сами эти плагины содержали в своих файлах манифеста следующие строки:

      <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

Я увидел это, распаковав их файлы .aar. Это было совершенно скрыто.

Я решил проблему с помощью Android Dependency Resolver для Unity и выполнил полное принудительное разрешение , которое, в свою очередь, изменило манифесты с помощью моего нового AppId (потому что, как вы можете видеть, фактическая строка разрешений создается с использованием переменной).

У меня было другое приложение, использующее плагин с этими полномочиями. Я удалил другие приложения, использующие этот же пакет, и все заработало.

Я удалил предыдущую версию. Это сработало для меня.

Другие вопросы по тегам