INSTALL_FAILED_DUPLICATE_PERMISSION… C2D_MESSAGE

180

J'utilise les notifications Google dans mon application, et jusqu'à présent, je l'ai fait ci-dessous dans le manifeste:

<!-- 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 -->

Cela a parfaitement fonctionné jusqu'à ce que je mette à jour mon Nexus 7 vers Android 5.0.
Maintenant, lorsque j'essaye d'installer l'application sur cet appareil avec Eclipse, j'obtiens cette erreur:

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

Je ne comprends pas ce qui ne va pas? Cela fonctionnait parfaitement jusqu'à Android 5.0.
Je sais que je me sers C2D_MESSAGEen deux lignes, permissionet uses-permissionmais je l' ai copié ce code du guide Google GCM original, donc il doit être bien.

NullPointerException
la source
20
Ce que vous avez initialement pris pour un bug obscur (enfin, je l'ai fait…) est en fait une nouvelle fonctionnalité de sécurité empêchant deux applications de déclarer la même autorisation personnalisée qui sont signées avec une signature différente, à installer sur un appareil
AZ_

Réponses:

231

J'ai trouvé une solution qui fonctionne pour moi.

Dans mon appareil (Nexus 7) Android 5.0. Lollipop Je suis ces étapes.

Après la désinstallation de l'application, vous trouverez App Namesous Liste des applications de l' Downloadedonglet.

  • Aller aux paramètres
  • applications
  • En bas de la liste, vous trouverez YourAppune balise "NON INSTALLÉE"
  • Ouvert
  • Cliquez sur OptionMenuet sélectionnez "Désinstaller pour tous les utilisateurs"

Après ces étapes, j'ai installé avec succès la nouvelle application et elle fonctionne bien.

Pratik Butani
la source
6
Je nave Nexus 9 avec Android 5.0.1 et je ne peux pas voir mon application avec la balise "noto installed"
xXJohnRamboXx
Cela a fonctionné pour moi, merci! Mon problème était légèrement différent. Je fais des tests automatisés (Xamarin.UITest) sur notre application mobile et j'ai téléchargé une version différente pour des tests manuels. Lorsque j'ai tenté de charger l'application (via VS / Xamarin UITest) sur l'appareil, j'ai commencé à voir ce problème. Merci encore.
LuFaMa
Celui-ci devrait être la bonne réponse: stackoverflow.com/a/27767179/343679
Sharj
@Pratik Butani La solution a fonctionné pour moi. J'aimerais connaître la raison de l'erreur? Pouvez-vous expliquer?
Karthikeyan Ve
1
Je ne trouve pas mon application en bas de la liste avec la balise NOT INSTALLED . Que voulez-vous dire?
IgorGanapolsky
141

Retirer

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

Exécutez l'application ... puis ajoutez à nouveau l'autorisation et exécutez l'application.

Prêt!.

Delmirio Segura
la source
31
Cette réponse doit être au top car ce problème se produit souvent lorsque vous essayez d'installer la version de débogage et de publication de votre application sur le même appareil. Avec cette solution, vous pouvez le faire facilement. Je ne savais pas que vous pouviez utiliser des variables dans le manifeste. Upvote!
florian
5
Cette réponse ne fonctionne pas si l'application est déjà en production. Je ne peux pas m'attendre à ce que les utilisateurs de mon application téléchargent une nouvelle version sans les autorisations, puis réinstalle une version plus récente avec les autorisations.
nilsmagnus
5
Si cela vous arrive parce que vous avez des versions de débogage et de publication de votre application avec des noms différents, une désinstallation n'est pas nécessaire pour que cela fonctionne: il vous suffit d'utiliser le ${applicationId}au lieu de le coder en
dur
1
Utiliser $ {applicationId} au lieu de l'ID d'application statique a résolu mon problème !! Y compris lors de l'utilisation de Flavors !!!!
JannGabriel
1
Le commentaire de @ yuval est parfait et a résolu ce problème pour moi. Parmi les nombreuses réponses, celle-ci couvre le mieux le problème: stackoverflow.com/a/36992939/56285
Jonik
49

J'ai eu le même problème avec une autorisation de signature personnalisée sur Android-21 et je l'ai résolu en m'assurant que je faisais une désinstallation complète.

Il s'agit d'un cas extrême qui se produit lorsque:

  1. Une application définit une autorisation personnalisée à l'aide de la sécurité au niveau de la signature
  2. Vous essayez de mettre à jour l'application installée avec une version signée avec une clé différente
  3. L'appareil de test exécute Android 21 ou plus récent avec prise en charge de plusieurs utilisateurs

Exemple de ligne de commande

Voici une transcription en ligne de commande qui montre le problème et comment le résoudre. À ce stade, une version de débogage est installée et j'essaie d'installer une version de production signée avec la clé de publication:

# 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]# 

Exemple Eclipse

En allant dans la direction opposée (en essayant d'installer une version de débogage à partir d'Eclipse lorsqu'une version de version est déjà installée), j'obtiens la boîte de dialogue suivante:

Boîte de dialogue de réinstallation d'Eclipse

Si vous répondez simplement oui à ce stade, l'installation réussira.

Exemple d'appareil

Comme indiqué dans une autre réponse, vous pouvez également accéder à une page d'informations sur l'application dans les paramètres de l'appareil, cliquer sur le menu à développer et sélectionner «Désinstaller pour tous les utilisateurs» pour éviter cette erreur.

code x
la source
Merci, mais vous devriez commencer votre réponse par "vous pouvez également accéder à une page d'informations sur l'application dans les paramètres de l'appareil, cliquer sur le menu à développer et sélectionner" Désinstaller pour tous les utilisateurs "pour éviter cette erreur."
yajnesh
Épouse-moi s'il te plaît. Suite à votre rédaction, je suis allé dans Paramètres> Applications, touchez dans l'ancienne version de l'application et dans le menu d'options sélectionnez «Désinstaller pour tous les utilisateurs».
Rudolf Real
Le n ° 2 de votre liste de conditions préalables ne doit pas nécessairement être vrai. Dans mon cas, je ne mets pas à jour l'application, mais j'installe une version de débogage de la même application avec un nom de package différent, comme décrit dans cette procédure. stackoverflow.com/a/21006552/507339 . C'est un problème
auquel
34

J'ai résolu ce problème sans avoir à désinstaller d'abord l'apk alternatif (quelle douleur, non?). Pour installer avec succès à la fois une version de débogage et une version finale d'un apk, utilisez simplement l'espace réservé $ {applicationId} intégré de gradle dans AndroidManifest.xml pour modifier les valeurs android: name des autorisations au moment de la compilation.

L'extrait de fichier build.gradle:

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

L'extrait de fichier AndroidStudio.xml:

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

Vous pouvez inspecter le fichier AndroidManifest.xml modifié dans l'apk en utilisant aapt l -a app-debug.apkpour vous assurer que l'espace réservé a été correctement appliqué. Si vous utilisez différentes saveurs de produits, je suis sûr que vous pouvez appliquer une variante de cette méthode en fonction de vos besoins.

Jackpile
la source
il semble que si je définis différent applicationIden deux différents productFlavors, et que j'utilise ${applicationId}l'effet sera le même.
Robert
Je pense que c'est une solution plus robuste si vous avez besoin de plus d'une saveur.
Robert
cela doit être marqué comme correct. considérant que vous ne pouvez pas vous attendre à ce que chaque collègue fasse quelques piratages pour simplement créer un projet et installer l'
apk
Merci, @jackpile, l'application fonctionne parfaitement pour moi, il n'y a qu'un problème s'il y a à la fois des versions de version et de débogage installées, puis après l'installation de la version de débogage, la version de version s'ouvre à la place
Prateek Surana
cela doit être marqué comme la bonne réponse .. merci @Jackpile
Ahmed Garhy
29

Supprimez toute référence «codée en dur» de votre nom de package de votre fichier manifeste.

(C'est la meilleure pratique même si vous n'utilisez pas productFlavors)

Par exemple, si votre manifeste contient:

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

Changé en:

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

Ensuite, dans votre fichier gradle de module, définissez vos éléments pertinents 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
    }
}

