You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,虽然这不是当前报错的直接原因,但会导致权限逻辑混乱,后续可能引发其他问题,建议修正。

解决方案

  1. 统一两款App的App Signing Key

    • 在Google Play控制台,可通过"App signing"页面的"Transfer app signing key"功能,将其中一款App的App Signing Key迁移为另一款的(需满足迁移条件)
    • 若无法自行迁移,可联系Google Play开发者支持协助合并签名密钥
  2. 修正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"
     />
    
  3. 验证签名一致性

    • 发布前,在Google Play控制台下载两款App的App Signing证书,对比指纹确认一致
    • 下载Google Play发布的APK,用apksigner verify --print-certs <apk-path>命令查看最终签名,确认两款App的签名指纹相同

内容的提问来源于stack exchange,提问作者Hoài Vũ Lê

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:47:25