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

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>

排查与修复建议

  1. 强制指定全量备份模式
    在application标签中添加android:fullBackupOnly="true",避免Android 12+默认切换到KeyValue备份模式,确保系统使用你配置的全量备份规则:
<application
    android:allowBackup="true"
    android:fullBackupOnly="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    ...>
  1. 检查数据库备份状态
    Android 12+会跳过正在被占用的文件备份,需确保备份触发时数据库已完全关闭:
  • 在应用退到后台或销毁时,主动关闭所有SQLite数据库连接
  • 测试备份前先强制停止应用,再触发备份操作
  1. 用adb命令强制触发备份并查看日志
    不要依赖系统自动备份的延迟,手动触发并查看日志定位错误:
  • 触发备份:adb shell bmgr fullbackup <你的应用包名>
  • 查看Logcat:过滤BackupManagerService标签,搜索Failed或Error关键词,排查是否存在文件访问权限问题、规则匹配失败等情况
  1. 验证备份规则的有效性
    Android 12+完全使用dataExtractionRules,可尝试以下操作验证:
  • 将path="."改为具体文件名,比如共享偏好的your_pref.xml、数据库的your_db.db,测试单个文件是否能正常备份
  • 检查file_paths等其他配置文件是否影响了目标文件的可访问性
  1. 确认账号与签名配置
  • 测试设备必须登录关联的Google账号,且开启系统设置中的"备份到Google Drive"选项
  • 若使用测试包,需确保debug签名已在Google Play Console的应用签名配置中添加(内部测试场景)

内容的提问来源于stack exchange,提问作者T LABS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:02:02