安装失败 _ 重复授权... C2D _ 消息

我在我的应用程序中使用谷歌通知,到目前为止,我已经做了以下的清单:

<!-- 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 _ PERMISION perm = com.myapp.permission on.C2D _ MESSAGE pkg = com.myapp

我不明白这是怎么回事? 在 Android 5.0之前它一直运行的很好。
我知道我使用 C2D_MESSAGE在两行,permissionuses-permission,但我已经从原来的谷歌 GCM 指南复制了代码,所以它必须罚款。

138022 次浏览

我在 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 reinstall dialog

如果您只是回答是在这一点上安装将成功。

设备例子

正如在另一个答案中指出的那样,您还可以在设备设置中进入应用程序信息页面,单击溢出菜单,然后选择“ Uninstall for all users”以防止出现此错误。

虽然给出这个错误,它会清楚地提到应用程序的包名称,因为它的权限被拒绝。仅仅卸载应用程序并不能解决问题。为了解决问题,我们需要采取以下步骤:

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

问题解决: D

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

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

尝试用 adb 卸载应用程序:

adb uninstall com.yourpackage

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

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

解决方案可能是手动卸载应用程序。

为了团队开发,我们还将调试密钥存储库添加到我们的存储库中,并指定 gradle 这样使用它:

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


...


buildTypes {
debug {
signingConfig signingConfigs.debug
}
}


...
}

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

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

在我的设备(Nexus 7) Android 5.0中,棒棒糖我遵循以下步骤。

卸载应用程序后,你会发现 App Name下的应用程序列表的 Downloaded选项卡。

  • 转到设置
  • 应用程序
  • 在列表的底部,你会发现 YourApp有一个“未安装”的标签
  • 张嘴
  • 单击 OptionMenu并选择 “为所有用户卸载”

在这些步骤之后,我成功地安装了新的应用程序,它运行良好。

我在 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 5中,检查你的设置-> 应用程序。不要只为活动用户删除(因为 android 5可以有多个用户,而我的手机有一个客户用户) ,点击操作/工具栏右上角的附件按钮,选择“卸载所有用户”。看起来,在 Android 5中,当你刚刚从启动器卸载时,你只是为活动用户卸载了应用程序。

应用程序还在设备上。.这让我眼花缭乱,因为我试图安装一个发布版本,没有工作,所以我认为现在是正确的,因为我仍然有调试版本安装,卸载应用程序。但是还是不能安装。.第一条线索是已卸载应用程序的应用程序列表中的一条记录,旁边有一条消息表明已卸载(图片)。

Uninstalled app still showing up in apps Uninstalled for all users

我已经解决了这个问题,而不必首先卸载备用 apk (多么痛苦啊,不是吗?).要成功安装 apk 的调试版本和发布版本,只需在 AndroidManifest.xml 中使用 gradle 内置的 ${ applicationId }占位符在编译时修改权限的 android: name 值。

Gradle 文件片段:

buildTypes {
debug {
applicationIdSuffix ".debug"
...
}
}

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 文件,以确保正确应用了占位符。如果您使用不同的产品口味,我相信您可以应用这种方法的变体,以满足您的需要。

拿开

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

运行应用程序..。 然后再次添加权限并运行应用程序。

准备。

在 OS 5.0中安装一个应用程序我得到了这样的信息:

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

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

adb uninstall com.yourpackage

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

安装错误: INSTALL _ FAILED _ DUPLICATE _ PERMISION Perm = com.map.permission. MAPS _ RECEIVE pkg = com.abc. Firstapp

当我试图安装应用程序的软件包名称 com.abc.Secondapp。这里要说的是,那个包名为 com.abc.Firstapp的应用程序已经安装在我的应用程序中了。

通过卸载包名为 com.abc.Firstapp的应用程序,然后安装包名为 com.abc.Secondapp的应用程序,我解决了这个错误

我希望在测试的时候能帮到别人。

看到这个 链接它说,它将工作时,他们签署了相同的关键。发布键和调试键不相同。

那就这么做吧:

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




}

以上这些对我来说都不管用。我的应用程序在之前比棒棒糖还好用。但是当我在棒棒糖上测试它时,出现了上面的错误。它拒绝安装。我没有安装任何以前的版本,所以所有以上的解决方案是无效的。但多亏了 这个 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. So now I change to:

<uses-permission android:name="com.mycompany.myappname.c2dm.permission.RECEIVE" />
<permission android:name="com.mycompany.myappname.permission.C2D_MESSAGE"
android:protectionLevel="signature" />

在 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 -->

Myapprocks 这部分解决了与其他应用程序的冲突。

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

(即使不使用 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"/>

然后,在你的模块分级文件中,设置相关的 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
}
}

您可以按照本教程获得更多信息

在我的例子中,我使用的是第三方库(即供应商) ,该库附带了一个示例应用程序,我已经在我的设备上安装了它。因此,每次我尝试安装自己的应用程序实现库时,这个示例应用程序都会发生冲突。所以我卸载了供应商的示例应用程序,然后它就可以工作了。

替换以下行:

<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应用程序卸载应用程序

希望这能帮到和我有同样问题的人。

如果你对这个应用程序有不同的看法,试着先卸载它。当我遇到同样的问题时,这对我很有帮助。

为了制作应用程序及其多个实例,你可以直接添加这一行,然后你就可以安装多个应用程序,每次只需修改应用程序的 ID 相同的软件包名称:

示例: 应用程序 id: XXXX.123(安装在手机中的旧的或现有的)

现在将应用程序 ID 设置为: XXX.1234并安装应用程序。

格式:

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

我有另一个应用程序使用这个权限的插件。 我卸载的其他应用程序使用相同的软件包和所有工作