INSTALL_FAILED_DUPLICATE_PERMISSION… C2D_MESSAGE

179

Я использую уведомления 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, поэтому он должен быть хорошо.

Исключение нулевого указателя
источник
20
То, что вы изначально приняли за неясную ошибку (ну, я сделал…), на самом деле является новой функцией безопасности, которая не позволяет двум приложениям объявлять одно и то же пользовательское разрешение, подписанное другой подписью, для установки на устройство
AZ_

Ответы:

231

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

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

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

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

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

Пратик Бутани
источник
6
У меня есть nexus 9 с Android 5.0.1, и я не вижу свое приложение с тэгом «не установлено»
xXJohnRamboXx
Это сработало для меня, спасибо! Моя проблема была немного другой. Я выполняю автоматическое тестирование (Xamarin.UITest) в нашем мобильном приложении, и я загрузил другую версию для некоторого ручного тестирования. Когда я попытался загрузить приложение (через VS / Xamarin UITest) на устройство, я начал видеть эту проблему. Еще раз спасибо.
LuFaMa
Этот ответ должен быть правильным: stackoverflow.com/a/27767179/343679
Sharj
@Pratik Butani Решение сработало для меня. Я хотел бы узнать причину возникновения ошибки? Не могли бы вы объяснить?
Картикеян Ве
1
Я не нахожу свое приложение внизу списка с тегом NOT INSTALLED . Что вы имеете в виду?
Игорь Ганапольский
139

удалять

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

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

Готов!.

Дельмирио Сегура
источник
31
Этот ответ должен быть на вершине, так как эта проблема часто возникает, когда вы пытаетесь установить отладочную и выпускную версию вашего приложения на одном устройстве. С этим решением вы можете легко это сделать. Я не знал, что вы можете использовать переменные в манифесте. Upvote!
Флориан
4
Этот ответ не работает, если приложение уже запущено. Я не могу ожидать, что пользователи моего приложения загрузят новую версию без разрешений, а затем снова установят более новую версию с разрешениями.
Нильсмагнус
5
Если это происходит с вами из-за того, что у вас есть отладочная и выпускная версии вашего приложения с разными именами, то для его работы удаление не требуется: вам просто нужно использовать его ${applicationId}вместо
жесткого кодирования
1
Использование $ {applicationId} вместо статического идентификатора приложения решило мою проблему !! В том числе при использовании ароматов !!!!
JannGabriel
1
@ yuval комментирует и решил это для меня. Из множества ответов этот лучше всего освещает проблему: stackoverflow.com/a/36992939/56285
Jonik
49

У меня была та же проблема с пользовательским разрешением подписи на 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

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

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

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

х-код
источник
Спасибо, но вы должны начать свой ответ с «вы также можете перейти на страницу информации о приложении в настройках устройства, щелкнуть меню переполнения и выбрать« Удалить для всех пользователей », чтобы предотвратить эту ошибку».
Яйнешь
Женись на мне, пожалуйста. После вашей редакции я зашел в «Настройки»> «Приложения», коснулся старой версии приложения и в меню параметров выберите «Удалить для всех пользователей».
Fabricio PH
№ 2 в вашем списке предварительных условий не обязательно должен быть правдой. В моем случае я не обновляю приложение, а устанавливаю отладочную сборку того же приложения с другим именем пакета, как описано в этой процедуре. stackoverflow.com/a/21006552/507339 . Это проблема, которую я не вижу решения
Nilzor
33

Я решил это, не прибегая к удалению альтернативного 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чтобы убедиться, что заполнитель был применен правильно. Если вы используете различные вкусы продукта, я уверен, что вы можете применить вариант этого метода в соответствии с вашими потребностями.

Джекпайл
источник
Похоже, что если я определю разное applicationIdв двух разных productFlavors, и использовать ${applicationId}эффект будет одинаково.
Роберт
Я думаю, что это более надежное решение, если вам нужно больше, чем 1 аромат.
Роберт
это должно быть помечено правильно. учитывая, что вы не можете ожидать от каждого сотрудника того, чтобы просто взломать его и просто построить проект и установить apk
goemic
Спасибо, @jackpile, приложение отлично работает для меня, есть только одна проблема, если установлены как релизные, так и отладочные сборки, то после установки отладочной сборки вместо этого открывается сборка релиза
Prateek Surana
это должно быть помечено как правильный ответ .. спасибо @Jackpile
Ахмед Эвесс
28

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

(Это лучшая практика, даже если вы не используете 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"/>

Затем в файле модуля вашего модуля установите соответствующий 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
    }
}

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

Дэвид
источник
2
используя ${applicationId}исправил проблему для меня!
Энди
Как это решает проблему?
Винсент
18

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

adb uninstall com.yourpackage
Giuseppe
источник
Странно, мне просто нужно было сделать это на моем Nexus 6, хотя я удалил свой APK через системный интерфейс, и он не показывался в установленных приложениях.
Джон Уиллис
Это дало мне Failure [DELETE_FAILED_INTERNAL_ERROR]. В чем может быть причина?
Реаз Муршед
17

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

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

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

Прети Рао
источник
8

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

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

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

adb uninstall com.yourpackage

Jorgesys
источник
5

Ничто из вышеперечисленного не помогло мне. Мое приложение работало нормально в прошлом, чем 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" />

Это будет работать с более старыми версиями <Lollipop. Так что теперь я изменился на:

<uses-permission android:name="com.mycompany.myappname.c2dm.permission.RECEIVE" />
<permission android:name="com.mycompany.myappname.permission.C2D_MESSAGE" 
            android:protectionLevel="signature" />
The_Martian
источник
4

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

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

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

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

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

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

TacB0sS
источник
4

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

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

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

Джорди
источник
Sry, просмотрел твой комментарий. Мы просто рассмотрим это как дополнительный информационный пост с изображениями.
Джорди
2

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

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

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_"***"
        }


}
NickUnuchek
источник
1

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

<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myapp.permission.C2D_MESSAGE" 
android:protectionLevel="signature" /> 
Sỹ Phạm
источник
1

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

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

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

Реаз Муршед
источник
0

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

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

Ясир
источник
0

Я столкнулся с той же проблемой с 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, которое я не мог удалить или внести какие-либо изменения.

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

Ultimo_m
источник
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

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

Абхинав Сингх Маурья
источник
0

В своем файле 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 эта часть решает конфликт с другим вашим приложением.

resw67
источник
0

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

Нувель Травай
источник
0

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

Сушил Дхайал
источник
0

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

Педро Мартинс
источник
0

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

olleh
источник