INSTALL_FAILED_DUPLICATE_PERMISSION… C2D_MESSAGE

179

Korzystam z powiadomień Google w mojej aplikacji i do tej pory zrobiłem poniżej w manifeście:

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

Działa idealnie, dopóki nie zaktualizowałem Nexusa 7 do Androida 5.0.
Teraz, gdy próbuję zainstalować aplikację na tym urządzeniu za pomocą Eclipse, pojawia się ten błąd:

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

Nie rozumiem co jest nie tak? Działało idealnie aż do Androida 5.0.
Wiem, że używam C2D_MESSAGEw dwóch wierszach, permissiona uses-permissionjednak mam kopiowane tego kodu z oryginalnego przewodnika Google GCM, więc musi być dobrze.

NullPointerException
źródło
20
To, co pierwotnie wziąłeś za niejasny błąd (cóż, zrobiłem…), to w rzeczywistości nowa funkcja bezpieczeństwa, która uniemożliwia dwóm aplikacjom zgłoszenie tego samego niestandardowego uprawnienia podpisanego innym podpisem, które ma zostać zainstalowane na urządzeniu
AZ_

Odpowiedzi:

231

Znalazłem rozwiązanie, które działa dla mnie.

Na moim urządzeniu (Nexus 7) Android 5.0. Lollipop Postępuję według tych kroków.

Po odinstalowaniu aplikacji znajdziesz App Namew liście aplikacji na Downloadedkarcie.

  • Przejdź do ustawień
  • Aplikacje
  • Na dole listy znajduje YourAppsię tag „NIE ZAINSTALOWANY”
  • otwarty
  • Kliknij OptionMenui wybierz „Odinstaluj dla wszystkich użytkowników”

Po wykonaniu tych kroków pomyślnie zainstalowałem nową aplikację i działa ona dobrze.

Pratik Butani
źródło
6
Mam nave nexus 9 z Androidem 5.0.1 i nie widzę mojej aplikacji z tagiem „noto install”
xXJohnRamboXx
To zadziałało dla mnie, dzięki! Mój problem był nieco inny. Przeprowadzam automatyczne testy (Xamarin.UITest) na naszej aplikacji mobilnej i przesłałem inną wersję do niektórych testów ręcznych. Kiedy próbowałem załadować aplikację (za pomocą VS / Xamarin UITest) na urządzenie, zacząłem widzieć ten problem. Dzięki jeszcze raz.
LuFaMa,
To powinna być poprawna odpowiedź: stackoverflow.com/a/27767179/343679
Sharj
@Pratik Butani Rozwiązanie zadziałało dla mnie. Chciałbym poznać przyczynę błędu? Czy mógłbyś wyjaśnić?
Karthikeyan Ve
1
Nie mogę znaleźć mojej aplikacji na dole listy z tagiem NOT INSTALLED . Co masz na myśli?
IgorGanapolsky
139

Usunąć

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

Uruchom aplikację ... Następnie ponownie dodaj zezwolenie i uruchom aplikację.

Gotowy!.

Delmirio Segura
źródło
31
Ta odpowiedź powinna być na górze, ponieważ ten problem często występuje, gdy próbujesz zainstalować debugowanie i wydanie wersji aplikacji na tym samym urządzeniu. Dzięki temu rozwiązaniu możesz to łatwo zrobić. Nie wiedziałem, że możesz używać zmiennych w manifeście. Głosuj!
florian
4
Ta odpowiedź nie działa, jeśli aplikacja jest już w produkcji. Nie mogę oczekiwać, że użytkownicy mojej aplikacji pobiorą nową wersję bez uprawnień, a następnie ponownie zainstalują nowszą wersję z uprawnieniami.
nilsmagnus,
5
Jeśli tak się dzieje, ponieważ masz debugowanie i wydanie wersji aplikacji o różnych nazwach, odinstalowanie nie jest konieczne, aby działało: wystarczy użyć ${applicationId}zamiast na
stałe zapisać
1
Użycie $ {applicationId} zamiast statycznego identyfikatora aplikacji rozwiązało mój problem !! W tym podczas korzystania ze smaków !!!!
JannGabriel,
1
Komentarz @ yuval jest na miejscu i rozwiązał to dla mnie. Spośród wielu odpowiedzi ta najlepiej opisuje problem: stackoverflow.com/a/36992939/56285
Jonik
49

