离线包是一个加签的压缩文件,其包含了 HTML 资源和 Javascript 代码供 H5 容器加载,使其内容能在 WebView 内渲染。离线包的类型有两种,一种是全局离线包,它包含公共的资源可供多个应用共同使用。另一种是私有离线包,它只可以被某个应用单独使用。
当 H5 容器发出资源请求时,其访问本地资源或线上资源所使用的 URL 是一样的。该请求会先被 H5 容器截获,如果本地有资源可以满足该请求的话,本地资源将被 H5 容器所使用,否则将使用线上资源。所以无论资源是在本地或者是线上,WebView 是无感知的。
当离线包被下载和存储在设备后,会按需载入内存中,在载入内存之前会对离线包进行一次验签来确保数据的完整性。另外,离线包当内容不会被解压,这样就可以避免为每一个文件进行验签的必要性。如果离线包验签结果通过,其内容会以 Map 的形式存储在内存中,Map 的 key 是对应资源的 URL, value 是资源的字元数组。
使用离线包的好处
如上图所示,H5 容器将先尝试加载全局离线包和私有离线包,如果下载或验签失败,便加载线上版本兜底。最终内容会交由 WebView 中渲染。