INSTALL_FAILED_DUPLICATE_PERMISSION… C2D_MESSAGE


179

Sto usando le notifiche di Google nella mia app e fino ad ora ho fatto di seguito nel manifest:

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

Ha funzionato perfettamente fino a quando non ho aggiornato il mio Nexus 7 ad Android 5.0.
Ora quando provo a installare l'app in questo dispositivo con Eclipse, ottengo questo errore:

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

Non capisco cosa c'è che non va? Funzionava perfettamente fino ad Android 5.0.
So che sto usando C2D_MESSAGEin due linee, permissione uses-permissionma ho copiato il codice dalla guida originale di Google GCM, quindi deve andare bene.


20
Ciò che originariamente prendevi per un bug oscuro (beh, l'ho fatto ...) è in realtà una nuova funzionalità di sicurezza che impedisce a due app di dichiarare la stessa autorizzazione personalizzata firmata con una firma diversa, da installare su un dispositivo
AZ_

Risposte:


231

Ho trovato una soluzione che funziona per me.

Nel mio dispositivo (Nexus 7) Android 5.0. Lecca-lecca Seguo questi passaggi.

Dopo aver disinstallato l'app, troverai l' App Nameelenco delle app nella Downloadedscheda.

  • Vai alle impostazioni
  • applicazioni
  • In fondo all'elenco troverai YourAppun tag "NON INSTALLATO"
  • Aperto
  • Fare clic su OptionMenue selezionare "Disinstalla per tutti gli utenti"

Dopo questi passaggi, ho installato con successo la nuova app e funziona bene.


6
I nave nexus 9 con Android 5.0.1 e non riesco a vedere la mia app con il tag "noto installato"
xXJohnRamboXx

Questo ha funzionato per me, grazie! Il mio problema era leggermente diverso. Sto eseguendo test automatizzati (Xamarin.UITest) sulla nostra app mobile e ho caricato una versione diversa per alcuni test manuali. Quando ho tentato di caricare l'app (tramite VS / Xamarin UITest) sul dispositivo, ho iniziato a vedere questo problema. Grazie ancora.
LuFaMa,

Questo dovrebbe essere la risposta corretta: stackoverflow.com/a/27767179/343679
Sharj

@Pratik Butani La soluzione ha funzionato per me. Vorrei sapere il motivo per cui si è verificato l'errore? Potresti spiegare per favore?
Karthikeyan Ve,

1
Non trovo la mia app in fondo all'elenco con il tag NON INSTALLATO . Cosa intendi?
IgorGanapolsky,

139

Rimuovere

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

Esegui app ... Quindi aggiungi nuovamente il permisson ed Esegui app.

Pronto!.


31
Questa risposta dovrebbe essere in primo piano poiché questo problema si verifica spesso quando si tenta di installare il debug e rilasciare la versione dell'app sullo stesso dispositivo. Con questa soluzione puoi farlo facilmente. Non sapevo che puoi usare le variabili nel manifest. Upvote!
Florian,

4
Questa risposta non funziona se l'app è già in produzione. Non posso aspettarmi che gli utenti della mia app scarichino una nuova versione senza le autorizzazioni e quindi installino nuovamente una versione più recente con le autorizzazioni.
nilsmagnus,

5
Se questo ti sta accadendo perché hai versioni di debug e di rilascio della tua app con nomi diversi, non è necessaria una disinstallazione per farlo funzionare: devi solo usare ${applicationId}invece di
hardcodificarlo

1
L'uso di $ {applicationId} invece dell'ID applicazione statica ha risolto il mio problema !! Anche quando si usano i sapori !!!!
JannGabriel,

1
Il commento di @ yuval è perfetto e lo ha risolto per me. Fuori dei tanti risposta, questo uno migliori coperture il problema: stackoverflow.com/a/36992939/56285
Jonik

49

Ho avuto lo stesso problema con un'autorizzazione di firma personalizzata su Android-21 e l'ho risolto assicurandomi di eseguire una disinstallazione completa.

Questo è un caso limite che si verifica quando:

  1. Un'applicazione definisce un'autorizzazione personalizzata utilizzando la sicurezza a livello di firma
  2. Si tenta di aggiornare l'app installata con una versione firmata con una chiave diversa
  3. Il dispositivo di test esegue Android 21 o versioni successive con supporto per più utenti

Esempio da riga di comando

Ecco una trascrizione da riga di comando che dimostra il problema e come risolverlo. A questo punto viene installata una versione di debug e sto provando a installare una versione di produzione firmata con la chiave di rilascio:

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

Esempio di eclissi

Andando nella direzione opposta (cercando di installare una build di debug da Eclipse quando è già installata una build di rilascio), ottengo la seguente finestra di dialogo:

Finestra di dialogo di reinstallazione di Eclipse

Se rispondi sì a questo punto, l'installazione avrà esito positivo.

Esempio di dispositivo

Come indicato in un'altra risposta, puoi anche andare a una pagina di informazioni sull'app nelle impostazioni del dispositivo, fare clic sul menu di overflow e selezionare "Disinstalla per tutti gli utenti" per evitare questo errore.


Grazie, ma dovresti iniziare la tua risposta con "puoi anche andare a una pagina di informazioni sull'app nelle impostazioni del dispositivo, fare clic sul menu di overflow e selezionare" Disinstalla per tutti gli utenti "per prevenire questo errore."
Yajnesh,

Sposami perfavore. Dopo la tua redazione, sono andato su Impostazioni> App, tocca nella vecchia versione dell'app e nel menu delle opzioni seleziona "Disinstalla per tutti gli utenti".
Fabricio PH,

Il numero 2 del tuo elenco di condizioni preliminari non deve essere vero. Nel mio caso non sto aggiornando l'app, ma installando una build di debug della stessa app con un nome di pacchetto diverso come descritto in questo proceudre. stackoverflow.com/a/21006552/507339 . Questo è un problema a cui non vedo una soluzione
Nilzor

33

Ho risolto questo problema senza dover ricorrere prima alla disinstallazione dell'apk alternativo (che dolore, vero?). Per installare correttamente sia una versione di debug sia una versione di rilascio di un apk, usa semplicemente il segnaposto $ {applicationId} incorporato in AndroidManifest.xml per modificare i valori di android: name al momento della compilazione.

Lo snippet di file build.gradle:

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

Lo snippet di file AndroidStudio.xml:

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

Puoi controllare il file AndroidManifest.xml modificato all'interno dell'apk usando aapt l -a app-debug.apkper assicurarti che il segnaposto sia stato applicato correttamente. Se utilizzi vari gusti di prodotto, sono sicuro che puoi applicare una variante di questo metodo in base alle tue esigenze.


sembra che se definisco diverso applicationIdin due diversi productFlavors, e uso ${applicationId}l'effetto sarà lo stesso.
Robert,

Penso che questa sia una soluzione più robusta se hai bisogno di più di 1 sapore.
Robert,

questo dovrebbe essere contrassegnato come corretto. considerando che non puoi aspettarti da ogni collega di fare un po 'di hack per costruire semplicemente un progetto e installare l'apk
goemic

Grazie, @jackpile l'app funziona perfettamente per me c'è solo un problema se ci sono sia build di debug che di versione installate, quindi dopo l'installazione della build di debug si apre la build di rilascio
Prateek Surana,

questa dovrebbe essere contrassegnata come la risposta corretta .. grazie @Jackpile
ahmed ewess

28

Rimuovere qualsiasi riferimento "Hard Coded" del nome del pacchetto dal file manifest.

(Questa è la migliore pratica anche se non si utilizza productFlavors)

Ad esempio, se il tuo manifest contiene:

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

Modificato in:

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

Quindi, nel tuo file di gradle del modulo, imposta il tuo rilevante 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
    }
}

