Google Play发布后Android自定义权限失效问题求助
问题分析:Google Play安装后App2无法访问App1的ContentProvider
场景描述
开发两款App,App1作为数据提供者通过ContentProvider开放数据库给App2访问:
- App1声明两个
protectionLevel="signature"的自定义权限,确保仅同签名App可获取访问权限 - 本地测试时用同一密钥库签名两款App,功能正常
- 上传Google Play后,App2无法读取App1数据库,报错:
Permission Denial: opening provider ... requires com.MyApp1.permission.WRITE_DATABASE or com.MyApp1.permission.READ_DATABASE - 检查Google Play控制台发现:两款App的Upload key certificate指纹相同,但App signing key certificate指纹不同
App1清单配置
<permission android:name="${MyApp1}.permission.WRITE_DATABASE" android:label="Write Database" android:protectionLevel="signature" /> <permission android:name="${MyApp1}.permission.READ_DATABASE" android:label="Read Database" android:protectionLevel="signature" /> <application> ... <provider android:authorities="${MyApp1}.content.provider.MyProvider" android:name=".content.provider.MyProvider" android:enabled="true" android:exported="true" android:readPermission="${MyApp1}.permission.WRITE_DATABASE" android:writePermission="${MyApp1}.permission.READ_DATABASE" /> </application>
App2清单配置
<uses-permission android:name="${MyApp1}.permission.WRITE_DATABASE" /> <uses-permission android:name="${MyApp1}.permission.READ_DATABASE" />
核心原因
是的,App签名密钥证书不一致是导致权限验证失败的根本原因:
protectionLevel="signature"的权限规则是:只有与声明权限的App(App1)使用完全相同的签名密钥签名的App(App2),才能被授予该权限- 本地测试时,你用自己的密钥库(即Google Play的Upload Key)签名两款App,签名一致,所以权限验证通过
- 上传Google Play后,Google会用App Signing Key重新签名APK(这是最终安装到用户设备上的签名),而你的两款App的App Signing Key不同,导致App2的签名与App1不匹配,权限被拒绝
另外注意:App1的ContentProvider配置存在权限对应错误——android:readPermission指向了WRITE_DATABASE,android:writePermission指向了READ_DATABASE,虽然这不是当前报错的直接原因,但会导致权限逻辑混乱,后续可能引发其他问题,建议修正。
解决方案
统一两款App的App Signing Key
- 在Google Play控制台,可通过"App signing"页面的"Transfer app signing key"功能,将其中一款App的App Signing Key迁移为另一款的(需满足迁移条件)
- 若无法自行迁移,可联系Google Play开发者支持协助合并签名密钥
修正ContentProvider权限配置
将App1中Provider的权限对应关系纠正:<provider android:authorities="${MyApp1}.content.provider.MyProvider" android:name=".content.provider.MyProvider" android:enabled="true" android:exported="true" android:readPermission="${MyApp1}.permission.READ_DATABASE" android:writePermission="${MyApp1}.permission.WRITE_DATABASE" />验证签名一致性
- 发布前,在Google Play控制台下载两款App的App Signing证书,对比指纹确认一致
- 下载Google Play发布的APK,用
apksigner verify --print-certs <apk-path>命令查看最终签名,确认两款App的签名指纹相同
内容的提问来源于stack exchange,提问作者Hoài Vũ Lê
相关产品推荐
相关产品推荐

