安装失败,原因是重复权限... C2D_MESSAGE

189

我正在我的应用程序中使用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,即在permissionuses-permission中,但我是从原始的Google GCM指南复制了这段代码,所以它应该没问题。


20
你最初认为是一个不明显的错误(嗯,我也是...),实际上是一项新的安全功能,防止签名不同的两个应用程序声明相同的自定义权限并安装到设备上。 - AZ_
@NullPointerException 你能否接受答案,因为它对许多人有帮助。 - Pratik Butani
24个回答

4
在Android 5中,检查您的设置 -> 应用程序。不要仅删除活动用户的应用(因为Android 5可以有多个用户且我的手机还有一个访客用户),请点击操作栏/工具栏右上角的附件按钮,然后选择“卸载所有用户”。在Android 5中,当您只从启动器卸载应用程序时,您仅会将该应用程序卸载给活动用户。
该应用程序仍然存在于设备上。这使我感到困惑,因为我试图安装发布版本,但失败了,所以我认为可能是因为我仍然安装了调试版本,卸载了该应用程序。但之后仍然无法安装...第一个线索是卸载应用程序列表中出现了一条记录,并显示它已被卸载(图片)。

抱歉,我刚看到你的评论。我们将把这篇文章视为带有图片的额外信息发布。 - 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
...

您还可以使用“设置”应用程序卸载应用程序。转到“设置->应用程序->查找应用程序->卸载”。希望这对于遇到与我相同问题的人有所帮助。

0

我在使用Nexus 5 Android Lollipop 5.0.1时遇到了同样的问题:

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

在我的情况下,我无法通过卸载应用程序来解决这个问题,因为它是一个安卓应用程序。但是,我不得不在清单中更改我的应用程序自定义权限名称,因为它们与一个安卓应用程序相同,我无法卸载或进行任何更改。
希望这能帮助到某些人!

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

我卸载了之前的版本。这对我有用。


0

我卸载了应用程序后重启手机,它就可以正常工作了。


0

以前会提示在设备上找到具有不同签名的应用程序。从IDE安装时,它也会询问是否要卸载它?

但我认为从Android 5.0开始,他们已经改变了卸载的原因。如果您使用相同的签名安装应用程序,则不会发生此情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接