(FFOS Gecko & Gaia) OTA

  OTA整体框架里会涉及以下代码,从gaia到gecko都有,而且由于历史原因,复用了desktop browser的一些模块,还有一些冗余代码,分析时走了不少弯路。

1. Gaia部分

  (a) gaia/apps/settings/js/panels/about/update_check.js

    这个Settings中OTA功能的入口,通过AMD(Asynchronous Module Definition)规范,定义了一个模块UpdateCheck。

  (b) gaia/apps/system/js/update_manager.js

    这是SystemApp导出的全局对象:window.UpdateManager,它是Gaia层与Gecko层通信的桥梁,通过mozContentEvent&mozChromeEvent进行通信。

  (c) gaia/apps/system/js/updatable.js

    这是一个辅助类,updatable.js的开头注释中很好的描述了它的的职责:它代表了一个system update(SystemUpdatable)或者一个application update(AppUpdatable,暂时不分析),XXXUpdatable与window.UpdateManager通信,处理download等相关动作。

2. Gecko部分

  Gecko中的代码比较分散,大致在3个位置,分别是:gecko/b2g/components/,gecko/dom/system/和gecko/toolkit/mozapps/update/。

  (a) gecko/toolkit/mozapps/update/nsIUpdateService.idl

    这个idl文件十分重要,它定义了很多重要的interface。下面按照代码里的顺序,简单罗列一下所有的interfaces:

    (1) nsIUpdatePatch

      表示一个updatable patch,也就是update.xml中一个patch节点,包含type,URL等属性。

    (2) nsIUpdate

      表示一个update,也就是update.xml中的update节点,可能包含N(N>=1)个nsIUpdatePatch。

    (3) nsIUpdateCheckListener

      nsIUpdateChecker的回调,当check complete或者check error时回调。

    (4) nsIUpdateChecker

      不难理解,定义了update check相关接口,比如:

        void checkForUpdates(in nsIUpdateCheckListener listener, in boolean force);

    (5) nsIApplicationUpdateService

      一个global application service,包含check,download等操作

    (6) nsIUpdateProcessor

      处理下载完成的update package,好像没有文件实现这个interface,但是在nsUpdateService.js有调用这个interface,费解。

    (7) nsIUpdateManager

      维护所有update的状态,包括当前active update的状态

    (8) nsIUpdatePrompt

      由名字可以知道,这是与user notification相关的interface。

      值得注意的是,有2个文件都实现了这个interface,分别是gecko/b2g/components/UpdatePrompt.js和gecko/toolkit/mozapps/update/nsUpdateService.js,但是前者才是b2g中使用的,后者是属于desktop browser的。

  (b) gecko/toolkit/mozapps/update/nsUpdateService.js

    这个文件是对nsIUpdateService.idl的实现,大概有5000行,比较庞大,但是里面有很多desktop browser相关的代码,分析时可以忽略。下面罗列一下它包含的对象('--->'表示实现了):

    (1) UpdatePatch ---> nsIUpdatePatch

    (2) Update ---> nsIUpdate

    (3) UpdateService ---> nsIApplicationUpdateService

    (4) UpdateManager ---> nsIUpdateManager

    (5) Checker ---> nsIUpdateChecker

    (6) Downloader ---> nsIRequestObserver, nsIProcessEventSink

      download worker,表示一个下载任务。

    (7) UpdatePrompt ---> nsIUpdatePrompt

      忽略(for desktop browser)

  (c) gecko/toolkit/mozapps/update/nsUpdateService.manifest

    这里定义了contractID与实现实体的对应关系

    (1) '@mozilla.org/updates/update-service;1' ---> UpdateService

    (2) '@mozilla.org/updates/update-manager;1' ---> UpdateManager

    (3) '@mozilla.org/updates/update-checker;1' ---> Checker

  (d) gecko/toolkit/mozapps/update/UpdateTelemetry.jsm

    telemetry相关的东西,暂时不分析

  (e) gecko/toolkit/mozapps/update/nsUpdateServiceStub.js

    不知何用,呵呵,以后分析

  (f) gecko/toolkit/mozapps/update/updater/

    好像是有关mar文件的读取和更新的一些代码,待分析

  (g) gecko/b2g/components/UpdatePrompt.js

    (1) UpdateCheckListener ---> nsIUpdateCheckListener

    (2) UpdatePrompt ---> nsIUpdatePrompt

      gecko/b2g/components/B2GComponents.manifest里定义了contractID的对应关系:

        '@mozilla.org/updates/update-prompt;1' ---> UpdatePrompt

  (h) gecko/dom/system/nsISystemUpdateProvider.idl

  (i) gecko/dom/system/SystemUpdateService.jsm

  (j) gecko/dom/system/SystemUpdateManager.js

  (k) gecko/dom/system/

  (l) gecko/dom/webidl/SystemUpdate.webidl

上一张图

原文地址:https://www.cnblogs.com/code-4-fun/p/4701452.html