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, і я не бачу свого додатка з тегом "встановлено
ното

Це працювало для мене, дякую! Моє питання було дещо іншим. Я роблю автоматичне тестування (Xamarin.UITest) на нашому мобільному додатку, і я завантажив іншу версію для деяких ручних тестувань. Коли я намагався завантажити додаток (через VS / Xamarin UITest) на пристрій, я почав бачити цю проблему. Знову дякую.
LuFaMa

Це один повинен бути правильна відповідь: stackoverflow.com/a/27767179/343679
Sharj

@Pratik Butani Рішення працювало на мене. Мені хотілося б дізнатися причину отримання помилки? Чи можете ви поясніть, будь ласка?
Karthikeyan Ve

1
Я не знаходжу свою програму внизу списку з тегом NOT INSTALLED . Що ви маєте на увазі?
ІгорГанапольський

139

Видалити

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

Запустіть додаток ... Потім знову додайте дозвіл та запустіть додаток.

Готово !.


31
Ця відповідь повинна бути зверху, оскільки ця проблема часто виникає при спробі встановити налагодження та випустити версію свого додатка на одному пристрої. З цим рішенням ви легко можете це зробити. Я не знав, що ви можете використовувати змінні в маніфесті. Оновлення!
флоріан

4
Ця відповідь не працює, якщо додаток уже виробляється. Я не можу очікувати, що користувачі мого додатка завантажують нову версію без дозволів, а потім знову встановлюють нову версію з дозволами.
nilsmagnus

5
Якщо це трапляється з вами через те, що у вас є налагодження та випуск версій додатка з різними іменами, видалення не потрібно, щоб воно працювало: вам просто потрібно використовувати ${applicationId}замість
жорсткого

1
Використання $ {applicationId} замість статичного id програми вирішило мою проблему !! У тому числі при використанні ароматів !!!!
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, коли збірка версії вже встановлена), я отримую наступне діалогове вікно:

Діалогове вікно перевстановлення затемнення

Якщо ви просто відповісте "так", на цьому етапі встановлення буде успішним.

Приклад пристрою

Як зазначено в іншій відповіді, ви також можете перейти на сторінку інформації про програму в налаштуваннях пристрою, натиснути меню переповнення та вибрати "Видалити для всіх користувачів", щоб запобігти цій помилці.


Дякую, але ви повинні почати свою відповідь з "Ви також можете перейти на сторінку інформації про програму в налаштуваннях пристрою, натисніть меню переповнення та виберіть" Видалити для всіх користувачів ", щоб запобігти цій помилці".
yajnesh

Одружись, будь ласка. Після вашої редакції я перейшов до Налаштування> Програми, торкніться старого варіанта програми та в меню опцій виберіть "Видалити для всіх користувачів".
Fabricio PH

№2 вашого списку передумов не має бути правдивим. У моєму випадку я не оновлюю додаток, а встановлюю налагодження цього ж додатка з іншою назвою пакета, як описано у цій процедурі. stackoverflow.com/a/21006552/507339 . Це питання, на яке я не бачу вирішення
Nilzor

33

Я вирішив це, не вдаючись спочатку видалити альтернативний apk (який біль, правда?). Щоб успішно встановити і налагоджувальну, і версійну версію apk, просто використовуйте вбудований заповнювач $ {applicationId} в межах {{applicationId} в 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 додаток працює для мене прекрасно, є лише одна проблема, якщо встановлені версії випуску та налагодження, то після встановлення збірки налагодження замість цього відкривається збірка
версій

це слід позначити як правильну відповідь .. дякую @Jackpile
ahmed ewess

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"/>

Потім у файлі 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
    }
}

Ви можете дотримуватися цього підручника для отримання додаткової інформації


2
використовуючи ${applicationId}виправлену проблему для мене!
Енді

Як це стосується зазначеного питання?
Вінсент

18

спробуйте видалити додаток за допомогою adb:

adb uninstall com.yourpackage

Дивно, мені просто довелося це робити на своєму Nexus 6, хоча я видалив свій APK через системний інтерфейс І він не відображався під встановленими програмами.
Джон Вілліс

Це дало мені Failure [DELETE_FAILED_INTERNAL_ERROR]. Що може бути причиною?
Реаз Мурхед

17

Даючи цю помилку, у ній буде чітко згадуватися назва пакету програми, через що у дозволі було відмовлено. І просто видалення програми не вирішить проблему. Для вирішення проблеми нам потрібно зробити наступний крок:

  1. Перейдіть до налаштувань
  2. Перейдіть у додаток
  3. Перейдіть до списку завантажених додатків
  4. Ви можете побачити видалену програму у списку
  5. Клацніть на додаток, перейдіть до додаткової опції
  6. Клацніть на видалення для всіх параметрів користувачів

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


8

Встановлення програми в ОС 5.0 я отримую це повідомлення:

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

Немає дублюваних пакетів, і ми можемо вирішити цю проблему, видаляючи стару програму вручну або використовуючи adb:

adb uninstall com.yourpackage


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" />

4

CommonsWare має рацію, але, на мою думку, це поганий спосіб сказати: "Апк, встановлений на пристрої, підписаний іншим сертифікатом, а потім новим, який ви намагаєтесь встановити" .

Це, мабуть, нова помилка, оскільки раніше вона запитувала, чи потрібно видаляти додаток із пристрою через неправильний сертифікат.

Рішення настільки болісне, як це може бути, видалення програми вручну.

Крім того, що ми зробили задля розвитку команди, ми додали сховище налагодження до нашого сховища та вказали gradle, щоб використовувати його так:

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

І тепер, коли ми передаємо пристрої між членами команди, всі ми використовуємо один і той же сертифікат налагодження, тому проблем немає. :)


4

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

Додаток все ще на пристрої. Це мене здивувало, оскільки я намагався встановити версію, не працював, тому я вважав, що це має бути правильно, оскільки у мене все ще встановлена ​​версія налагодження, видалена програма. Але, ніж все-таки не вдалося встановити. Першим підказкою був запис у списку додатків деінстальованого додатка із повідомленням, що його видалено (зображення).

Видалений додаток все ще відображається в додатках Видалено для всіх користувачів


Шрі, переглянув твій коментар. Ми просто розглянемо це як додатковий інформаційний пост із зображеннями.
Джорді

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


}

1

замінити нижче рядків:

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

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, які я не міг видалити або змінити.

Сподіваюся, це комусь допоможе!


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 ця частина вирішує конфлікт з вашим іншим додатком.


0

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




0

Якщо у вас інший смак програми, спробуйте видалити це спочатку. Це мені допомогло, коли у мене було те саме питання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.