설치_실패_중복_사용 권한...C2D_MESSAGE
앱에서 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 -->
넥서스 7을 안드로이드 5.0으로 업데이트하기 전까지는 완벽하게 작동했습니다.
이제 이클립스를 사용하여 이 장치에 앱을 설치하려고 하면 다음 오류가 발생합니다.
설치_실패_중복_PERMISSION perm=com.myapp.permission입니다.C2D_MESSAGE pkg=com.myapp
뭐가 잘못됐는지 모르겠어요?Android 5.0까지는 완벽하게 작동했습니다.
사용 중임을 알고 있습니다.C2D_MESSAGE로, 두줄로서서,서,permission그리고.uses-permission하지만 저는 원래 구글 GCM 가이드에서 그 코드를 복사했기 때문에 괜찮을 것입니다.
저는 저에게 맞는 해결책을 찾았습니다.
In My Device(Nexus 7) Android 5.0.롤리팝 나는 다음 단계를 따릅니다.
한 후에 여러분은 "앱을 제거한 후에"를 찾을 수 .App Name의 앱 Downloaded탭
- 설정으로 이동
- 앱
- 목록의 맨 아래에 다음과 같은 것이 있습니다.
YourApp" 태그가 있는 - 열다.
- 을
OptionMenu"모든 사용자에 대해 제거"를 선택합니다.
이러한 단계를 거친 후, 저는 새로운 앱을 성공적으로 설치했고 잘 실행되고 있습니다.
제거한다.
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature"/>
앱 실행...그런 다음 퍼미슨을 다시 추가하고 앱을 실행합니다.
준비!.
Android-21에서 사용자 지정 서명 권한과 동일한 문제가 발생하여 전체 제거를 수행하고 있는지 확인하여 문제를 해결했습니다.
이는 다음과 같은 경우에 발생하는 에지 케이스입니다.
- 응용 프로그램은 서명 수준 보안을 사용하여 사용자 지정 권한을 정의합니다.
- 다른 키로 서명된 버전으로 설치된 앱을 업데이트하려고 합니다.
- 테스트 장치가 여러 사용자를 지원하는 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에서 디버그 빌드를 설치하려고 하면) 다음과 같은 대화 상자가 나타납니다.