Vous pouvez suivre ce tutoriel pour plus d'informations

David
la source
2
l'utilisation a ${applicationId}résolu le problème pour moi!
Andrew
Comment cela répond-il au problème mentionné?
Vincent
19

essayez de désinstaller l'application avec adb:

adb uninstall com.yourpackage
Giuseppe
la source
Bizarre, je devais juste le faire sur mon Nexus 6, même si j'avais désinstallé mon APK via l'interface utilisateur système ET qu'il n'apparaissait pas sous les applications installées.
Jon Willis
Cela m'a donné Failure [DELETE_FAILED_INTERNAL_ERROR]. Quelle pourrait en être la raison?
Reaz Murshed
Cela a parfaitement fonctionné pour moi alors que rien d'autre ne le faisait. Merci de l'avoir partagé.
BobbyMick
17

Tout en donnant cette erreur, il mentionnera clairement le nom du package de l'application en raison de laquelle l'autorisation a été refusée. Et simplement désinstaller l'application ne résoudra pas le problème. Afin de résoudre le problème, nous devons suivre l'étape suivante:

  1. Aller aux paramètres
  2. Aller à l'App
  3. Aller à la liste des applications téléchargées
  4. Vous pouvez voir l'application désinstallée dans la liste
  5. Cliquez sur l'application, allez à plus d'options
  6. Cliquez sur désinstaller pour toutes les options des utilisateurs