Puoi seguire questo tutorial per maggiori informazioni


2
usando ${applicationId}risolto il problema per me!
Andy,

In che modo questo risolve il problema menzionato?
Vincent,

18

prova a disinstallare l'app con adb:

adb uninstall com.yourpackage

Bizzarro, dovevo solo fare questo sul mio Nexus 6, anche se avevo disinstallato il mio APK attraverso l'interfaccia utente del sistema E non veniva visualizzato nelle app installate.
Jon Willis,

Mi ha dato Failure [DELETE_FAILED_INTERNAL_ERROR]. Quale potrebbe essere la ragione?
Reaz Murshed

17

Durante la visualizzazione di questo errore, verrà indicato chiaramente il nome del pacchetto dell'app a causa del quale è stata negata l'autorizzazione. E la semplice disinstallazione dell'applicazione non risolverà il problema. Per risolvere il problema, dobbiamo procedere come segue:

  1. Vai alle impostazioni
  2. Vai all'app
  3. Vai all'elenco delle app scaricate
  4. È possibile visualizzare l'applicazione disinstallata nell'elenco
  5. Fai clic sull'applicazione, vai a più opzioni
  6. Fai clic su Disinstalla per tutte le opzioni degli utenti

Problema risolto: D


8

Installando un'applicazione in OS 5.0 ricevo questo messaggio:

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

Non ci sono pacchetti duplicati e possiamo risolvere questo problema disinstallando manualmente la vecchia applicazione o usando l'adb:

adb uninstall com.yourpackage


5

Nessuna delle precedenti ha funzionato per me. La mia app funzionava bene in precedenza rispetto a Lollipop. Ma quando l'ho provato su Lollipop è apparso l'errore sopra. Si è rifiutato di installare. Non avevo installato alcuna versione precedente, quindi tutte le soluzioni sopra riportate non sono valide nel mio caso. Ma grazie a questa soluzione SO ora funziona bene. Proprio come la maggior parte degli sviluppatori, ho seguito il tutorial fuorviante di Google e ho aggiunto le autorizzazioni copiando e incollando in questo modo:

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

