自从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的
六、包括和排除文件
默认情况下,系统备份几乎所有的应用程序数据。 有关详细信息,请参阅备份的文件。 本节介绍如何定义自定义XML规则来控制备份。
1、在AndroidManifest.xml中,将android:fullBackupContent属性添加到
一)、XML配置语法
配置文件的XML语法如下所示:
1、
注意:getCacheDir(),getCodeCacheDir()或getNoBackupFilesDir()返回的目录中的文件总是被排除,即使您尝试包含它们。
2、
1)、具有设备特定标识符的文件,由服务器颁发或在设备上生成。 例如,Google Cloud Messaging(GCM)需要在每次用户在新设备上安装您的应用程序时生成注册令牌。 如果旧的注册令牌已恢复,应用程序可能会出现意外。
2)、账户凭证或其他敏感信息。 考虑要求用户在第一次启动还原的应用程序时重新认证,而不是允许在备份中存储此类信息。
3)、与应用程序调试相关的文件,如即时运行文件。 要排除即时运行文件,请添加规则
4)、导致应用超出25MB备份配额的大文件。
注意:如果您的配置文件指定了这两个元素,则备份包含由
每个元素必须包含以下两个属性:
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 备份,请执行这些方法并将其留空。
有关详细信息,请参阅扩展BackupAgent。