Problème résolu: D

Preethi Rao
la source
8

Installation d'une application sous OS 5.0 je reçois ce message:

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

Il n'y a pas de packages dupliqués, et nous pouvons résoudre ce problème en désinstallant manuellement l'ancienne application ou en utilisant adb:

adb uninstall com.yourpackage

Jorgesys
la source
5

Aucun de ces éléments n'a fonctionné pour moi. Mon application fonctionnait bien avant Lollipop. Mais quand je l'ai testé sur Lollipop, l'erreur ci-dessus s'est produite. Il a refusé d'installer. Je n'avais aucune version précédente installée, donc toutes les solutions ci-dessus ne sont pas valides dans mon cas. Mais grâce à cette solution SO, il fonctionne maintenant correctement. Tout comme la plupart des développeurs, j'ai suivi le tutoriel trompeur de Google et j'ai ajouté les autorisations par copier-coller comme ceci:

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

Cela fonctionnerait avec les anciennes versions <Lollipop. Alors maintenant, j'ai changé pour:

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

CommonsWare a raison, mais à mon avis, c'est une mauvaise façon (de bogue) de dire: "L'apk installé sur l'appareil est signé avec un certificat différent du nouveau que vous essayez d'installer" .

Il s'agit probablement d'un nouveau bogue car dans le passé, il demandait s'il fallait ou non désinstaller l'application de l'appareil en raison d'un certificat incorrect.

La solution aussi pénible que cela puisse être serait de désinstaller l'application manuellement.

Aussi ce que nous avons fait pour le développement de l'équipe, nous avons ajouté le keystore de débogage à notre référentiel, et pointez gradle pour l'utiliser comme ceci:

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

Et maintenant, lors du passage d'appareils entre les membres de l'équipe, nous utilisons tous le même certificat de débogage, il n'y a donc pas de problème. :)

TacB0sS
la source
4

Sous Android 5, vérifiez vos paramètres -> applications. Au lieu de supprimer uniquement pour l'utilisateur actif (car Android 5 peut avoir plusieurs utilisateurs et mon téléphone avait un utilisateur invité), appuyez sur le bouton accessoire dans le coin supérieur droit de la barre d'action / d'outils et choisissez «désinstaller pour tous les utilisateurs». Il semble que dans Android 5, lorsque vous désinstallez simplement du lanceur, vous ne désinstallez l'application que pour l'utilisateur actif.

