Android权限报错:C2D_MESSAGE不唯一,添加applicationIdSuffix引发
嘿,这个问题我之前也踩过坑!根源很明确:你给产品风味加了applicationIdSuffix后,应用的实际包名变成了my.packagename.acc,但清单文件里还在硬编码原包名的权限my.packagename.permission.C2D_MESSAGE,再加上系统可能自动生成了对应新包名的权限(或者你其他地方还有重复声明),直接就导致了权限名称冲突。
给你几个快速解决的步骤:
用Gradle占位符替换硬编码包名
把AndroidManifest.xml里的权限声明改成${applicationId}这个动态占位符,它会自动适配当前风味的实际包名:<permission android:name="${applicationId}.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />这样不管你给哪个风味加什么后缀,权限名称都会精准匹配当前应用的包名,从根源上避免不唯一的问题。
清理重复的硬编码权限声明
检查项目里的其他清单文件(比如风味专属清单、主清单的其他段落),看看有没有硬编码的my.packagename.permission.C2D_MESSAGE或者my.packagename.acc.permission.C2D_MESSAGE,把这些都换成占位符,或者直接删掉重复项。同步并重建项目
修改完成后,先点击Android Studio的「Sync Project with Gradle Files」,接着执行「Clean Project」再「Rebuild Project」,清空旧缓存确保新的权限声明完全生效。
补充一句:C2D_MESSAGE权限是FCM/GCM用来验证应用身份的核心权限,必须和应用包名严格对应,而且保护级别必须设为signature,这样只有和你签名一致的应用才能使用该权限,防止恶意程序蹭收你的消息。用占位符是最灵活的适配方式,能覆盖所有产品风味的包名变化场景。
内容的提问来源于stack exchange,提问作者Jim Clermonts