Miałem ten sam problem z niestandardowym uprawnieniem do podpisu na Androidzie-21 i rozwiązałem go, upewniając się, że robię pełną deinstalację.

Jest to przypadek skrajny, który występuje, gdy:

  1. Aplikacja definiuje niestandardowe uprawnienia przy użyciu zabezpieczeń na poziomie podpisu
  2. Próbujesz zaktualizować zainstalowaną aplikację wersją podpisaną innym kluczem
  3. Na urządzeniu testowym działa system Android 21 lub nowszy z obsługą wielu użytkowników

Przykład wiersza poleceń

Oto transkrypcja z wiersza poleceń, która pokazuje problem i sposób jego rozwiązania. W tym momencie jest zainstalowana wersja debugująca i próbuję zainstalować wersję produkcyjną podpisaną kluczem wydania:

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

Przykład zaćmienia

Idąc w przeciwnym kierunku (próbując zainstalować kompilację debugowania z Eclipse, gdy kompilacja wersji jest już zainstalowana), pojawia się następujące okno dialogowe:

Okno dialogowe ponownej instalacji Eclipse

Jeśli po prostu odpowiesz „tak”, instalacja się powiedzie.

Przykład urządzenia

Jak wskazano w innej odpowiedzi, możesz również przejść do strony informacyjnej aplikacji w ustawieniach urządzenia, kliknąć menu przepełnienia i wybrać „Odinstaluj dla wszystkich użytkowników”, aby zapobiec temu błędowi.

kod x
źródło
Dzięki, ale powinieneś zacząć odpowiedź od „możesz również przejść do strony informacyjnej aplikacji w ustawieniach urządzenia, kliknąć menu przepełnienia i wybrać„ Odinstaluj dla wszystkich użytkowników ”, aby zapobiec temu błędowi”.
yajnesh
Wyjdź za mnie proszę. Po redakcji przeszedłem do Ustawienia> Aplikacje, dotknij w starej wersji aplikacji i w menu opcji wybierz „Odinstaluj dla wszystkich użytkowników”.
Fabricio PH,
# 2 listy warunków wstępnych nie musi być prawdą. W moim przypadku nie aktualizuję aplikacji, ale instaluję kompilację do debugowania tej samej aplikacji z inną nazwą pakietu, jak opisano w tym proceudre. stackoverflow.com/a/21006552/507339 . To problem, dla którego nie widzę rozwiązania
Nilzor,
33

Rozwiązałem to bez konieczności uciekania się do odinstalowania alternatywnego apk (co za ból, prawda?). Aby pomyślnie zainstalować zarówno wersję debugowania, jak i wydanie apka, po prostu użyj wbudowanego symbolu gradle $ {applicationId} w pliku AndroidManifest.xml, aby zmodyfikować wartości android: uprawnienia w czasie kompilacji.

Fragment pliku build.gradle:

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

Fragment pliku AndroidStudio.xml:

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

Możesz sprawdzić zmodyfikowany plik AndroidManifest.xml w apk za pomocą, aapt l -a app-debug.apkaby upewnić się, że symbol zastępczy został poprawnie zastosowany. Jeśli używasz różnych smaków produktów, jestem pewien, że możesz zastosować odmianę tej metody, aby dopasować ją do swoich potrzeb.

Jackpile
źródło
wygląda na to, że jeśli zdefiniuję inny applicationIdw dwóch różnych productFlavorsi zastosuję ${applicationId}efekt będzie taki sam.
Robert
Myślę, że jest to bardziej niezawodne rozwiązanie, jeśli potrzebujesz więcej niż jednego smaku.
Robert
należy to zaznaczyć poprawnie. biorąc pod uwagę, że od każdego współpracownika nie można oczekiwać od hakowania, aby po prostu zbudować projekt i zainstalować apk
goemic
Dzięki, @jackpile aplikacja działa dla mnie idealnie, jest tylko jeden problem, jeśli są zarówno kompilacje wydania, jak i debugowania, a następnie po zainstalowaniu kompilacji debugowania kompilacja wersji otwiera się zamiast tego
Prateek Surana
to powinno być oznaczone jako poprawna odpowiedź .. dzięki @Jackpile
ahmed ewess
28

Usuń z pliku manifestu wszelkie odniesienia „Hard Coded” do nazwy pakietu.

(Jest to najlepsza praktyka, nawet jeśli nie używasz productFlavors)

Na przykład jeśli manifest zawiera:

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