L'application est toujours sur l'appareil .. Cela m'a ébloui puisque j'essayais d'installer une version commerciale, cela n'a pas fonctionné, alors j'ai pensé que ça devait être parce que j'avais toujours la version de débogage installée, désinstallé l'application. Mais que je ne pouvais toujours pas installer .. Le premier indice était un enregistrement dans la liste des applications de l'application désinstallée avec le message à côté de lui indiquant qu'elle était désinstallée (image).

L'application désinstallée apparaît toujours dans les applications Désinstallé pour tous les utilisateurs

Jordy
la source
Sry, a examiné votre commentaire. Nous allons simplement considérer cela comme un article d'information supplémentaire avec des images.
Jordy
2

Voir ce lien, il a dit que cela fonctionnera quand ils sont signés par la même clé. La clé de libération et la clé de débogage ne sont pas les mêmes.

Alors faites-le:

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
la source
1

remplacer les lignes ci-dessous:

<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
la source
1

Dans mon cas, j'ai installé plusieurs applications ayant le même nom de domaine dans le nom du package comme suit.

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

J'ai dû désinstaller toutes les applications ayant des noms de package similaires et les réinstaller à nouveau afin de résoudre le problème.

Pour trouver tous les noms de paquet de l'appareil, j'ai utilisé ce qui suit.

adb shell pm list packages

Ensuite, j'ai attrapé les packages qui correspondent au nom de mon package que je recherche.

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

Puis désinstallé toutes les applications ayant ce domaine.

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

Vous pouvez également désinstaller les applications à l'aide du Settings application. Aller auSettings -> Apps -> Find the app -> Uninstall

J'espère que cela aide quelqu'un ayant le même problème que moi.

Reaz Murshed
la source
0

Auparavant, il disait qu'une application avec une signature différente se trouve sur l'appareil. Lors de l'installation à partir de l'IDE, il vous sera également demandé si vous souhaitez le désinstaller?

Mais je pense qu'à partir d'Android 5.0, ils ont changé la raison de la désinstallation. Cela ne se produit pas si vous installez une application avec la même signature

Yasir
la source
0

J'ai rencontré le même problème avec un Nexus 5 Android Lollipop 5.0.1:

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

Et dans mon cas, je ne pouvais pas résoudre ce problème avec uninstallingl'application, car c'était une android app, mais j'ai dû changer le custom permissionsnom de mon application manifestcar c'était la même chose qu'une application Android, que je ne pouvais pas désinstaller ni modifier.

J'espère que cela aide quelqu'un!

Ultimo_m
la source
0

Dans mon cas, j'ai reçu l'erreur suivante

Erreur d'installation: INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.map.permission.MAPS_RECEIVE pkg = com.abc.Firstapp

Lorsque j'essayais d'installer l'application qui porte le nom du package com.abc.Secondapp. Ici, l'application avec le nom du package com.abc.Firstappétait déjà installée dans mon application.

J'ai résolu cette erreur en désinstallant l'application avec le nom du package com.abc.Firstapp, puis en installant l'application avec le nom du packagecom.abc.Secondapp

J'espère que cela aidera quelqu'un pendant le test.

Abhinav Singh Maurya
la source
0

Dans votre fichier AndroidManifest.xml, modifiez les noms de vos autorisations spécialement déclarées, par exemple:

<!-- 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 -->

pour ça,

<!-- 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 cette partie résout le conflit avec votre autre application.

resw67
la source
0

Dans mon cas, j'utilisais une bibliothèque tierce (c'est-à-dire un fournisseur) et la bibliothèque est livrée avec un exemple d'application que j'avais déjà installé sur mon appareil. Donc, cet exemple d'application était désormais en conflit chaque fois que j'essayais d'installer ma propre application implémentant la bibliothèque. Je viens donc de désinstaller l'exemple d'application du fournisseur et cela fonctionne par la suite.

Nouvel Travay
la source
0

J'ai désinstallé la version précédente. Cela a fonctionné pour moi.

Sushil Dhayal
la source
0

J'ai redémarré mon téléphone après avoir désinstallé l'application et cela a fonctionné

Pedro Martins
la source
0

Si vous avez une autre saveur de l'application, essayez d'abord de la désinstaller. Cela m'a aidé lorsque j'ai eu le même problème.

Olleh
la source