Funzionerebbe con le versioni precedenti <Lollipop. Quindi ora sono passato a:

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

4

CommonsWare ha ragione, ma secondo me questo è un modo (bug) scarso per dire: "L'apk installato sul dispositivo è firmato con un certificato diverso da quello nuovo che si sta tentando di installare" .

Probabilmente si tratta di un nuovo bug poiché in passato chiedeva se disinstallare l'app dal dispositivo a causa di un certificato errato.

La soluzione più dolorosa potrebbe essere quella di disinstallare l'app manualmente.

Inoltre, ciò che abbiamo fatto per lo sviluppo del team, abbiamo aggiunto il keystore di debug al nostro repository e abbiamo indicato il grado per usarlo in questo modo:

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

E ora quando passiamo i dispositivi tra i membri del team, usiamo tutti lo stesso certificato di debug, quindi non ci sono problemi. :)


4

In Android 5, controlla le tue impostazioni -> app. Invece di eliminare solo per l'utente attivo (poiché Android 5 può avere più utenti e il mio telefono aveva un utente ospite) tocca il pulsante accessorio nell'angolo in alto a destra dell'azione / barra degli strumenti e scegli "disinstalla per tutti gli utenti". Sembra che in Android 5 quando si disinstalla dal programma di avvio si disinstalli solo l'app per l'utente attivo.

L'app è ancora sul dispositivo .. Questo mi ha fatto impazzire da quando stavo cercando di installare una versione di rilascio, non ha funzionato, quindi ho pensato che fosse giusto perché ho ancora installato la versione di debug, ho disinstallato l'app. Ma che ancora non è stato possibile installare. Il primo indizio era un record nell'elenco delle app dell'app disinstallata con il messaggio accanto che era stato disinstallato (immagine).

App disinstallata ancora visualizzata nelle app Disinstallato per tutti gli utenti


Sry, ho guardato il tuo commento. Lo considereremo solo un post informativo aggiuntivo con immagini.
Jordy,

2

Vedi questo link ha detto che funzionerà quando sono firmati con la stessa chiave. La chiave di rilascio e la chiave di debug non sono uguali.

Allora fallo:

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

sostituire le righe seguenti:

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

1

Nel mio caso, avevo installato diverse applicazioni con lo stesso nome di dominio nel nome del pacchetto come segue.

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

Ho dovuto disinstallare tutte le app con nomi di pacchetti simili e reinstallarle di nuovo per eliminare il problema.

Per trovare tutti i nomi dei pacchetti dal dispositivo ho usato quanto segue.

adb shell pm list packages

Quindi ho preso i pacchetti che corrispondono al nome del mio pacchetto che sto cercando.

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

Quindi disinstallato tutte le app con quel dominio.

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

Puoi anche disinstallare le applicazioni usando il Settings app. Vai alSettings -> Apps -> Find the app -> Uninstall

Spero che questo aiuti qualcuno che ha lo stesso problema.


0

In precedenza si diceva che sul dispositivo è stata trovata un'app con firma diversa. Quando si installa da IDE, si chiede anche se si desidera disinstallarlo?

Ma penso che da Android 5.0 abbiano cambiato il motivo della disinstallazione. Non succede se stai installando un'app con la stessa firma


0

Ho riscontrato lo stesso problema con un Nexus 5 Android Lollipop 5.0.1:

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

E nel mio caso non ho potuto risolvere questo problema con uninstallingl'app perché era un android app, ma ho dovuto cambiare il custom permissionsnome della mia appmanifest perché erano uguali a un'app Android, che non è stato possibile disinstallare o apportare modifiche.

Spero che questo aiuti qualcuno!


0

Nel mio caso ho ricevuto il seguente errore

Errore di installazione: INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.map.permission.MAPS_RECEIVE pkg = com.abc.Firstapp

Quando stavo cercando di installare l'app con il nome del pacchetto com.abc.Secondapp. Qui il punto era che l'app con il nome del pacchetto com.abc.Firstappera già installata nella mia applicazione.

Ho risolto questo errore disinstallando l'applicazione con il nome del pacchetto com.abc.Firstapp e quindi installando l'applicazione con il nome del pacchettocom.abc.Secondapp

Spero che questo possa aiutare qualcuno durante i test.


0

Nel tuo file AndroidManifest.xml, modifica i nomi delle autorizzazioni appositamente dichiarate, ad esempio:

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

a questa,

<!-- 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 questa parte risolve il conflitto con l'altra app.


0

Nel mio caso stavo usando una libreria di terze parti (vale a dire il fornitore) e la libreria viene fornita con un'app di esempio che avevo già installato sul mio dispositivo. Quindi quell'app di esempio ora era in conflitto ogni volta che provo a installare la mia app implementando la libreria. Quindi ho appena disinstallato l'app di esempio del fornitore e funziona in seguito.




0

Se hai un sapore diverso dell'app, prova prima a disinstallarlo. Questo mi ha aiutato quando ho avuto lo stesso problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.