Zmieniono na:

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

Następnie w pliku ocen modułu ustaw odpowiednie 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
    }
}

Możesz wykonać ten samouczek, aby uzyskać więcej informacji

David
źródło
2
za pomocą ${applicationId}naprawiłem problem dla mnie!
Andy
W jaki sposób rozwiązuje to wspomniany problem?
Vincent
18

spróbuj odinstalować aplikację z adb:

adb uninstall com.yourpackage
Giuseppe
źródło
Dziwne, po prostu musiałem to zrobić na moim Nexusie 6, mimo że odinstalowałem mój APK za pomocą interfejsu systemu ORAZ nie wyświetlał się pod zainstalowanymi aplikacjami.
Jon Willis,
Dało mi to Failure [DELETE_FAILED_INTERNAL_ERROR]. Co może być przyczyną?
Reaz Murshed
17

Podając ten błąd, wyraźnie poda nazwę pakietu aplikacji, z powodu której odmówiono pozwolenia. A samo odinstalowanie aplikacji nie rozwiąże problemu. Aby rozwiązać problem, musimy wykonać następujący krok:

  1. Przejdź do ustawień
  2. Przejść do aplikacji
  3. Przejdź do listy pobranych aplikacji
  4. Odinstalowaną aplikację można zobaczyć na liście
  5. Kliknij aplikację, przejdź do opcji więcej
  6. Kliknij opcję odinstaluj, aby wyświetlić opcje wszystkich użytkowników

Problem rozwiązany: D

Preethi Rao
źródło
8

Instalując aplikację w systemie OS 5.0, pojawia się następujący komunikat:

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

Nie ma zduplikowanych pakietów i możemy rozwiązać ten problem ręcznie odinstalowując starą aplikację lub używając adb:

adb uninstall com.yourpackage

Jorgesys
źródło
5

Żadne z powyższych nie działało dla mnie. Moja aplikacja działała dobrze w poprzednich wersjach niż Lollipop. Ale kiedy przetestowałem to na Lollipop, pojawił się powyższy błąd. Odmówił instalacji. Nie miałem zainstalowanych wcześniejszych wersji, więc wszystkie powyższe rozwiązania są nieprawidłowe w moim przypadku. Ale dzięki temu rozwiązaniu SO działa teraz dobrze. Podobnie jak większość programistów zastosowałem wprowadzający w błąd samouczek Google i dodałem uprawnienia, kopiując i wklejając w następujący sposób:

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

Działa to ze starszymi wersjami <Lollipop. Teraz zmieniłem na:

<uses-permission android:name="com.mycompany.myappname.c2dm.permission.RECEIVE" />
<permission android:name="com.mycompany.myappname.permission.C2D_MESSAGE" 
            android:protectionLevel="signature" />
Marsjanin
źródło
4

Plik CommonsWare ma rację, ale moim zdaniem jest to (błędny) sposób na powiedzenie: „Aplikacja zainstalowana na urządzeniu jest podpisana innym certyfikatem niż nowy, który próbujesz zainstalować” .

Jest to prawdopodobnie nowy błąd, ponieważ w przeszłości pytał, czy odinstalować aplikację z urządzenia z powodu złego certyfikatu.

Rozwiązaniem tak bolesnym, jak to by było, byłoby odinstalowanie aplikacji ręcznie.

Również to, co zrobiliśmy dla rozwoju zespołu, dodaliśmy do naszego repozytorium plik kluczy debugowania i stopniowe wykorzystanie, aby użyć go w następujący sposób:

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

A teraz, gdy przekazujemy urządzenia między członkami zespołu, wszyscy używamy tego samego certyfikatu debugowania, więc nie ma problemu. :)

TacB0sS
źródło
4

W systemie Android 5 sprawdź ustawienia -> aplikacje. Zamiast usuwania tylko dla aktywnego użytkownika (ponieważ Android 5 może mieć wielu użytkowników, a mój telefon miał gościa), dotknij przycisku akcesoriów w prawym górnym rogu akcji / paska narzędzi i wybierz „odinstaluj dla wszystkich użytkowników”. Wygląda na to, że w Androidzie 5 po odinstalowaniu z programu uruchamiającego odinstalowujesz aplikację tylko dla aktywnego użytkownika.

