INSTALL_FAILED_DUPLICATE_PERMISSION… C2D_MESSAGE

179

Ich verwende Google-Benachrichtigungen in meiner App und habe dies bisher im Manifest getan:

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

Es hat perfekt funktioniert, bis ich mein Nexus 7 auf Android 5.0 aktualisiert habe.
Wenn ich jetzt versuche, die App mit Eclipse auf diesem Gerät zu installieren, wird folgende Fehlermeldung angezeigt:

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

Ich verstehe nicht was falsch ist? Es funktionierte perfekt bis Android 5.0.
Ich weiß , dass ich verwende C2D_MESSAGEin zwei Linien, permissionund , uses-permissionaber ich habe diesen Code aus dem ursprünglichen Google GCM Guide kopiert, so dass es in Ordnung sein muss.

NullPointerException
quelle
20
Was Sie ursprünglich für einen obskuren Fehler gehalten haben (nun, ich habe es getan ...), ist eine neue Sicherheitsfunktion, die verhindert, dass zwei Apps dieselbe benutzerdefinierte Berechtigung deklarieren, die mit einer anderen Signatur signiert ist, um auf einem Gerät installiert zu werden
AZ_

Antworten:

231

Ich habe eine Lösung gefunden, die für mich funktioniert.

In meinem Gerät (Nexus 7) Android 5.0. Lollipop Ich folge diesen Schritten.

Nach der Deinstallation der App finden Sie App Nameunter Apps-Liste die DownloadedRegisterkarte.

  • Gehe zu den Einstellungen
  • Apps
  • Am Ende der Liste finden Sie YourAppein "NOT INSTALLED" -Tag
  • Öffnen
  • Klicken Sie auf OptionMenuund wählen Sie "Für alle Benutzer deinstallieren".

Nach diesen Schritten installiere ich die neue App erfolgreich und sie läuft gut.

Pratik Butani
quelle
6
Ich nave Nexus 9 mit Android 5.0.1 und ich kann meine App mit "noto installiert" -Tag nicht sehen
xXJohnRamboXx
Das hat bei mir funktioniert, danke! Mein Problem war etwas anders. Ich mache automatisierte Tests (Xamarin.UITest) auf unserer mobilen App und habe eine andere Version für einige manuelle Tests hochgeladen. Als ich versuchte, die App (über VS / Xamarin UITest) auf das Gerät zu laden, trat dieses Problem auf. Danke noch einmal.
LuFaMa
Dies sollte die richtige Antwort sein: stackoverflow.com/a/27767179/343679
Sharj
@Pratik Butani Die Lösung hat bei mir funktioniert. Ich würde gerne wissen, warum der Fehler aufgetreten ist. Könnten Sie das bitte erklären?
Karthikeyan Ve
1
Ich finde meine App nicht am Ende der Liste mit dem Tag NOT INSTALLED . Was meinst du?
IgorGanapolsky
139

Entfernen

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

App ausführen ... Fügen Sie dann die Berechtigung erneut hinzu und führen Sie die App aus.

Bereit!.

Delmirio Segura
quelle
31
Diese Antwort sollte oben stehen, da dieses Problem häufig auftritt, wenn Sie versuchen, die Debug- und Release-Version Ihrer App auf demselben Gerät zu installieren. Mit dieser Lösung können Sie es einfach tun. Ich wusste nicht, dass Sie Variablen im Manifest verwenden können. Upvote!
Florian
4
Diese Antwort funktioniert nicht, wenn die App bereits in Produktion ist. Ich kann nicht erwarten, dass Benutzer meiner App eine neue Version ohne die Berechtigungen herunterladen und dann eine neuere Version mit den Berechtigungen erneut installieren.
Nilsmagnus
5
Wenn Ihnen dies passiert, weil Sie Debug- und Release-Versionen Ihrer App mit unterschiedlichen Namen haben, ist eine Deinstallation nicht erforderlich, damit sie funktioniert: Sie müssen nur die verwenden, ${applicationId}anstatt sie fest zu codieren
yuval
1
Die Verwendung von $ {applicationId} anstelle der statischen Anwendungs-ID hat mein Problem gelöst !! Einschließlich bei der Verwendung von Aromen !!!!
JannGabriel
1
@ yuvals Kommentar ist genau richtig und hat dies für mich gelöst. Von den vielen Antworten deckt diese am besten das Problem ab: stackoverflow.com/a/36992939/56285
Jonik
49

