API 31:Android云备份调试正常,Google Play发布后失效原因排查
问题:API 31迁移后Google Play备份恢复失败
应用配置
AndroidManifest.xml
<application android:fullBackupOnly="true" android:allowBackup="true" android:fullBackupContent="@xml/my_backup_rules" android:dataExtractionRules="@xml/my_backup_rules_v31"
my_backup_rules.xml
<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <include domain="file" path="." /> <include domain="database" path="." /> <include domain="external" path="." /> <include domain="root" path="." /> <include domain="sharedpref" path="." /> <exclude domain="sharedpref" path="admob.xml" /> <exclude domain="sharedpref" path="androidx.work.util.id.xml" /> <exclude domain="sharedpref" path="com.google.android.gms.appid.xml" /> <exclude domain="sharedpref" path="com.google.android.gms.analytics.prefs.xml" /> <exclude domain="sharedpref" path="com.google.android.gms.appid.xml" /> <exclude domain="sharedpref" path="com.google.android.gms.measurement.prefs.xml" /> </full-backup-content>
my_backup_rules_v31.xml
<?xml version="1.0" encoding="utf-8"?> <data-extraction-rules> <cloud-backup disableIfNoEncryptionCapabilities="false"> <include domain="file" path="." /> <include domain="database" path="." /> <include domain="external" path="." /> <include domain="root" path="." /> <include domain="sharedpref" path="." /> <exclude domain="sharedpref" path="admob.xml" /> <exclude domain="sharedpref" path="androidx.work.util.id.xml" /> <exclude domain="sharedpref" path="com.google.android.gms.appid.xml" /> <exclude domain="sharedpref" path="com.google.android.gms.analytics.prefs.xml" /> <exclude domain="sharedpref" path="com.google.android.gms.appid.xml" /> <exclude domain="sharedpref" path="com.google.android.gms.measurement.prefs.xml" /> </cloud-backup> </data-extraction-rules>
测试场景与问题
本地测试(正常工作)
- 通过Android Studio安装应用
- 执行命令:
adb shell bmgr backupnow com.xxx.yyy - 观察到备份进度日志
- 卸载应用后重新安装,旧数据正常恢复
Google Play发布后(恢复失败)
- 从Google Play安装应用
- 在系统设置中手动触发备份,Drive设置中确认备份存在
- 卸载后重新从Google Play安装应用,启动后旧数据未恢复
可能的原因与解决方案
1. API 31+优先使用dataExtractionRules,规则配置存在遗漏
Android 12(API 31)及以上版本会忽略fullBackupContent,仅使用dataExtractionRules。检查以下两点:
- 需添加空的
<device-transfer>节点:部分设备要求规则文件包含该节点才能触发完整的云端备份恢复逻辑,即使你不需要设备间传输功能:<data-extraction-rules> <cloud-backup disableIfNoEncryptionCapabilities="false"> <!-- 现有配置 --> </cloud-backup> <device-transfer /> </data-extraction-rules> - 移除
domain="root"配置:该域在Android 12+中权限受限,可能导致备份失败,改用file、database等具体域覆盖需要备份的内容即可。
2. Google Play应用签名导致备份签名不匹配
若启用了Google Play应用签名,本地测试用的是上传密钥,而云端备份绑定的是Google Play生成的发布密钥。如果迁移API 31时更换了上传/发布密钥,会导致备份与新安装应用的签名不匹配,无法恢复。
- 登录Google Play控制台确认应用签名密钥未变更;若已变更,需重新触发备份(旧备份无法兼容新签名的应用)。
3. 云端备份同步延迟
手动触发系统备份后,Google Drive的备份并非实时完成,可能需要数分钟甚至更久才能同步到服务器。若在备份完成前卸载重装,云端无完整备份数据,自然无法恢复。
- 触发备份后等待30分钟以上,在Drive设置中确认备份条目更新时间,再执行卸载重装操作。
4. 外部存储权限限制(API 31+)
Android 12+对外部存储访问权限进一步收紧,domain="external"的备份可能因权限不足无法读取数据,导致备份内容为空。
- 确认应用已申请
READ_EXTERNAL_STORAGE权限(针对旧数据),或改用媒体存储API访问外部文件;同时通过adb shell logcat | grep BackupManagerService查看备份日志,排查是否存在权限相关错误。
5. fullBackupOnly属性的行为冲突
android:fullBackupOnly="true"指定应用仅使用云端备份,但在API 31+中与dataExtractionRules结合时可能存在兼容性问题。可暂时移除该属性,测试备份恢复是否正常,再评估是否需要保留。
内容的提问来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

