自从新的ADT预览版本(版本21)以来,它们有一个新的lint警告,告诉我清单文件(在应用程序标签中)的下一件事情: 应该明确地将android:allowBackup设置为true或false(默认情况下是true,并且可以对应用程序的数据有一些安全性影响) 在官方网站上 ,他们写道: 几个新的检查:你必须明确地决定你的应用程序是否允许备份和标签检查。 有一个新的命令行标志来设置库path。 在编辑时增加lint分析的许多改进。 这是什么警告? 什么是备份function,我如何使用它? 另外,为什么警告告诉我它有安全隐患? 禁用此function的缺点和优点是什么? 清单的备份有两个概念: “android: allowBackup ”允许通过adb进行备份和恢复,如下所示: 是否允许应用程序参与备份和还原基础架构。 如果此属性设置为false,那么即使执行全系统备份,也不会执行应用程序的备份或还原,否则会导致所有应用程序数据通过adb保存。 此属性的默认值为true。 这被认为是一个安全问题,因为人们可以通过ADB备份您的应用程序,然后将您的应用程序的私人数据存入PC。 不过,我认为这不是问题,因为大多数用户不知道adb是什么,如果他们这样做,他们也会知道如何根设备。 ADBfunction只有在设备启用了debuggingfunction的情况下才能工作,这需要用户启用它。 因此,只有将其设备连接到PC并启用debuggingfunction的用户才会受到影响。 如果他们在使用ADB工具的PC上有恶意应用程序,这可能会造成问题,因为应用程序可能读取私有存储数据。 我认为Google应该在开发者类别中添加一项默认禁用的function,以允许通过ADB备份和恢复应用程序。 “android: backupAgent ”允许使用云的备份和还原function,如下所示: 实现应用程序的备份代理的类的名称,它是BackupAgent的一个子类。 属性值应该是完全限定的类名(例如“com.example.project.MyBackupAgent”)。 但是,如果名称的第一个字符是一个句点(例如,“.MyBackupAgent”),则会将其附加到元素中指定的包名称。 没有默认。 该名称必须指定。 这不是一个安全问题。
我已经使用提供的FileBackupHelper实现了一个BackupAgentHelper来备份和恢复我拥有的本地数据库。 这是您通常与ContentProviders一起使用的数据库,位于/data/data/yourpackage/databases/ 。 有人会认为这是常见的情况。 但是文档不清楚该怎么做: http : //developer.android.com/guide/topics/data/backup.html 。 这些典型的数据库没有专门的BackupHelper 。 因此,我使用了FileBackupHelper ,将其指向“ /databases/ ”中的.db文件,在我的ContentProviders引入了任何数据库操作(如db.insert )的锁,甚至尝试在onRestore()之前创build“ /databases/ ”目录onRestore()因为安装后它不存在。 过去,我在其他应用程序中成功实施了类似的SharedPreferences解决scheme。 但是,当我在emulator-2.2中testing新的实现时,我看到从日志执行到LocalTransport的备份,以及正在执行的恢复(并onRestore() )。 然而,数据库文件本身从来没有创build。 请注意,这完全是在安装之后,在应用程序第一次启动之前,在执行还原之后。 除此之外,我的testing策略是基于http://developer.android.com/guide/topics/data/backup.html#Testing 。 另外请注意,我不是在谈论一些我自己pipe理的sqlite数据库,也不是关于备份到SD卡,自己的服务器或其他地方。 我在文档中看到了一些关于build议使用自定义的BackupAgent数据库,但似乎并不相关: 但是,如果需要,可能需要直接扩展BackupAgent:*备份数据库中的数据。 如果您在用户重新安装应用程序时想要还原SQLite数据库,则需要构build自定义的BackupAgent,以在备份操作期间读取相应的数据,然后创build表并在还原操作期间插入数据。 请澄清一下。 如果我真的需要自己做到SQL级别,那么我担心以下主题: 打开数据库和事务。 我不知道如何从我的应用程序的工作stream程之外的单一类中closures它们。 如何通知用户正在进行备份和数据库被locking。 这可能需要很长时间,所以我可能需要显示进度条。 如何做同样的恢复。 据我所知,恢复可能发生在用户已经开始使用应用程序(并input数据到数据库)。 所以你不能假定只是恢复备份的数据(删除空的或旧的数据)。 你将不得不以某种方式join它,因为任何非平凡的数据库是不可能的,由于ID的。 如何在还原完成后刷新应用程序,而不会让用户卡在某些 – 现在无法访问的点上。 我可以确定数据库已经在备份或恢复中升级了吗? 否则预期的模式可能不匹配。