이 시점에서 예라고 대답하면 설치가 성공합니다.
장치 예제
다른 답변에서 지적한 것처럼 기기 설정의 앱 정보 페이지로 이동하여 오버플로 메뉴를 클릭한 후 "모든 사용자에 대해 제거"를 선택하여 이 오류를 방지할 수도 있습니다.
대체 apk를 먼저 제거할 필요 없이 이 문제를 해결했습니다.apk의 디버그 버전과 릴리스 버전을 모두 성공적으로 설치하려면 AndroidManifest.xml에 포함된 Gradle의 기본 ${applicationId} 자리 표시자를 사용하여 컴파일 시 권한의 rodroid: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"/>
은 apk에서 AndroidManifest.xml을 사용하여 검사할 수 .aapt l -a app-debug.apk자리 표시자가 올바르게 적용되었는지 확인합니다.다양한 제품 맛을 사용한다면, 당신의 요구에 맞게 변형된 이 방법을 적용할 수 있을 것이라고 확신합니다.
패키지 이름에 대한 "하드 코딩" 참조를 매니페스트 파일에서 제거합니다.
의 방법입니다.)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
}
}
adb를 사용하여 앱 제거 시도:
adb uninstall com.yourpackage
이 오류를 표시하는 동안 권한이 거부되었기 때문에 앱의 패키지 이름이 명확하게 언급됩니다.그리고 애플리케이션을 제거하는 것만으로는 문제가 해결되지 않습니다.문제를 해결하려면 다음 단계를 수행해야 합니다.
- 설정으로 이동
- 앱으로 이동
- 다운로드한 앱 목록으로 이동
- 목록에서 제거된 응용 프로그램을 볼 수 있습니다.
- 응용프로그램을 클릭하고 다른 옵션으로 이동합니다.
- 모든 사용자에 대한 제거 옵션 클릭
문제 해결됨:D
OS 5.0에 응용 프로그램을 설치하면 다음 메시지가 표시됩니다.
INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.myapp.permission.C2D_MESSAGE pkg=com.myapp
중복된 패키지가 없으며 이전 응용 프로그램을 수동으로 제거하거나 다음과 같은 adb를 사용하여 이 문제를 해결할 수 있습니다.
adb uninstall com.yourpackage
위의 어떤 것도 저에게 효과가 없었습니다.이전에는 롤리팝보다 제 앱이 잘 작동했습니다.그런데 롤리팝에서 테스트해보니 위와 같은 오류가 발생했습니다.설치를 거부했습니다.이전 버전을 설치하지 않았기 때문에 위의 모든 솔루션은 제 경우에 유효하지 않습니다.하지만 SO 솔루션 덕분에 이제 잘 작동하고 있습니다.대부분의 개발자들과 마찬가지로 저는 구글의 잘못된 튜토리얼을 따르고 다음과 같이 복사하여 붙여넣기를 통해 권한을 추가했습니다.
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.google.android.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
이것은 이전 버전 < 롤리팝에서 작동할 것입니다.이제 다음으로 변경했습니다.
<uses-permission android:name="com.mycompany.myappname.c2dm.permission.RECEIVE" />
<permission android:name="com.mycompany.myappname.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
CommonsWare가 옳지만, "장치에 설치된 apk가 설치하려는 새 인증서와 다른 인증서로 서명되었습니다."라고 말하는 것은 잘못된 방법입니다.
과거에는 인증서가 잘못되어 장치에서 앱을 제거할지 여부를 묻는 버그였기 때문에 아마도 새로운 버그일 것입니다.
해결책은 앱을 수동으로 제거하는 것입니다.
또한 팀 개발을 위해 디버그 키 저장소를 저장소에 추가하고 이를 사용하기 위해 다음과 같은 작업을 수행했습니다.
android {
...
signingConfigs {
debug {
storeFile file("../certificates/debug.keystore")
}
}
...
buildTypes {
debug {
signingConfig signingConfigs.debug
}
}
...
}
그리고 이제 팀원 간에 장치를 전달할 때는 모두 동일한 디버그 인증서를 사용하기 때문에 문제가 없습니다.:)
Android 5에서 설정 -> 앱을 확인합니다.활성 사용자만 삭제하는 대신(안드로이드 5에는 여러 사용자가 있고 내 전화에는 게스트 사용자가 있기 때문에) 작업/도구 모음의 오른쪽 상단 모서리에 있는 액세서리 버튼을 누르고 "모든 사용자에 대해 제거"를 선택합니다.Android 5에서는 런처에서 방금 제거할 때 활성 사용자에 대한 앱만 제거하는 것으로 나타납니다.
앱이 아직 장치에 있습니다.이것은 제가 릴리스 버전을 설치하려고 시도했지만 작동하지 않았기 때문에 저를 현혹시켰습니다. 그래서 저는 디버그 버전이 아직 설치되어 있고 앱을 제거했기 때문에 올바른 방법이라고 생각했습니다.하지만 여전히 설치할 수 없었습니다.첫 번째 단서는 제거된 앱의 앱 목록에 있는 기록과 제거되었다는 메시지(이미지)입니다.