Aplikacja jest nadal na urządzeniu .. To mnie olśniło, ponieważ próbowałem zainstalować wersję, nie działało, więc pomyślałem, że tak musi być, ponieważ nadal mam zainstalowaną wersję debugowania, odinstalowałem aplikację. Ale nadal nie można go zainstalować. Pierwszą wskazówką był zapis na liście aplikacji odinstalowanej aplikacji wraz z komunikatem, że została odinstalowana (obraz).

Odinstalowana aplikacja nadal pojawia się w aplikacjach Odinstalowano dla wszystkich użytkowników

Jordy
źródło
Sry, przejrzałem twój komentarz. Rozważymy to jako dodatkowy post informacyjny ze zdjęciami.
Jordy,
2

Zobacz ten link , powiedział, że będzie działać, gdy zostaną podpisane tym samym kluczem. Klucz zwolnienia i klucz debugowania nie są takie same.

Więc zrób to:

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
źródło
1

zamień poniższe wiersze:

<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
źródło
1

W moim przypadku zainstalowałem kilka aplikacji o tej samej nazwie domeny w nazwie pakietu w następujący sposób.

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

Musiałem odinstalować wszystkie aplikacje o podobnych nazwach pakietów i ponownie je zainstalować, aby pozbyć się problemu.

Aby znaleźć wszystkie nazwy pakietów z urządzenia, użyłem następujących.

adb shell pm list packages

Następnie złapałem pakiety, które pasują do nazwy mojego pakietu, którego szukam.

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

Następnie odinstalowałem wszystkie aplikacje mające tę domenę.

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

Możesz także odinstalować aplikacje za pomocą Settingsaplikacji. Idź doSettings -> Apps -> Find the app -> Uninstall

Mam nadzieję, że to pomoże komuś, kto ma taki sam problem jak ja.

Reaz Murshed
źródło
0

Wcześniej mówiono, że na urządzeniu znajduje się aplikacja o innym podpisie. Podczas instalacji z IDE zapyta również, czy chcesz go odinstalować?

Ale myślę, że z Androida 5.0 zmienili przyczynę odinstalowania. Nie dzieje się tak, jeśli instalujesz aplikację z tym samym podpisem

Yasir
źródło
0

Napotkałem ten sam problem z Nexusem 5 Android Lollipop 5.0.1:

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

W moim przypadku nie mogłem rozwiązać tego problemu, uninstallingponieważ była to aplikacja android app, ale musiałem zmienić custom permissionsnazwę mojej aplikacji, manifestponieważ były one takie same jak aplikacja na Androida, której nie mogłem odinstalować ani zmienić.

Mam nadzieję, że to komuś pomoże!

Ultimo_m
źródło
0

W moim przypadku otrzymałem następujący błąd

Błąd instalacji: INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.map.permission.MAPS_RECEIVE pkg = com.abc.Firstapp

Kiedy próbowałem zainstalować aplikację, która ma nazwę pakietu com.abc.Secondapp. Tutaj chodziło o to, że aplikacja z nazwą pakietu com.abc.Firstappzostała już zainstalowana w mojej aplikacji.

Rozwiązałem ten błąd, odinstalowując aplikację z nazwą pakietu, com.abc.Firstappa następnie instalując aplikację z nazwą pakietucom.abc.Secondapp

Mam nadzieję, że to komuś pomoże podczas testowania.

Abhinav Singh Maurya
źródło
0

W pliku AndroidManifest.xml zmień nazwy specjalnie zadeklarowanych uprawnień, na przykład:

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

do tego,

<!-- 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 ta część rozwiązuje konflikt z inną aplikacją.

resw67
źródło
0

W moim przypadku korzystałem z biblioteki innej firmy (tj. Dostawcy), a do biblioteki dołączona jest przykładowa aplikacja, którą już zainstalowałem na swoim urządzeniu. Tak więc ta przykładowa aplikacja była teraz w konflikcie za każdym razem, gdy próbuję zainstalować własną aplikację implementującą bibliotekę. Właśnie odinstalowałem przykładową aplikację dostawcy i działa ona później.

Nouvel Travay
źródło
0

Odinstalowałem poprzednią wersję. To zadziałało dla mnie.

Sushil Dhayal
źródło
0

Uruchomiłem ponownie telefon po odinstalowaniu aplikacji i zadziałało

Pedro Martins
źródło
0

Jeśli masz inny smak aplikacji, spróbuj ją najpierw odinstalować. Pomogło mi to, gdy miałem ten sam problem.

olleh
źródło