在 Firefox OS 上备份用户数据

FFOS 备份/恢复团队

波特兰州立大学的计算机科学学位课程以一个顶峰项目告终,该项目将学生团队与行业赞助商匹配,进行为期六个月的软件工程项目。我们有幸与 Mozilla 合作开发一款应用程序,用于备份和恢复 Firefox OS 上的个人数据。我们团队成员包括:

Ryan Bernstein:团队负责人/历史记录/演示应用程序。
David Cobbley:联系人/短信。
Thomas Guerena:架构/构建环境/媒体。
吴昊:短信/空间检查。
江凯:短信。空间检查。
Nathan Larson:历史记录/系统设置。
Ruben Niculcea:构建环境/媒体/短信。
Dean Nida:媒体/联系人/测试。

From left: Nathan Larson, Jiang Kai, Wu Hao, David Cobbley, Dean Nida, Ruben Niculcea, Thomas Guerena, Ryan Bernstein

从左至右:Nathan Larson、江凯、吴昊、David Cobbley、Dean Nida、Ruben Niculcea、Thomas Guerena、Ryan Bernstein

Firefox OS 备份/恢复库

这个顶峰项目的目的是允许 Firefox OS 用户备份和恢复他们的个人数据。尽管该操作系统非常需要备份功能,但它并没有提供任何原生支持。Firefox OS 最初的目标是发展中国家,在那里它运行在价格低廉的硬件上,可能是用户的首要计算设备。

制作备份应用程序是一项艰巨的任务。作为开发人员,我们无法预测操作系统本身和用户创建的数据类型在未来的变化。最终,我们决定,高级顶峰团队的短期性质意味着我们将无法提供长期支持,以便在应用商店中部署和维护应用程序。

因此,我们决定创建一个库,而不是一个独立的应用程序。我们的理由是,通过为其他开发人员提供基础来构建自己的备份应用程序,我们将能够产生更大的影响。经过六个月的开发,我们创建了 Firefox OS 备份/恢复 (FFOSBR) 库,以及一个小型测试应用程序来演示其基本功能。

FFOSBR 的功能

Firefox OS 备份/恢复 (FFOSBR) 库旨在将媒体备份到 SD 卡上。虽然我们曾设想过能够通过 USB 备份数据,但这将需要开发一个配套应用程序来解释接收 PC 上的数据,这超出了我们项目范围。

FFOSBR 库能够备份和恢复以下内容:

  • 照片
  • 音乐
  • 视频
  • 联系人
  • 系统设置

该库还可以备份用户的短信和彩信。但是,Firefox OS 目前没有提供 API,可以在不通过短信或彩信实际发送的情况下将消息添加到手机中。因此,消息被备份为 JSON 对象,存储在 SD 卡上的文本文件中,但无法恢复回手机。

实现

FFOSBR 被实现为一组模块。每种类型的个人数据都有一个模块,但还有额外的“辅助”模块用于将库整合在一起。值得注意的是,这些模块包括一个 ffosbr.settings 模块,用于跟踪应用程序设置(例如哪些数据类型启用了备份),以及一个 ffosbr.history 模块,用于跟踪每种数据类型的备份日期和大小。

特定于数据类型的模块至少实现三个公共函数:backup()restore()clean()。这些函数都接受一个单一的回调参数 oncomplete。回调应该是一个接受两个参数的函数。第一个参数始终是备份类型的名称;发生的任何错误都将作为第二个参数传递给 oncomplete 函数。将类型作为第一个参数传递,使我们能够使用一种称为“耐心完成”的技术,这种技术将在后面介绍。

此外,还有一些顶级辅助模块——ffosbr.backup()ffosbr.restore()ffosbr.clean()——它们分别遍历所有启用的特定于数据类型的模块,并调用其 backup()restore()clean() 方法。这就是“耐心完成”发挥作用的地方。让我们以 ffosbr.backup() 为例。

ffosbr.backup()

ffosbr.backup() 接受三个参数,它们都是回调方法。分别是 onsuccessonerroroncomplete

ffosbr.backup() 异步运行每个数据类型的 backup() 方法,并使用名为 callbackManager() 的函数作为 oncomplete。如上所述,每个数据类型的 backup() 方法使用数据类型的名称作为第一个参数调用其 oncomplete 方法,以便 callbackManager() 能够识别它。随着每个数据类型完成,callbackManager() 检查其第二个参数以确定是否发生了错误。如果是,则调用 onerror();否则,调用 onsuccess()。只有在所有数据类型的 backup() 方法都完成之后,ffosbr.backup() 方法才会完成,并调用其自己的 oncomplete 回调。

用法

因此,备份所有类型的用户数据的函数可能看起来像这样:


var successes = [];
var failures = [];

var reportSuccess = function(type) {
  if (type && !successes.includes(type)) {
    alertUser(type + ' saved successfully');
    successes.push(type);
  }
};

var reportError = function(type, error) {
  if (type && !failures.includes(type)) {
    alertUser(type + ' failed');
    failures.push(type);
  }
};

var finished = function() {
  var sitrep = 'SUCCESSES:\n';
  for (var i = 0; i < successes.length; ++i) {
    sitrep += '\t' + successes[i] + '\n';
  }
  sitrep += '\nFAILURES:\n';

  for (i = 0; i < failures.length; ++i) {
    sitrep += '\t' + failures[i] + '\n';
  }

  alert(sitrep);
};

ffosbr.backup(reportSuccess, reportError, finished);

清理和恢复看起来很相似,但在最后一行使用 ffosbr.clean()ffosbr.restore() 来代替 ffosbr.backup()

演示应用程序

除了 FFOSBR 库本身之外,我们还创建了一个简单的演示应用程序来展示其一些功能。主屏幕显示有关当前备份状态的信息,并带有备份和恢复所有启用类型的按钮。


2015-08-29-03-38-19
 

单击任何列出的类型将打开一个子菜单。


2015-08-30-23-47-11
从这里,用户可以为该数据类型启用或禁用备份。他们也可以单独恢复该类型的数据,或者从 SD 卡的备份目录中清除该类型的备份。

请记住,我们的主要产品是库本身;作为演示,该应用程序相对简陋。但是,它确实为用户提供了将媒体、联系人,以及系统设置备份到 SD 卡的功能。

未来改进

不幸的是,并非所有备份都是完全无损的。音乐、图片和视频按文件处理。因此,备份或恢复数据不会删除手机或 SD 卡上已存在的数据。但是,联系人、消息和系统设置被备份到 SD 卡备份目录中的特定文件。这些文件在每次备份时都会被覆盖。将来,我们可以通过在文件名中添加时间戳来解决这个问题,以便每次备份都创建一个新文件。

联系人模块目前也同步运行。ffosbr.contacts.backup() 调用一个从 SIM 卡获取联系人的函数,该函数又调用一个从设备获取联系人的函数。理想情况下,它们应该是两个完全独立的操作,分别备份到完全独立的文件中,因为这将允许我们恢复 SIM 联系人回 SIM 卡,以及设备联系人回设备。我们直到编写完联系人模块之后才设计出“耐心完成”策略,但使用该策略将使我们能够将 SIM 和设备联系人并行备份到单独的文件中。

安装 Firefox OS 备份/恢复

FFOSBR 项目可以在 GitHub 上找到:github.com/autonome/FFOSBR。如果您是 Firefox OS 开发者或技术用户,请查看并告诉我们您的想法。

关于 Ryan Bernstein

更多 Ryan Bernstein 的文章……