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的两条线,permissionuses-permission但我已经复制从原来的谷歌GCM指南,代码,因此它必须是罚款。


20
您最初为一个不起眼的错误采取的措施(嗯,我做到了……)实际上是一项新的安全功能,可防止两个应用声明使用不同签名签名的相同自定义权限,并将其安装在设备上
AZ_ 2014年

Answers:


231

我找到了适合我的解决方案。

在“我的设备”(Nexus 7)中为Android 5.0。棒棒糖我按照这些步骤。

卸载应用程序后,您将App NameDownloaded选项卡的“ 应用程序列表”下找到。

  • 前往设置
  • 应用
  • 在列表的底部,您会发现YourApp带有“未安装”标签
  • 打开
  • 单击OptionMenu并选择“为所有用户卸载”

完成这些步骤后,我成功安装了新应用,并且运行良好。


6
我在Android 5.0.1中使用了nexus 9,但我看不到带有“ noto installed”标记的应用
xXJohnRamboXx 2015年

这对我有用,谢谢!我的问题略有不同。我正在我们的移动应用程序上进行自动化测试(Xamarin.UITest),并且我上传了其他版本进行一些手动测试。当我尝试通过VS / Xamarin UITest将应用程序加载到设备上时,我开始看到此问题。再次感谢。
LuFaMa

这应该是正确的答案:stackoverflow.com/a/27767179/343679
Sharj 2015年

@Pratik Butani该解决方案为我工作。我想知道导致错误的原因?能否请您解释一下?
Karthikeyan Ve 2015年

1
我的应用程序不在NOT INSTALLED标签的列表底部。你什么意思?
IgorGanapolsky '16

139

去掉

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

运行应用程序...然后再次添加许可并运行应用程序。

准备!。


31
当您尝试在同一设备上安装调试和发布版本的应用程序时,经常会出现此问题,因此此问题应该排在最前面。使用此解决方案,您可以轻松实现。我不知道您可以在清单中使用变量。赞!
弗洛里安2015年

4
如果该应用已在生产中,则此答案不起作用。我不能期望我的应用程序的用户在没有许可的情况下下载新版本,然后再次在具有许可的情况下安装新版本。
nilsmagnus

5
如果您因为使用不同名称调试和发布了应用程序版本而发生这种情况,则无需卸载即可正常工作:您只需使用${applicationId}而不是对其进行硬编码
yuval

1
使用$ {applicationId}代替静态应用程序ID解决了我的问题!包括使用调味剂时!!!!
JannGabriel '16

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

朝相反的方向(已安装发行版时尝试从Eclipse安装调试版),我得到以下对话框:

Eclipse重新安装对话框

如果您在此时回答是,则安装将成功。

设备示例

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


谢谢,但是您应该以“您也可以在设备设置中转到应用程序信息页面,单击溢出菜单,然后选择“为所有用户卸载””开始回答,以防止出现此错误。
yajnesh 2014年

请嫁给我。修改后,我转到“设置”>“应用程序”,触摸旧版本的应用程序,然后在选项菜单中选择“为所有用户卸载”。
Fabricio PH 2014年

前提条件列表中的#2不一定是正确的。就我而言,我不是在更新应用程序,而是按照此过程中的描述,使用不同的程序包名称安装同一应用程序的调试版本。stackoverflow.com/a/21006552/507339。这是我没有找到解决方案的问题
Nilzor 2015年

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

您可以使用以下命令检查APK中修改后的AndroidManifest.xml文件,aapt l -a app-debug.apk以确保正确应用了占位符。如果您使用各种产品口味,我相信您可以应用此方法的变体来满足您的需求。


看来如果我applicationId在两个不同的地方定义不同productFlavors,并且使用${applicationId}的效果将是相同的。
罗伯特

我认为如果您需要1种以上的风味,这将是更可靠的解决方案。
罗伯特

这应该标记为正确。考虑到您不能指望每个同事都能做一些黑客活动来简单地构建项目并安装apk
goemic

谢谢,@ jackpile应用程序对我来说运行得很好,如果同时安装了发行版和调试版,则只有一个问题,然后在安装调试版之后,发行版就会打开
Prateek Surana

这应该被标记为正确的答案..谢谢@Jackpile
艾哈迈德·艾瑟斯

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}为我解决了这个问题!
安迪

如何解决上述问题?
文森特

18

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

adb uninstall com.yourpackage

怪异的是,即使我已通过系统界面卸载了APK,但在已安装的应用程序中却没有出现,我只需要在Nexus 6上执行此操作。
乔恩·威利斯

它给了我Failure [DELETE_FAILED_INTERNAL_ERROR]。可能是什么原因?
Reaz Murshed

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之前运行良好。但是,当我在棒棒糖上对其进行测试时,出现了上述错误。它拒绝安装。我没有安装任何以前的版本,因此上述所有解决方案对我而言都是无效的。但是,由于有了这种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中,当您仅从启动器中卸载时,只会为活动用户卸载该应用程序。

该应用程序仍在设备上。自从我尝试安装发行版以来,这让我眼花to乱,因此无法正常工作,所以我认为应该是因为我仍然安装了调试版本,因此卸载了该应用程序。但是仍然无法安装。。第一个线索是已卸载应用程序的应用程序列表中的记录,旁边是该消息已被卸载的消息(图像)。

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


对不起,查看了您的评论。我们只是将其视为带有图片的额外信息发布。
Jordy 2014年

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因为它们与android应用程序相同,无法卸载或进行任何更改。

希望这对某人有帮助!


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

如果您的应用程序风格不同,请尝试首先将其卸载。当我遇到相同的问题时,这对我有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.