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
上一张图