自从Android 6.0(API 23)以来,Android已经提供了自动备份应用程序功能,作为开发人员快速添加备份功能到他们的应用程序的一种方式。 自动备份通过将应用数据上传到用户的Google云端硬盘帐户,保护用户的Google帐户凭据。 数据量限制在每个应用程序用户25MB,并且存储备份数据的费用是免费的。
一、备份的文件
默认情况下,自动备份在系统分配给您的应用程序的大多数目录中包含文件:
1、共享首选项文件
2、getFilesDir()返回的目录中的文件。
3、由getDatabasePath(String)返回的目录中的文件,其中还包括使用SQLiteOpenHelper类创建的文件。
4、使用getDir(String,int)创建的目录中的文件。
5、getExternalFilesDir(String)返回的目录中的外部存储上的文件。
自动备份不包括由getCacheDir(),getCodeCacheDir()或getNoBackupFilesDir()返回的目录中的文件。 保存在这些位置的文件只能暂时使用,或有意从备份操作中排除。
您可以将应用程序配置为包括和排除特定文件。 有关详细信息,请参阅“包括和排除文件”部分。
二、备份位置
备份数据存储在用户的Google云端硬盘帐户中的私人文件夹中,每个应用限制为25MB。 保存的数据不会计入用户的个人Google云端硬盘配额。 只存储最近的备份。 进行备份时,先前的备份(如果存在)被删除。
用户可以在“设置” - >“应用程序自动备份” - >“管理备份”下查看已在Google云端硬盘应用中备份的应用列表。 用户或设备上的其他应用程序无法读取备份数据。
来自每个设备设置生命周期的备份存储在单独的数据集中,如以下示例所示:
1、如果用户拥有两个设备,则每个设备都存在备份数据集。
2、如果用户恢复出厂设置,然后使用相同的帐户设置设备,备份将存储在新的数据集中。 过期数据集在一段时间不活动后自动删除。
注意:如果数据量超过25MB,系统将触发onQuotaExceeded(long,long)回调,并且不将数据备份到云端。 系统会定期检查数据量是否晚于25MB阈值,并继续自动备份。
三、备份时间表
当满足以下所有条件时,会自动进行备份:
1、用户已在“设置”>“备份和重置”中启用设备上的备份。
2、自上次备份至少24小时以上。
3、设备空闲并充电。
4、该设备已连接到Wi-Fi网络。 如果设备从未连接到WiFi网络,则永远不会出现自动备份。
在实践中,这些情况大概每天晚上发生。 为了节省网络带宽,仅当应用数据发生变化时才会进行上传。
在自动备份期间,系统将关闭应用程序,以确保其不再写入文件系统。 默认情况下,备份系统忽略在前台运行的应用程序,因为用户会注意到他们的应用程序正在关闭。 您可以通过将backupInForeground属性设置为true来覆盖默认行为。
为了简化测试,Android包括可以手动启动应用程序备份的工具。 有关详细信息,请参阅测试备份和还原。
四、恢复时间表
无论何时安装应用程序,无论是从Play商店,在设备设置期间(系统安装以前安装的应用程序)还是运行adb安装,都会恢复数据。 恢复操作发生在APK安装之后,但应用程序可用于由用户启动之前。
在初始设备设置向导期间,用户将显示可用备份数据集的列表,并询问哪个数据从哪个还原数据。 选择哪个备份数据集将成为设备的祖先数据集。 设备可以从其自己的备份或祖先数据集恢复。 如果来自这两个来源的备份可用,设备将优先考虑其自己的备份。 如果用户没有通过设备设置向导,则设备只能从其自己的备份中恢复。
为了简化测试,Android包括可以手动启动应用程序还原的工具。 有关详细信息,请参阅测试备份和还原。
五、启用和禁用备份
针对Android 6.0(API级别23)或更高版本的应用程序自动参与自动备份。 这是因为android:allowBackup属性,启用/禁用备份,如果省略,则默认为true。 为避免混淆,我们建议您在AndroidManifest.xml的<application>元素中显式设置属性。 例如:
<application ...
android:allowBackup="true">
</app>
要禁用自动备份,请将android:allowBackup设置为false。 当您的应用程序可以通过其他机制重新创建状态或者当您的应用程序处理不应备份的敏感信息时,您可能需要禁用备份。
六、包括和排除文件
默认情况下,系统备份几乎所有的应用程序数据。 有关详细信息,请参阅备份的文件。 本节介绍如何定义自定义XML规则来控制备份。
1、在AndroidManifest.xml中,将android:fullBackupContent属性添加到<application>元素。 此属性指向包含备份规则的XML文件。 例如:
<application ...
android:fullBackupContent="@xml/my_backup_rules">
</app>
2、在res / xml /目录中创建一个名为my_backup_rules.xml的XML文件。 在文件中,添加规则与<include>和<exclude>元素。 以下示例备份除device.xml之外的所有共享首选项:
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
</full-backup-content>
一)、XML配置语法
配置文件的XML语法如下所示:
<full-backup-content>
<include domain=["file" | "database" | "sharedpref" | "external" | "root"]
path="string" />
<exclude domain=["file" | "database" | "sharedpref" | "external" | "root"]
path="string" />
</full-backup-content>
在<full-backup-content>标签内,您可以定义<include>和<exclude>元素:
1、<include> - 指定要备份的文件或文件夹。 默认情况下,自动备份几乎包含所有应用程序文件。 如果指定了<include>元素,则系统默认不再包含任何文件,并且仅备份指定的文件。 要包含多个文件,请使用多个<include>元素。
注意:getCacheDir(),getCodeCacheDir()或getNoBackupFilesDir()返回的目录中的文件总是被排除,即使您尝试包含它们。
2、<exclude> - 指定在备份期间要排除的文件或文件夹。 以下是通常从备份中排除的一些文件:
1)、具有设备特定标识符的文件,由服务器颁发或在设备上生成。 例如,Google Cloud Messaging(GCM)需要在每次用户在新设备上安装您的应用程序时生成注册令牌。 如果旧的注册令牌已恢复,应用程序可能会出现意外。
2)、账户凭证或其他敏感信息。 考虑要求用户在第一次启动还原的应用程序时重新认证,而不是允许在备份中存储此类信息。
3)、与应用程序调试相关的文件,如即时运行文件。 要排除即时运行文件,请添加规则<exclude domain =“file”path =“instant-run”/>
4)、导致应用超出25MB备份配额的大文件。
注意:如果您的配置文件指定了这两个元素,则备份包含由<include>元素捕获的所有内容减去<exclude>元素中命名的资源。 换句话说,<exclude>优先。
每个元素必须包含以下两个属性:
1、domain - 指定资源的位置。 此属性的有效值包括以下内容:
1)、root - 存储属于此应用程序的所有私有文件的文件系统上的目录。
2)、文件 - 由getFilesDir()返回的目录。
3)、数据库 - 由getDatabasePath()返回的目录。 使用SQLiteOpenHelper创建的数据库存储在此处。
4)、sharedpref - 存储SharedPreferences的目录。
5)、外部由getExternalFilesDir()返回的目录。
注意:您无法备份这些位置之外的文件。
2、path:指定要从备份中包含或排除的文件或文件夹。 注意:
1)、此属性不支持通配符或正则表达式语法。
2)、您可以使用 . 引用当前目录,但是,出于安全考虑,您无法引用父目录。
3)、如果指定目录,则该规则适用于目录中的所有文件和递归子目录。
七、实现BackupAgent
实施自动备份的应用程序不需要实现BackupAgent。 但是,您可以选择实现自定义的BackupAgent。 通常,这样做有两个原因:
1、您想要接收备份事件的通知,例如onRestoreFinished()或onQuotaExceeded(long,long)。 即使应用程序未运行,也会执行这些回调方法。
2、您无法使用XML规则轻松表达要备份的一组文件。 在这些罕见的情况下,您可以实现一个替代onFullBackup(FullBackupDataOutput)的BackupAgent来存储所需的内容。 要保留系统的默认实现,请使用super.onFullBackup()调用超类上的相应方法。
如果您实现了BackupAgent,默认情况下,系统期望您的应用程序执行键/值备份和恢复。 要使用基于文件的自动备份,请在应用程序的清单中将android:fullBackupOnly属性设置为true。
在自动备份和还原操作期间,系统以受限模式启动应用程序,以防止应用程序访问可能导致冲突的文件,并让应用程序在其BackupAgent中执行回调方法。 在这种限制模式下,应用程序的主要活动不会自动启动,其内容提供者未初始化,基类应用程序已被实例化,而不是在应用程序的清单中声明的任何子类。
注意:为避免错误,请确保以受限模式执行的应用程序部分(大部分是您的BackupAgent)不会访问同一应用程序中的内容提供程序或尝试投射Application对象。 如果您无法避免这些模式,请考虑实施Key / Value备份或完全禁用备份。
注意:您的BackupAgent必须在Backup()和onRestore()上实现抽象方法。 这些方法用于键/值备份。 因此,如果您不使用Key / Value 备份,请执行这些方法并将其留空。