동일한 키로 서명할 때 작동한다고 표시된 이 링크를 참조하십시오.릴리스 키와 디버그 키가 다릅니다.
그럼 해보세요.
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_"***"
}
}
아래 줄 바꾸기:
<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myapp.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
저의 경우, 패키지 이름에 다음과 같이 동일한 도메인 이름을 가진 여러 응용 프로그램을 설치했습니다.
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
그것이 저와 같은 문제를 겪고 있는 누군가에게 도움이 되기를 바랍니다.
이전에는 기기에서 다른 서명을 가진 앱을 찾을 수 있다고 했습니다.IDE에서 설치할 때 제거할 것인지 묻는 메시지도 표시됩니다.
하지만 안드로이드 5.0부터는 제거 이유가 바뀐 것 같습니다.동일한 서명으로 앱을 설치하는 경우에는 발생하지 않습니다.
넥서스 5 안드로이드 롤리팝 5.0.1에서도 같은 문제가 발생했습니다.
Installation error: INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.android.** pkg=com.android.**
제 에는 이 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜuninstalling앱이 그것이었기 때문에.android app하지만 나는 내 앱을 바꿔야 했습니다.custom permissions에 이름을 올리다.manifest왜냐하면 그것들은 안드로이드 앱과 같았기 때문에 제거하거나 변경할 수 없었습니다.
이것이 누군가에게 도움이 되기를 바랍니다!
저의 경우 다음과 같은 오류가 발생했습니다.
설치 오류: INSTALL_FAILED_중복_PERMISSION perm=com.map.permission.permission.MAPS_RECEIVE pkg=com.dll.첫번째 앱
이름이 할때 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠcom.abc.Secondapp여기서 포인트는 패키지 이름을 가진 앱이었습니다.com.abc.Firstapp이미 내 애플리케이션에 설치되어 있습니다.
패키지 이름으로 응용 프로그램을 제거하여 이 오류를 해결했습니다.com.abc.Firstapp 다음 패키지 이름으로 합니다.com.abc.Secondapp
이것이 테스트하는 동안 누군가에게 도움이 되기를 바랍니다.
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.my는 이 부분이 당신의 다른 앱과의 충돌을 해결한다고 생각합니다.
제 경우 타사 라이브러리(예: 공급업체)를 사용하고 있었는데 라이브러리에는 이미 장치에 설치한 샘플 앱이 함께 제공됩니다.그래서 라이브러리를 구현하는 나만의 앱을 설치하려고 할 때마다 샘플 앱이 충돌했습니다.그래서 방금 벤더의 샘플 앱을 제거했고 이후에도 작동합니다.
이전 버전을 제거했습니다.그것은 나에게 효과가 있었다.
앱을 제거한 후 핸드폰을 다시 시작했는데 작동했습니다.
다른 버전의 앱을 사용하는 경우 먼저 해당 앱을(를 제거하십시오.이것은 제가 같은 문제를 가지고 있을 때 도움이 되었습니다.
이 권한을 가진 플러그인을 사용하는 다른 앱이 있었습니다.이 패키지를 사용하는 다른 앱을 제거하고 모두 작동했습니다.
저의 경우, 저는 하나의 앱으로 앱을 구축했습니다.ID를 생성한 후 새 앱으로 빌드하기를 원했습니다.아이디와 이것은 제가 오류를 받았을 때입니다.
저는 원시그널과 파이어베이스 공통 안드로이드 플러그인으로 유니티를 사용하고 있습니다.이러한 플러그인 자체에는 매니페스트 파일에 다음 행이 포함되어 있습니다.
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature"/>
저는 그들의 .aar 파일의 압축을 풀어서 그것을 보았습니다.그것은 꽤 숨겨져 있었습니다.
Android Dependency Resolver for Unity를 사용하여 문제를 해결하고 전체 Force Resolve를 수행하여 새 AppId로 매니페스트를 변경했습니다(보시다시피 실제 권한 문자열은 변수를 사용하여 작성되었기 때문입니다).
언급URL : https://stackoverflow.com/questions/27043933/install-failed-duplicate-permission-c2d-message
'source' 카테고리의 다른 글
| Oracle: 절이 다른 여러 개의 카운트를 수행하는 가장 좋은 방법은 무엇입니까? (0) | 2023.08.05 |
|---|---|
| 로지스틱 회귀 분석:알 수 없는 레이블 유형: python에서 sklearn을 사용하는 'continuous' (0) | 2023.08.05 |
| 각도 재료에서 아이콘의 색상을 설정하는 방법은 무엇입니까? (0) | 2023.08.05 |
| setTimeout()이 포함된 함수를 테스트합니다. (0) | 2023.08.05 |
| powershell의 $args 배열에 액세스하기 (0) | 2023.08.05 |