android4.0.1 webkit 子资源下载过程分析

时间:2022-05-10 13:46:49
网页上的子资源包括,image, script, cssstylesheet, font, XSLstylesheet等。这些子资源是以document的元素或元素属性形式出现的,

所以它们的加载是在主资源加载完成并创建了相应的element后,由element或其辅助类负责加载的。

下面的类图是webkit加载子资源用到的主要类类图。


类图下载地址

android4.0.1 webkit 子资源下载过程分析

CachedResourceLoader是webkit中管理子资源加载的类,webkit中任何想加载子资源的类都通过调用CachedResourceLoader提供的接口来实现子资源加载。

如:HTMLLinkElement调用CachedResourceLoader的接口requestCSSStyleSheet()来加载cssstylesheet子资源。
        scriptElement调用CachedResourceLoader的接口requestScript()来加载script子资源。
        ImageLoader调用CachedResourceLoader的接口requestImage()来加载image子资源。

CachedResourceClient是注册给CachedResource的回调类,以便需要加载子资源的类可以知道子资源的加载状态(请求的子资源数据是否到来,加载是否完成).

所以HTMLLinkElement,scriptElement,ImageLoader都需要继承自CachedResourceClient。

并通过CachedResource提供的接口setClient()将自己注册给CachedResource.

CachedResource在接收到子资源数据时回调CachedResourceClient接口。

CachedResource是表示子资源的一般类,每一种特定的子资源都继承自它。

如:CachedScript, CachedImage, CacheFont, CachedCSSStyleSheet。

CachedResourceClient与CachedResource是典型的监听者模式。

CachedResourceRequest与CachedResourceLoader,CachedResource,SubResourceLoader之间是一个中介者模式。

实现CachedResourceLoader与SubResourceLoader之间的解耦。CachedResourceRequest作为具体中介者负责协调

CachedResourceLoader,CachedResource,SubResourceLoader之间的协作。

SubresourceLoaderClient提供接口供SubResourceLoader回调,以通知子资源下载状态。

CachedResourceRequest需要了解子资源的下载状态以便协调CachedResourceLoader,CachedResource的工作,所以它继承自SubresourceLoaderClient。

并在通过ResourceLoadScheduler的接口创建SubresourceLoader的实例时,将自身作为参数传给SubresourceLoader。

SubresourceLoader在子资源下载状态发生变化时回调CachedResourceRequest的接口。

每加载一个子资源CachedResourceLoader就会创建一个CachedResourceRequest的实例。

由于涉及多个下载请求的异步处理,所以webkit采用ResourceLoadScheduler来管理下载请求。即管理各个SubResourceLoader的下载顺序。

SubResourceLoader与MainResourceLoader(用于下载main frame的类)都继承自ResourceLoader.

ResourceLoader使用ResourceHandle来实现具体的下载功能。

ResourceHandleClient提供接口供ResourceHandle调用来通知下载状态。

ResourceLoader为了获知下载状态继承了ResourceHandleClient类,并在创建ResourceHandle类时将自身作为参数传给ResourceHandle.

网络下载是平台相关的,webkit使用ResourceHandleInternal封装了平台差异性。ResourceHandle包含一个ResourceHandleInternal的实例的引用,两者是典型的代理模式。

android4.0.1中的webkit的网络功能利用了android实现的java层的网络模块。

所以ResourceHandle最终通过WebFrame回调到java层的BrowserFrame,从而调用android java层的网络模块,实现资源加载功能。

android4.0.4开始webkit的网络功能使用的是chrome network stack, 不再回调到java层网络,这是android4.0.4浏览器性能优于4.0.1的一个原因。

下面的顺序图描述了从启动加载image子资源到接收到子资源数据的过程:


顺序图下载地址

android4.0.1 webkit 子资源下载过程分析

android java层的网络监听模块LoaderListener在接收到网络数据后,通过JNI层WebCoreResourceLoader调用

SubResourceLoader的didReceiveData(),SubResourceLoader先调用父类ResourceLoader中的addData()

将收到的数据存入SharedBuffer中,然后调用CachedResourceRequest的didReceiveData().

CachedResourceRequest会调用CachedImage的data将SubResourceLoader中存储image数据的SharedBuffer指针保存在自己的m_data中,同时设置给image成员,

(image被渲染时才会解码).CachedResourceLoader 返回给ImageLoader的就是指向这个已经设置好了image数据的CachedImage的指针。