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하지만 잘해야합니다, 그래서 나는 원래 구글 GCM 가이드에서 해당 코드를 복사 한.


20
당신이 원래 (물론, 내가 ... 한) 무명의 버그를했다하는 것은 실제로 다른 서명으로 서명됩니다 같은 사용자 지정 권한을 선언에서 두 개의 응용 프로그램을 방지하는 새로운 보안 기능으로, 장치에 설치하기
AZ_

답변:


231

나에게 맞는 솔루션을 찾았습니다.

내 장치 (Nexus 7)에서 Android 5.0. 롤리팝 다음 단계를 따릅니다.

앱을 제거한 후 탭의 App Name앱 목록 아래에 Downloaded있습니다.

  • 설정으로 바로 가기
  • 목록 맨 아래 YourApp에는 "설치되지 않음"태그가 있습니다.
  • 열다
  • 를 클릭 OptionMenu하고 "모든 사용자 제거"를 선택하십시오

이 단계가 끝나면 새 앱을 성공적으로 설치하고 제대로 실행됩니다.


6
나는 안드로이드 5.0.1로 넥서스 9를
봤는데

이것은 나를 위해 일했습니다. 감사합니다! 내 문제는 약간 달랐습니다. 모바일 앱에서 자동 테스트 (Xamarin.UITest)를하고 있으며 일부 수동 테스트를 위해 다른 버전을 업로드했습니다. VS / Xamarin UITest를 통해 앱을 장치에로드하려고 할 때이 문제가 발생하기 시작했습니다. 다시 감사합니다.
LuFaMa

정답이어야합니다. stackoverflow.com/a/27767179/343679
Sharj

@ Pratik Butani 솔루션이 나를 위해 일했습니다. 오류가 발생한 이유를 알고 싶습니다. 설명해 주시겠습니까?
Karthikeyan Ve

1
NOT INSTALLED 태그 가있는 목록 하단에서 내 앱을 찾을 수 없습니다 . 무슨 소리 야?
IgorGanapolsky

139

없애다

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

앱 실행 ... 그런 다음 권한을 다시 추가하고 앱을 실행하십시오.

준비된!.


31
이 문제는 동일한 장치에 앱의 디버그 및 릴리스 버전을 설치하려고 할 때 종종 발생하므로이 답변이 맨 위에 있어야합니다. 이 솔루션을 사용하면 쉽게 할 수 있습니다. 매니페스트에서 변수를 사용할 수 있다는 것을 몰랐습니다. 공감!
florian

4
앱이 이미 프로덕션 환경에 있으면이 답변이 작동하지 않습니다. 앱 사용자가 권한없이 새 버전을 다운로드 한 다음 권한이있는 새 버전을 다시 설치할 것으로 기대할 수 없습니다.
nilsmagnus

5
이름이 다른 앱의 디버그 및 릴리스 버전이 있기 때문에 이런 일이 발생하면 제거 할 필요가 없습니다. ${applicationId}하드 코딩 대신 대신 사용하면 됩니다.
yuval

1
정적 응용 프로그램 ID 대신 $ {applicationId}를 사용하면 문제가 해결되었습니다! 풍미 사용시 포함 !!!!
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의 디버그 및 릴리스 버전을 모두 성공적으로 설치하려면 AndroidManifest.xml 내에서 gradle의 내장 $ {applicationId} 자리 표시자를 사용하여 컴파일시 권한의 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"/>

aapt l -a app-debug.apk자리 표시자가 올바르게 적용되었는지 확인하기 위해 apk 내에서 수정 된 AndroidManifest.xml 파일을 검사 할 수 있습니다 . 다양한 제품 맛을 사용하는 경우 필요에 따라이 방법의 변형을 적용 할 수 있습니다.


내가 다른 정의 할 경우 것 같다 applicationId두 가지로 productFlavors, 사용이 ${applicationId}효과가 동일합니다.
로버트

나는 당신이 1 개 이상의 맛을 필요로한다면 이것이 더 강력한 해결책이라고 생각합니다.
로버트

