INSTALL_FAILED_DUPLICATE_PERMISSION … 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 --> 

它工作完美,直到我更新我的Nexus 7到Android 5.0。
现在,当我尝试使用Eclipse在此设备中安装应用程序时,出现此错误:

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

我不明白什么是错的…它完美的工作,直到Android 5.0。
我知道我在两行中使用了C2D_MESSAGEpermissionuses-permission但是我已经从原始的Google GCM指南中复制了该代码,所以一定没问题。

我find了适合我的解决scheme。

在我的设备(Nexus 7)Android 5.0中。 棒棒糖我遵循这些步骤。

卸载应用程序后您可以在Downloaded选项卡的应用程序列表下findApp Name

  • 前往设置
  • 应用
  • 在列表的底部,你会发现一个“没有安装”标签的YourApp
  • 打开
  • 点击OptionMenu并select“Uninstall for all Users”

在这个过程之后,我成功安装了新的应用程序,并且运行良好。

去掉

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

运行应用程序…然后再次添加function,然后运行应用程序。

准备!。

我对Android-21上的自定义签名权限有同样的问题,并确保我正在做一个完整的卸载来解决它。

这是在以下情况下发生的边缘情况:

  1. 应用程序使用签名级安全性定义自定义权限
  2. 您尝试使用以不同密钥签名的版本更新已安装的应用程序
  3. 该testing设备运行Android 21或更新,支持多个用户

命令行示例

这里是一个命令行的脚本,演示了这个问题以及如何解决这个问题。 在这一点上安装了一个debugging版本,我正在尝试安装使用发行版密钥签名的产品版本:

 # 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示例

在相反的方向(当已经安装了发行版本的时候试图从Eclipse安装一个debugging版本),我得到下面的对话框:

Eclipse重新安装对话框

如果您只是回答是,安装将成功。

设备示例

正如另一个答案中指出的,您也可以在设备设置中进入应用程序信息页面,单击溢出菜单,然后select“为所有用户卸载”以防止出现此错误。

我已经解决了这个,而不必诉诸卸载替代apk先(这是一种痛苦,对吧?)。 要成功安装apk的debugging版本和发布版本,只需在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文件,以确保正确应用占位符。 如果您使用各种产品口味,我相信您可以应用这种方法的变体来满足您的需求。

从清单文件中删除软件包名称的任何“硬编码”引用。

(即使您不使用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 } } 

你可以按照这个教程了解更多信息

在给出这个错误的时候,它会明确地提到应用程序的包名称,因为这个权限被拒绝了。 而只是卸载应用程序不会解决问题。 为了解决问题,我们需要执行以下步骤:

  1. 前往设置
  2. 转到应用程序
  3. 去下载的应用程序列表
  4. 您可以在列表中看到卸载的应用程序
  5. 点击应用程序,进入更多选项
  6. 点击卸载所有用户选项

解决的问题:D

尝试使用adb卸载应用程序:

 adb uninstall com.yourpackage 

在OS 5.0中安装应用程序,我收到以下消息:

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

没有重复的软件包,我们可以解决这个问题手动卸载旧的应用程序或使用adb:

adb uninstall com.yourpackage

CommonsWare是正确的,但在我看来,这是一个(错误)糟糕的方式来说: “安装在设备上的apk签名与不同的证书,然后你正在尝试安装新的证书”

这可能是一个新的错误,因为过去它曾经询问是否由于错误的证书而从设备上卸载应用程序。

解决scheme可能会很痛苦,那就是手动卸载应用程序。

另外我们为了团队开发所做的工作,将debugging密钥库添加到我们的仓库中,并指向gradle来使用它:

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

而现在当团队成员之间传递设备时,我们都使用相同的debugging证书,所以没有问题。 🙂

在Android 5中,检查您的设置 – >应用程序。 而不是只为活跃用户(因为android 5可以有多个用户,而我的手机有一个访客用户),点击操作/工具栏右上angular的附件button,然后select“为所有用户卸载”。 看来,在Android 5中,当你从启动程序只卸载你只卸载活动用户的应用程序。

该应用程序仍然在设备上..这让我眼花缭乱,因为我试图安装发布版本,没有工作,所以我认为正确的必须是因为我仍然有debugging版本安装,卸载应用程序。 但仍然不能安装..首先线索是卸载的应用程序的应用程序列表中的logging与旁边的消息,它已被卸载(图片)。

卸载的应用程序仍然显示在应用程序中为所有用户卸载

以上都没有为我工作。 我以前的应用程序工作正常比棒棒糖。 但是当我testing棒棒糖上面的错误出现了。 它拒绝安装。 我没有安装任何以前的版本,所以上述解决scheme在我的情况下是无效的。 但是现在感谢这个SO解决scheme,它运行良好。 就像大多数开发者一样,我遵循Google的误导教程,并通过复制和粘贴来添加权限:

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

看到这个链接它说,它将工作时,他们是由相同的密钥签名。 释放键和debugging键是不一样的。

所以做到这一点:

 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_"***" } } 

以前它曾经说过在设备上find具有不同签名的应用程序。 从IDE安装时,它也会问你是否要卸载它?

但我认为从Android 5.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因为他们是一样的Android应用程序,我不能卸载或做任何改变。

希望这有助于某人!

在我的情况下,我收到以下错误

安装错误: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的应用程序

我希望这会在testing的时候帮助别人。

在您的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这部分解决了与其他应用程序的冲突。

在我的情况下,我正在使用第三方库(即供应商)和库附带一个示例应用程序,我已经安装在我的设备上。 所以这个示例应用程序现在每次都尝试安装我自己的应用程序实现库冲突。 所以我刚刚卸载了供应商的示例应用程序,并在之后工作。

replace下面的行:

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