Ich hatte das gleiche Problem mit einer benutzerdefinierten Signaturberechtigung für Android-21 und löste es, indem ich sicherstellte, dass ich eine vollständige Deinstallation durchführte.

Dies ist ein Randfall, der auftritt, wenn:

  1. Eine Anwendung definiert eine benutzerdefinierte Berechtigung mithilfe der Sicherheit auf Signaturstufe
  2. Sie versuchen, die installierte App mit einer Version zu aktualisieren, die mit einem anderen Schlüssel signiert ist
  3. Auf dem Testgerät wird Android 21 oder neuer ausgeführt, wobei mehrere Benutzer unterstützt werden

Befehlszeilenbeispiel

Hier ist ein Befehlszeilentranskript, das das Problem und seine Lösung demonstriert. Zu diesem Zeitpunkt ist eine Debug-Version installiert, und ich versuche, eine mit dem Release-Schlüssel signierte Produktionsversion zu installieren:

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

Wenn ich in die entgegengesetzte Richtung gehe (versuche, einen Debug-Build von Eclipse zu installieren, wenn bereits ein Release-Build installiert ist), erhalte ich den folgenden Dialog:

Eclipse-Dialogfeld zur Neuinstallation

Wenn Sie an dieser Stelle nur mit Ja antworten, ist die Installation erfolgreich.

Gerätebeispiel

Wie in einer anderen Antwort erwähnt, können Sie in den Geräteeinstellungen auch eine App-Infoseite aufrufen, auf das Überlaufmenü klicken und "Für alle Benutzer deinstallieren" auswählen, um diesen Fehler zu vermeiden.

X-Code
quelle
Vielen Dank, aber Sie sollten Ihre Antwort mit "Sie können auch in den Geräteeinstellungen zu einer App-Infoseite gehen, auf das Überlaufmenü klicken und" Für alle Benutzer deinstallieren "auswählen, um diesen Fehler zu vermeiden." Beginnen.
Yajnesh
Heirate mich bitte. Nach Ihrer Redaktion ging ich zu Einstellungen> Apps, berührte die alte Version der App und wählte im Optionsmenü "Für alle Benutzer deinstallieren".
Fabricio PH
# 2 Ihrer Vorbedingungsliste muss nicht wahr sein. In meinem Fall aktualisiere ich die App nicht, sondern installiere einen Debug-Build derselben App mit einem anderen Paketnamen, wie in diesem Verfahren beschrieben. stackoverflow.com/a/21006552/507339 . Dies ist ein Problem, für das ich keine Lösung
sehe
33

Ich habe das gelöst, ohne zuerst die alternative apk deinstallieren zu müssen (was für ein Schmerz, oder?). Um sowohl eine Debug- als auch eine Release-Version eines apk erfolgreich zu installieren, verwenden Sie einfach den in gradle integrierten Platzhalter $ {applicationId} in der Datei AndroidManifest.xml, um die Werte für android: name der Berechtigungen beim Kompilieren zu ändern.

Das build.gradle-Datei-Snippet:

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

Das AndroidStudio.xml-Datei-Snippet:

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

Sie können die geänderte Datei AndroidManifest.xml in der apk überprüfen, aapt l -a app-debug.apkum sicherzustellen, dass der Platzhalter ordnungsgemäß angewendet wurde. Wenn Sie verschiedene Produktaromen verwenden, können Sie sicher eine Variation dieser Methode anwenden, die Ihren Anforderungen entspricht.

Jackpile
quelle
Es scheint, dass, wenn ich applicationIdin zwei verschiedenen definiere productFlavorsund benutze, ${applicationId}der Effekt der gleiche ist.
Robert
Ich denke, dies ist eine robustere Lösung, wenn Sie mehr als 1 Geschmacksrichtung benötigen.
Robert
Dies sollte als korrekt markiert werden. man bedenkt , dass man nicht von jedem Mitarbeiter erwarten kann einige Hack Arounds zu tun , um ein Projekt zu einfach aufzubauen und die apk installieren
goemic
Danke, @jackpile, die App läuft einwandfrei für mich. Es gibt nur ein Problem, wenn sowohl Release- als auch Debug-Builds installiert sind. Nach der Installation des Debug-Builds wird stattdessen der Release-Build geöffnet
Prateek Surana
Dies sollte als die richtige Antwort markiert werden .. danke @Jackpile
ahmed ewess
28

Entfernen Sie alle "Hard Coded" -Referenzen Ihres Paketnamens aus Ihrer Manifestdatei.

(Dies ist eine bewährte Methode, auch wenn Sie sie nicht verwenden. productFlavors)