이것은 올바른 것으로 표시되어야합니다. 모든 동료가 단순히 프로젝트를 빌드하고 apk를 설치하기 위해 해킹을 할 것을 기대할 수는 없습니다.
goemic

고마워, @jackpile 응용 프로그램이 완벽하게 잘 실행되는 경우 릴리스 및 디버그 빌드가 모두 설치된 경우 디버그 빌드를 설치 한 후 릴리스 빌드가 대신 열립니다.
Prateek Surana

이것은 .. 정답으로 @Jackpile 감사 표시해야
아메드 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}나를 위해 문제를 해결!
Andy

이 문제가 언급 된 문제를 어떻게 해결합니까?
빈센트

18

adb를 사용하여 앱을 제거하십시오.

adb uninstall com.yourpackage

기괴한, 시스템 UI를 통해 APK를 제거했는데 설치된 앱에서 표시되지 않았지만 Nexus 6에서이 작업을 수행해야했습니다.
Jon Willis

그것은 나에게 주었다 Failure [DELETE_FAILED_INTERNAL_ERROR]. 이유가 무엇입니까?
Reaz Murshed 2018 년

17

이 오류가 발생하면 권한이 거부 된 앱의 패키지 이름을 명확하게 언급합니다. 그리고 응용 프로그램을 제거해도 문제가 해결되지 않습니다. 문제를 해결하려면 다음 단계를 수행해야합니다.

  1. 설정으로 바로 가기
  2. 앱으로 이동
  3. 다운로드 한 앱 목록으로 이동
  4. 목록에서 제거 된 응용 프로그램을 볼 수 있습니다
  5. 응용 프로그램을 클릭하고 더 많은 옵션으로 이동하십시오
  6. 모든 사용자 옵션 에 대해 제거를 클릭하십시오.

해결 된 문제 : D


8

OS 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는 옳지 만 제 생각에는 "장치에 설치된 APK에 다른 인증서로 서명 한 다음 설치하려는 새 인증서"라는 잘못된 버그 있습니다.

과거에 잘못된 인증서로 인해 장치에서 앱을 제거할지 여부를 묻는 데 사용 되었기 때문에 이것은 아마도 새로운 버그 일 것입니다.

고통스러운 해결책은 앱을 수동으로 제거하는 것입니다.

또한 팀 개발을 위해 수행 한 작업은 저장소에 디버그 키 저장소를 추가하고 gradle이 다음과 같이 사용하도록 지정합니다.

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

이제 팀 구성원간에 장치를 전달할 때 모두 동일한 디버그 인증서를 사용하므로 문제가 없습니다. :)


4

Android 5에서 설정-> 앱을 확인하십시오. 활성 사용자 만 삭제하는 대신 (Android 5에 여러 명의 사용자가있을 수 있고 휴대 전화에 게스트 사용자가 있기 때문에) 작업 / 도구 모음의 오른쪽 상단에있는 액세서리 버튼을 누르고 "모든 사용자 제거"를 선택하십시오. Android 5에서는 런처에서 제거 할 때 활성 사용자의 앱만 제거하는 것으로 보입니다.

응용 프로그램은 여전히 ​​장치에 있습니다. 릴리스 버전을 설치하려고 시도한 이후로 눈에 띄게 작동하지 않아서 디버그 버전이 설치되어 있고 앱을 제거했기 때문에 제대로 작동해야한다고 생각했습니다. 그러나 여전히 설치할 수 없었습니다 .. 첫 번째 힌트는 제거 된 앱의 앱 목록에 레코드가 제거되었다는 메시지와 함께 기록 된 이미지입니다.

앱에 여전히 제거 된 앱이 표시됨 모든 사용자에 대해 제거


Sry, 귀하의 의견을 살펴보십시오. 우리는 이것을 이미지가있는 추가 정보 게시물로 간주합니다.
Jordy

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은 안드로이드 앱과 동일했기 때문에 앱 이름 을 변경해야했습니다.이 앱 은 제거하거나 변경할 수 없습니다.

이것이 누군가를 돕기를 바랍니다!


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

앱의 맛이 다른 경우 먼저 제거하십시오. 이것은 같은 문제가있을 때 도움이되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.