Android 12及以上版本Google Drive自动备份失效问题求助
Android 12+ Google Drive备份失败排查方案
问题描述
我开发的应用支持将用户数据备份到Google Drive,重装时可恢复数据,该功能在SDK 31及以下版本正常运行,但Android 12及更高版本完全无法完成备份。
配置文件
manifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="com.google.android.gms.permission.AD_ID" /> <uses-permission android:name="com.android.vending.BILLING" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@drawable/balance_sheet_icon" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:roundIcon="@drawable/balance_sheet_icon" android:supportsRtl="true" android:theme="@style/Theme.AppTheme" tools:targetApi="31"> <activity android:name=".Activities.CustomerDetails" android:exported="false" /> <activity android:name=".Activities.Profiles" android:exported="false" /> <activity android:name=".Activities.Premium" android:exported="false" /> <!-- Sample AdMob app ID: ca-app-pub-3940256099942544~3347511713 --> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="3940256099942544~3347511713" /> <meta-data android:name="firebase_crashlytics_collection_enabled" android:value="${crashlyticsEnabled}" /> <activity android:name=".Activities.Amount" android:exported="false" android:hardwareAccelerated="true" android:screenOrientation="portrait" /> <activity android:name=".Activities.Details" android:exported="false" android:screenOrientation="portrait"> <meta-data android:name="android.app.lib_name" android:value="" /> </activity> <activity android:name=".Activities.ProcessHolder" android:exported="false" android:hardwareAccelerated="true" android:screenOrientation="portrait"> <meta-data android:name="android.app.lib_name" android:value="" /> </activity> <activity android:name=".Activities.MainActivity" android:exported="true" android:screenOrientation="portrait" android:windowSoftInputMode="stateVisible|adjustPan"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.lib_name" android:value="" /> </activity> <provider android:name="androidx.core.content.FileProvider" android:authorities=""<!-- removed to upload --> android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application> </manifest>
backup_rules.xml
<?xml version="1.0" encoding="utf-8"?><!-- Sample backup rules file; uncomment and customize as necessary. --> <full-backup-content> <!-- <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> --> <include domain="sharedpref" path="."/> <include domain="database" path="."/> </full-backup-content>
data_extraction_rules.xml
<?xml version="1.0" encoding="utf-8"?><!-- Sample data extraction rules file; uncomment and customize as necessary. --> <data-extraction-rules> <cloud-backup> <include domain="sharedpref" path="."/> <include domain="database" path="."/> </cloud-backup> <device-transfer> <include domain="sharedpref" path="."/> <include domain="database" path="."/> </device-transfer> </data-extraction-rules>
排查与修复建议
- 强制指定全量备份模式
在application标签中添加android:fullBackupOnly="true",避免Android 12+默认切换到KeyValue备份模式,确保系统使用你配置的全量备份规则:
<application android:allowBackup="true" android:fullBackupOnly="true" android:dataExtractionRules="@xml/data_extraction_rules" ...>
- 检查数据库备份状态
Android 12+会跳过正在被占用的文件备份,需确保备份触发时数据库已完全关闭:
- 在应用退到后台或销毁时,主动关闭所有SQLite数据库连接
- 测试备份前先强制停止应用,再触发备份操作
- 用adb命令强制触发备份并查看日志
不要依赖系统自动备份的延迟,手动触发并查看日志定位错误:
- 触发备份:
adb shell bmgr fullbackup <你的应用包名> - 查看Logcat:过滤
BackupManagerService标签,搜索Failed或Error关键词,排查是否存在文件访问权限问题、规则匹配失败等情况
- 验证备份规则的有效性
Android 12+完全使用dataExtractionRules,可尝试以下操作验证:
- 将
path="."改为具体文件名,比如共享偏好的your_pref.xml、数据库的your_db.db,测试单个文件是否能正常备份 - 检查
file_paths等其他配置文件是否影响了目标文件的可访问性
- 确认账号与签名配置
- 测试设备必须登录关联的Google账号,且开启系统设置中的"备份到Google Drive"选项
- 若使用测试包,需确保debug签名已在Google Play Console的应用签名配置中添加(内部测试场景)
内容的提问来源于stack exchange,提问作者T LABS
相关产品推荐
相关产品推荐