Zum Beispiel, wenn Ihr Manifest Folgendes enthält:

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

Geändert zu:

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

Stellen Sie dann in Ihrer Modul-Gradle-Datei Folgendes ein 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
    }
}

Sie können diesem Tutorial für weitere Informationen folgen

David
quelle
2
mit ${applicationId}behoben das Problem für mich!
Andy
Wie adressiert dies das erwähnte Problem?
Vincent
18

Versuchen Sie, die App mit adb zu deinstallieren:

adb uninstall com.yourpackage
Giuseppe
quelle
Seltsamerweise musste ich dies nur auf meinem Nexus 6 tun, obwohl ich meine APK über die System-Benutzeroberfläche deinstalliert hatte UND sie unter installierten Apps nicht angezeigt wurde.
Jon Willis
Es gab mir Failure [DELETE_FAILED_INTERNAL_ERROR]. Was könnte der Grund sein?
Reaz Murshed
17

Während dieses Fehlers wird der Paketname der App deutlich angegeben, aufgrund dessen die Berechtigung verweigert wurde. Und nur die Deinstallation der Anwendung wird das Problem nicht lösen. Um das Problem zu lösen, müssen wir den folgenden Schritt ausführen:

  1. Gehe zu den Einstellungen
  2. Gehe zur App
  3. Gehen Sie zur Liste der heruntergeladenen Apps
  4. Sie können die deinstallierte Anwendung in der Liste sehen
  5. Klicken Sie auf die Anwendung und gehen Sie zu mehr Option
  6. Klicken Sie auf Deinstallation für alle Benutzer Optionen

Problem gelöst: D.

Preethi Rao
quelle
8

Beim Installieren einer Anwendung in OS 5.0 wird folgende Meldung angezeigt:

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

Es gibt keine doppelten Pakete, und wir können dieses Problem lösen, indem wir die alte Anwendung manuell deinstallieren oder die ADB verwenden:

adb uninstall com.yourpackage

Jorgesys
quelle
5

Keines der oben genannten hat bei mir funktioniert. Meine App hat früher als Lollipop einwandfrei funktioniert. Aber als ich es auf Lollipop getestet habe, ist der obige Fehler aufgetreten. Es weigerte sich zu installieren. Ich hatte keine früheren Versionen installiert, daher sind alle oben genannten Lösungen in meinem Fall ungültig. Aber dank dieser SO-Lösung läuft es jetzt einwandfrei. Wie die meisten Entwickler habe ich das irreführende Tutorial von Google befolgt und die Berechtigungen durch Kopieren und Einfügen wie folgt hinzugefügt:

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

Dies würde mit älteren Versionen <Lollipop funktionieren. Also wechselte ich jetzt zu:

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

CommonsWare ist richtig, aber meiner Meinung nach ist dies eine (Bug) schlechte Art und Weise zu sagen: „Die apk auf dem Gerät installiert ist mit einem anderen Zertifikat dann dem neuen signierte Sie versuchen , zu installieren“ .

Dies ist wahrscheinlich ein neuer Fehler, da in der Vergangenheit gefragt wurde, ob die App aufgrund eines falschen Zertifikats vom Gerät deinstalliert werden soll oder nicht.

Die Lösung, so schmerzhaft es auch sein mag, wäre, die App manuell zu deinstallieren.

Auch was wir für die Teamentwicklung getan haben, haben wir den Debug-Keystore zu unserem Repository hinzugefügt und Point Gradle, um ihn wie folgt zu verwenden:

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

Und jetzt, wenn wir Geräte zwischen Teammitgliedern weitergeben, verwenden wir alle dasselbe Debug-Zertifikat, sodass es kein Problem gibt. :) :)

TacB0sS
quelle
4

Überprüfen Sie in Android 5 Ihre Einstellungen -> Apps. Anstatt nur für den aktiven Benutzer zu löschen (da Android 5 mehrere Benutzer haben kann und mein Telefon einen Gastbenutzer hatte), tippen Sie auf die Zubehörschaltfläche in der oberen rechten Ecke der Aktions- / Symbolleiste und wählen Sie "Für alle Benutzer deinstallieren". Es scheint, dass Sie in Android 5, wenn Sie nur von Launcher deinstallieren, nur die App für den aktiven Benutzer deinstallieren.

Die App befindet sich immer noch auf dem Gerät. Dies hat mich geblendet, da ich versucht habe, eine Release-Version zu installieren. Es hat nicht funktioniert. Ich dachte, das muss richtig sein, weil ich immer noch die Debug-Version installiert habe und die App deinstalliert habe. Aber als konnte immer noch nicht installiert werden. Erster Hinweis war ein Datensatz in der App-Liste der deinstallierten App mit der Meldung daneben, dass sie deinstalliert wurde (Image).

Deinstallierte App wird weiterhin in Apps angezeigt Für alle Benutzer deinstalliert

Jordy
quelle
Sry, habe deinen Kommentar durchgesehen. Wir betrachten dies nur als zusätzlichen Info-Beitrag mit Bildern.
Jordy
2

Sieh dir das an Link , der besagt, dass es funktionieren wird, wenn sie mit demselben Schlüssel signiert sind. Der Release-Schlüssel und der Debug-Schlüssel sind nicht identisch.

Also mach es:

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
quelle
1

Ersetzen Sie die folgenden Zeilen:

<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
quelle
1

In meinem Fall wurden mehrere Anwendungen mit demselben Domänennamen im Paketnamen wie folgt installiert.

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

Ich musste alle Apps mit ähnlichen Paketnamen deinstallieren und erneut installieren, um das Problem zu beheben.

Um alle Paketnamen vom Gerät zu finden, habe ich Folgendes verwendet.

adb shell pm list packages

Dann habe ich mir die Pakete geholt, die meinem gesuchten Paketnamen entsprechen.

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

Dann deinstallieren Sie alle Apps mit dieser Domain.

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

Sie können die Anwendungen auch mit dem deinstallieren Settings App . Gehe zumSettings -> Apps -> Find the app -> Uninstall

Hoffe das hilft jemandem, der das gleiche Problem hat wie ich.

Reaz Murshed
quelle
0

Früher hieß es, dass auf dem Gerät eine App mit einer anderen Signatur gefunden wird. Bei der Installation von IDE wird auch gefragt, ob Sie es deinstallieren möchten.

Aber ich denke, von Android 5.0 haben sie den Grund für die Deinstallation geändert. Es passiert nicht, wenn Sie eine App mit derselben Signatur installieren

Yasir
quelle
0

Ich habe das gleiche Problem mit einem Nexus 5 Android Lollipop 5.0.1 festgestellt:

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

Und in meinem Fall konnte ich dieses Problem uninstallingder App nicht beheben, weil es eine war android app, aber ich musste meinen App- custom permissionsNamen in ändernmanifest da sie mit einer Android-App identisch waren, die ich nicht deinstallieren oder ändern konnte.

Hoffe das hilft jemandem!

Ultimo_m
quelle
0

In meinem Fall habe ich folgenden Fehler erhalten

Installationsfehler: INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.map.permission.MAPS_RECEIVE pkg = com.abc.Firstapp

Als ich versuchte, die App zu installieren, die den Paketnamen hat com.abc.Secondapp. Hier war der Punkt, dass die App mit dem Paketnamen com.abc.Firstappbereits in meiner Anwendung installiert war.

Ich habe diesen Fehler behoben, indem ich die Anwendung mit dem Paketnamen deinstalliert habe com.abc.Firstapp und dann die Anwendung mit dem Paketnamen installiert habecom.abc.Secondapp

Ich hoffe, das hilft jemandem beim Testen.

Abhinav Singh Maurya
quelle
0

Ändern Sie in Ihrer AndroidManifest.xml-Datei die Namen Ihrer speziell deklarierten Berechtigungen, zum Beispiel:

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

dazu,

<!-- 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 Dieser Teil löst den Konflikt mit Ihrer anderen App.

resw67
quelle
0

In meinem Fall habe ich eine Drittanbieter-Bibliothek (z. B. einen Anbieter) verwendet und die Bibliothek enthält eine Beispiel-App, die ich bereits auf meinem Gerät installiert hatte. Diese Beispiel-App war jetzt jedes Mal in Konflikt, wenn ich versuche, meine eigene App zu installieren, die die Bibliothek implementiert. Also habe ich gerade die Beispiel-App des Anbieters deinstalliert und sie funktioniert danach.

Nouvel Travay
quelle
0

Ich habe die vorherige Version deinstalliert. Es hat bei mir funktioniert.

Sushil Dhayal
quelle
0

Ich habe mein Telefon nach der Deinstallation der App neu gestartet und es hat funktioniert

Pedro Martins
quelle
0

Wenn Sie eine andere Variante der App haben, deinstallieren Sie diese zuerst. Dies hat mir geholfen, als ich das gleiche Problem hatte.

olleh
quelle