webkit for android_第1页
webkit for android_第2页
webkit for android_第3页
webkit for android_第4页
webkit for android_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、webkit for android网上有许多webkit的分析文章,其中针对android porting的一篇文章WebKit WebKit For Android,写的非常好,分析得非常深入。不过这篇文章针对的Android版本比较老(具体版本无从考究),因此本文将在这篇文章的基础上,加入android 4.0 webkit porting的一些内容。一、Android WebKit简介Webkit是一个开源的浏览器排版和渲染引擎,包含WebCore和JavascriptCore。WebKit有众多的实现(Qt、Gtk, windows, chromium, android, etc)。

2、Android 4.0平台的Web引擎框架采用了WebKit中的WebCore,javascript引擎则是采用google的V8引擎。Android 4.0的webkit采用了和chromium 12.0.742.130中webkit相同的codebase,webkit版本为534.30。二、Android WebKit模块框架Android平台的WebKit上层由Java语言封装,并且作为API提供给Android应用开发者,而底层使用WebKit核心库 (WebCore)进行网页排版。WebKit模块分为两个部分: Java层和C层(webkit库)。Java层和C层通过JNI相互调用,

3、如图1所示:图1 Android WebKit模块框架在webkit其它平台的移植中,webkit层就是封装WebCore,为上层应用提供接口的。Android的平台 具有一定的特殊性,需要提供Java API接口,应用程序框架也是基于Java的,所以在Android的移植中,webkit层实际上被拆成两部分,Java部分和C+部分,它们之间通 过JNI接口进行通讯。JNI是一种双向通讯机制,Java代码可以调用C/C+代码,C/C+代码也可以调用Java代码。通常,WebCore中回调Java的代码都位于WebKit(Android Implementation)层,但有一个例外,就是Sou

4、rce/WebCore/platform/android /GeolocationServiceBridge.cpp,该文件也包含回调到Java的代码。2.1 Java层框架2.1.1 Java层源码说明Java层的代码位于frameworks/base/core/java/android/webkit目录下。各文件的简单说明如下:AccessibilityInjector.java为WebView注入Accessibility. Accessibity是为残障人士提供辅助支持的BrowserFrame.java对WebCore中Frame对象的Java层封装,用于创建WebCore中定义的F

5、rame,以及为该Frame对象提供Java层回调方法ByteArrayBuilder.java辅助对象,用于byte块链表的处理。android 4.0 WebKit中不再使用CacheLoader.javaandroid 4.0 WebKit中不再使用CacheManager.javaCache管理对象,负责Java层Cache对象管理android 4.0使用chromium_net处理缓存,不再需要CallbackProxy.java该对象是用于处理WebCore与UI线程消息的代理类。当有Web事件产生时WebCore线程会调用该回调代理类,代理类会通过消息的方式通知UI线程,并且调

6、用设置的客户对象的回调函数。CertTool.java证书工具ClientCertRequestHandler.java处理客户端证书请求ConsoleMessage.java来自WebCore的Javascript控制台消息ContentLoader.javaandroid 4.0 WebKit中不再使用CookieManager.java根据RFC2109规范,管理cookies。android 4.0使用chromium_net处理Cookie,不再需要CookieSyncManager.javaCookies同步管理对象,该对象负责同步RAM和Flash之间的Cookies数据。实际的

7、物理数据操作在基类WebSyncManager中完成。android 4.0不再需要DataLoader.javaandroid 4.0 WebKit中不再使用DateSorter.java日期排序。分类最近一周、最近一月、最近一年DebugFlags.java定义调试标志DeviceMotionAndroidOrientationManager.java用于实现DeviceMotion和DeviceOrientationDeviceMotionService.java实现SensorEventListener接口,处理动作DeviceOrientationService.java实现Sens

8、orEventListener接口,处理方向变化DownloadLister.java下载侦听器接口FileLoader.javaandroid 4.0 WebKit中不再使用FindActionModeCallback.java页内查找回调。注:Android 4.0的页内查找有很多bug,基本上不可用FrameLoader.javaFrame载入器,用于载入网页Frame数据GeolocationPermission.java用于管理浏览器UI的位置信息权限GeolocationService.java实现java侧的GeolocationServiceAndroidHTML5Audio.

9、javaHTML5 audio支持类HTML5VideoFullScreen.java全屏视频视图,仅提供给浏览器使用HTML5VideoInline.java内嵌视频视图,仅提供给浏览器使用HTML5VideoView.java视频视图,仅提供给浏览器使用HTML5VideoViewProxy.javaHTML5视频视图代理类HttpAuthHandler.javaHTTP认证请求,需要用户处理。比如登录路由器的管理页面。HttpAuthHandlerImpl.javaHttpAuthHandler实现,仅用于Android Java HTTP stackJniUtil.java供JNI使用

10、的实用类,用于获取cache目录等C代码无法直接获取的信息,以及读取资源包中的文件等JsPromptResult.javaJs结果提示对象,用于向用户提示Javascript运行结果。JsResult.javaJs结果对象,用于用户交互JWebCoreJavaBridge.java用Java与WebCore库中Timer和Cookies对象交互的桥接代码。KeyStoreHandler.javahttps相关处理L10nUtils.java字符串国际化,在使用chrome http stack时用到LoadListener.java载入器侦听器,用于处理载入器侦听消息。android 4.0

11、WebKit中不再使用MimeTypeMap.javaMIME类型映射MockGeolocation.java模拟地理位置信息Network.java该对象封装网络连接逻辑,为调用者提供更为高级的网络连接接口。OverScrollGlow.java用于实现OverScroller效果PerfChecker.java性能测试Plugin.java插件处理相关PluginData.java插件处理相关PluginFullScreenHolder.java插件处理相关PluginList.java插件处理相关PluginManager.java插件处理相关PluginStub.java插件处理相关S

12、earchBox.java定义搜索对话框接口SearchBoxImpl.java搜索对话框接口实现SelectActionModeCallback.java页面内选择时的回调。BUG很多SslCertLookupTable.javahttps相关处理SslClientCertLookupTable.javahttps相关处理SslErrorHandler.javahttps相关处理SslErrorHandlerImpl.javahttps相关处理StreamLoader.javaandroid 4.0 WebKit中不再使用UrlInterceptHandler.java用于google ge

13、ars,已废弃UrlInterceptRegistry.java用于google gears,已废弃URLUtil.javaURL处理实用类ValueCallback.java回调接口,用于异步返回数据值ViewManager.java子视图管理类,主要用于管理插件视图ViewStateSerializer.javaWebView视图序列化和反序列化WebBackForwardList.java该对象包含WebView对象中显示的历史数据。WebBackForwardListClient.java浏览历史处理的客户接口类,所有需要接收浏览历史改变的类都需要实现该接口。WebChromeClie

14、nt.javaChrome客户基类,Chrome客户对象在浏览器文档标题、进度条、图标改变时候会得到通知。WebHistoryItem.java该对象用于保存一条网页历史数据WebIconDatabase.java图标数据库管理对象,所有的WebView均请求相同的图标数据库对象WebResourceResponse.java封装某个资源的响应信息WebSettings.javaWebView的管理设置数据,该对象数据是通过JNI接口从底层获取。WebStorage.java处理webstorage数据库WebSyncManager.java数据同步对象,用于RAM数据和FLASH数据的同步操

15、作。WebTextView.java在html文本输入控件激活时,显示系统原生编辑组件WebView.javaWeb视图对象,用于基本的网页数据载入、显示等UI操作。WebViewClient.javaWeb视图客户对象,在Web视图中有事件产生时,该对象可以获得通知。WebViewCore.java该对象对WebCore库进行了封装,将UI线程中的数据请求发送给WebCore处理,并且通过CallbackProxy的方式,通过消息通知UI线程数据处理的结果。WebViewDatabase.java该对象使用SQLiteDatabase为WebCore模块提供数据存取操作。WebViewFra

16、gment.java实现WebView嵌入到Fragment中WebViewWorker.java实现html5 workers,在UI线程和webkit线程开启单独的线程ZoomControlBase.java缩放控件接口ZoomControlEmbedded.java内置缩放控件ZoomControlExternal.java扩展缩放控件,已废弃ZoomManager.java维护WebView的缩放状态2.1.2 Java层主要类关系图WebKit Java层包含79个Java文件,主要的类关系图如下:1)WebViewWebView类是WebKit模块Java层的视图类,所有需要使用W

17、eb浏览功能的Android应用程序都要创建该视图对象显示和处理请求的 网络资源。目前,WebKit模块支持HTTP、HTTPS、FTP以及javascript请求。WebView作为应用程序的UI接口,为用户提供了 一系列的网页浏览、用户交互接口,客户程序通过这些接口访问WebKit核心代码。2)WebViewDatabaseWebViewDatabase是WebKit模块中针对SQLiteDatabase对象的封装,用于存储和获取运行时浏览器保存的缓冲数据、历 史访问数据、浏览器配置数据等。该对象是一个单实例对象,通过getInstance方法获取WebViewDatabase的实例。 W

18、ebViewDatabase是WebKit模块中的内部对象,仅供WebKit框架内部使用。3)WebViewCoreWebViewCore类是Java层与C层WebKit核心库的交互类,客户程序调用WebView的网页浏览相关操作会转发给 BrowserFrame对象。当WebKit核心库完成实际的数据分析和处理后会回调WebViweCore中定义的一系列JNI接口,这些接口会通过 CallbackProxy将相关事件通知相应的UI对象。4)CallbackProxyCallbackProxy是一个代理类,用于UI线程和WebCore线程交互。该类定义了一系列与用户相关的通知方法,当WebCo

19、re完成相应的数据处理,则会调用CallbackProxy类中对应的方法,这些方法通过消息方式间接调用相应处理对象的处理方法。5)BrowserFrameBrowserFrame类负责URL资源的载入、访问历史的维护、数据缓存等操作,该类会通过JNI接口直接与WebKit C层库交互。6)JWebCoreJavaBridge该类为Java层WebKit代码提供与C层WebKit核心部分的Timer和Cookies操作相关的方法。7)WebSettings该对象描述了WEB浏览器访问相关的用户配置信息。8)DownloadListener下载侦听接口,如果客户代码实现该接口,则在下载开始、失败、

20、挂起、完成等情况下,DownloadManagerCore对象会调用客户代码中实现的DwonloadListener方法。9)WebBackForwardListWebBackForwarList对象维护着用户访问历史记录,该类为客户程序提供操作访问浏览器历史数据的相关方法。10)WebViewClientWebViewClient类定义了一系列事件方法,如果Android应用程序设置了WebViewClient派生对象,则在页面载入、资源载入、页面访问错误等情况发生时,该派生对象的相应方法会被调用。11)WebBackForwardListClientWebBackForwardListCl

21、ient对象定义了对访问历史操作时可能产生的事件接口,当用户实现了该接口,则在操作访问历史时(访问历史移除、访问历史清空等)用户会得到通知。12)WebChromeClientWebChromeClient类定义了与浏览窗口修饰相关的事件。例如接收到Title、接收到Icon、进度变化时,WebChromeClient的相应方法会被调用。2.1.3 流载入器(已废弃)在Android 4.0之前的版本,数据载入都是在Java层实现的,从4.0开始,Android webkit引入了chromium的部分代码,输入载入走的是C+代码。不过原有的Java代码仍然保留,可以在编译webkit时用 U

22、SE_CHROME_NETWORK_STACK宏进行切换。2.2 C层框架2.2.1 C类与Java类的关系WebKit类一般被拆成两个,Java类和C+类。比如在Java API部分,有一个WebView类,在C+部分,也有一个WebView类。WebViewCore, WebSettings等等也是同样的。需要注意的是,JNI是C语言接口,所以Java类并不能直接调用C+代码,需要在C+代码中export出C语言接口。所以代码中使用了一个技巧,在Java类中定义一个int成员变量(实际上是一个指针),指向对应的C+类,如下图所示:1BrowserFrame与BrowserFrame Jav

23、a类相对应的C+类为WebFrame(文件名为WebCoreFrameBridge.cpp),该类为Dalvik虚拟机回调 BrowserFrame类中定义的本地方法进行了封装。与BrowserFrame中回调函数(Java层)相对应的C层结构定义如下:struct WebFrame:JavaBrowserFrame jweak mObj; jweak mHistoryList; / WebBackForwardList object jmethodID mStartLoadingResource; jmethodID mMaybeSavePassword; jmethodID mShould

24、InterceptRequest; jmethodID mLoadStarted; jmethodID mTransitionToCommitted; jmethodID mLoadFinished; jmethodID mReportError; jmethodID mSetTitle; jmethodID mWindowObjectCleared; jmethodID mSetProgress; jmethodID mDidReceiveIcon; jmethodID mDidReceiveTouchIconUrl; jmethodID mUpdateVisitedHistory; jme

25、thodID mHandleUrl; jmethodID mCreateWindow; jmethodID mCloseWindow; jmethodID mDecidePolicyForFormResubmission; jmethodID mRequestFocus; jmethodID mGetRawResFilename; jmethodID mDensity; jmethodID mGetFileSize; jmethodID mGetFile; jmethodID mDidReceiveAuthenticationChallenge; jmethodID mReportSslCer

26、tError; jmethodID mRequestClientCert; jmethodID mDownloadStart; jmethodID mDidReceiveData; jmethodID mDidFinishLoading; jmethodID mSetCertificate; jmethodID mShouldSaveFormData; jmethodID mSaveFormData; jmethodID mAutoLogin; AutoJObject frame(JNIEnv* env) return getRealObject(env, mObj); AutoJObject

27、 history(JNIEnv* env) return getRealObject(env, mHistoryList); ;该结构作为WebFrame(C层)的一个成员变量(mJavaFrame),在WebFrame构造函数中,用 BrowserFrame(Java层)类的回调方法的method ID初始化JavaBrowserFrame结构的各个域。初始后,当WebCore(C层)在剖析网页数据时,有Frame相关的资源改变,比如WEB 页面的主题变化,则会通过mJavaFrame结构,调用指定BrowserFrame对象的相应方法,通知Java层处理。2JWebCoreJavaBrid

28、ge与该对象相对应的C层对象为JavaBridge,JavaBridge对象继承了TimerClient, CookieClient, KeyGenerateorClient, FileSystemClient类,主要负责WebCore中的定时器和Cookie管理。与Java层JWebCoreJavaBridge类中方法 method ID相关的是JavaBridege中几个成员变量,在构造JavaBridge对象时,会初始化这些成员变量,之后有Timer或者Cookies事件 产生,WebCore会通过这些ID值,回调对应JWebCoreJavaBridge的相应方法。3LoadListen

29、er与该对象相关的C层对象为WebCoreResourceLoader,与LoaderListener中回调函数(Java层)相对应的C层结构 是struct resourceloader_t,该结构保存了LoadListener对象ID、CancelMethod ID以及DownloadFiledMethod ID等值。当有Cancel或者Download事件产生,WebCore会回调LoadListener类中的CancelMethod或者 DownloadFileMethod。4WebViewCore与WebViewCore相关的C类是WebViewCorel,定义了两个数据结构,一个是

30、WebViewCoreFields,对应于Java 层WebViewCore对象的成员变量,另一个是WebViewCore:JavaGlue,对应于Java层WebViewCore对象的成员方 法。定义如下:/ Field ids for WebViewCorestruct WebViewCoreFields jfieldID m_nativeClass; jfieldID m_viewportWidth; jfieldID m_viewportHeight; jfieldID m_viewportInitialScale; jfieldID m_viewportMinimumScale; j

31、fieldID m_viewportMaximumScale; jfieldID m_viewportUserScalable; jfieldID m_viewportDensityDpi; jfieldID m_webView; jfieldID m_drawIsPaused; jfieldID m_lowMemoryUsageMb; jfieldID m_highMemoryUsageMb; jfieldID m_highUsageDeltaMb; gWebViewCoreFields;/ -struct WebViewCore:JavaGlue jweak m_obj; jmethodI

32、D m_scrollTo; jmethodID m_contentDraw; jmethodID m_layersDraw; jmethodID m_requestListBox; jmethodID m_openFileChooser; jmethodID m_requestSingleListBox; jmethodID m_jsAlert; jmethodID m_jsConfirm; jmethodID m_jsPrompt; jmethodID m_jsUnload; jmethodID m_jsInterrupt; jmethodID m_didFirstLayout; jmeth

33、odID m_updateViewport; jmethodID m_sendNotifyProgressFinished; jmethodID m_sendViewInvalidate; jmethodID m_updateTextfield; jmethodID m_updateTextSelection; jmethodID m_clearTextEntry; jmethodID m_restoreScale; jmethodID m_needTouchEvents; jmethodID m_requestKeyboard; jmethodID m_requestKeyboardWith

34、Selection; jmethodID m_exceededDatabaseQuota; jmethodID m_reachedMaxAppCacheSize; jmethodID m_populateVisitedLinks; jmethodID m_geolocationPermissionsShowPrompt; jmethodID m_geolocationPermissionsHidePrompt; jmethodID m_getDeviceMotionService; jmethodID m_getDeviceOrientationService; jmethodID m_add

35、MessageToConsole; jmethodID m_formDidBlur; jmethodID m_getPluginClass; jmethodID m_showFullScreenPlugin; jmethodID m_hideFullScreenPlugin; jmethodID m_createSurface; jmethodID m_addSurface; jmethodID m_updateSurface; jmethodID m_destroySurface; jmethodID m_getContext; jmethodID m_keepScreenOn; jmeth

36、odID m_sendFindAgain; jmethodID m_showRect; jmethodID m_centerFitRect; jmethodID m_setScrollbarModes; jmethodID m_setInstallableWebApp; jmethodID m_enterFullscreenForVideoLayer; jmethodID m_setWebTextViewAutoFillable; jmethodID m_selectAt; AutoJObject object(JNIEnv* env) / We hold a weak reference t

37、o the Java WebViewCore to avoid memeory / leaks due to circular references when WebView.destroy() is not / called manually. The WebView and hence the WebViewCore could become / weakly reachable at any time, after which the GC could null our weak / reference, so we have to check the return value of t

38、his method at / every use. Note that our weak reference will be nulled before the / WebViewCore is finalized. return getRealObject(env, m_obj); ;WebViewCore类有个JavaGlue对象作为成员变量,在构建WebViewCore对象时,用WebViewCore(Java层)中 的方法ID值初始化该成员变量。并且会将构建的WebViewCore对象指针复制给WebViewCore(Java层)的mNativeClass, 这样将WebViewCo

39、re(Java层)和WebViewCore(C层)关联起来。5WebSettings与WebSettings相关的C层结构是struct FieldIds(文件名WebSettings.cpp),该结构保存了WebSettings类中定义的属性ID以及方法ID,在构建FieldIds对象时,会设置这些方法和属性的ID值。6WebView与WebView相关的C层类是WebView,该类中的m_javaGlue中保存着WebView(Java层)中定义的属性和方法ID,在 WebView(C层)构造方法中初始化,并且将构造的WebView对象(C层)的指针,赋值给WebView类(Java层)的

40、 mNativeClass变量,这样WebView(Java层)和WebView对象(C层)建立了关系。三、基本流程分析3.1 webkit初始化Android提供了WebView类,该类提供客户化浏览显示的功能。如果客户需要加入浏览器的支持,可像使用其它视图类一样加入应用程序,显示 给用户。当客户代码中第一次生成WebView对象时,会初始化WebKit库(包括Java层和C层两个部分),之后用户可以操作WebView对象完 成网络或者本地资源的访问。WebView对象的生成主要涉及4个类CallbackProxy、WebViewCore、WebViewDatabase以及 BrowserF

41、rame。其中CallbackProxy对象为WebKit模块中UI线程和WebKit类库提供交互功能,WebViewCore是 WebKit的核心层,负责与C层交互以及WebKit模块C层类库初始化,WebViewDatabase为WebKit模块运行时缓存、cookie 等数据存储提供支持,BrowserFrame用于创建WebCore中的Frame,并为Frame提供Java层回调方法。WebKit模块初始化流 程如下:实例化WebView 创建CallbackProxy对象 创建WebViewCore对象1. 调用System.loadLibrary载入webcore相关类库(C层)2

42、. 如果是第一次初始化WebViewCore对象,创建WebCoreTherad线程3. 创建EventHub对象,处理WebViewCore事件4. 获取WebIconDatabase对象实例5. 向WebCoreThread发送初始化消息 创建BrowserFrame对象 向WebView发送WEBCORE_INTIALIZED_MSG_ID消息,通知初始化完成 获取WebViewDatabase实例 调用init初始化WebView 收到WEBCORE_INITIALIZED_MSG_ID消息后,调用nativeCreate3.1.1 JNI native方法注册在创建WebViewCo

43、re时进行,调用System.loadLibrary方法载入webcore相关类库,该过程由Dalvik虚拟机完 成,它会从动态链接库目录中寻找libWebCore.so类库,载入到内存中,并且调用WebKit初始化模块的JNI_OnLoad方法(代码见 WebCoreJniOnLoad.cpp)。WebKit模块的JNI_OnLoad方法中完成了如下初始化操作:1. 初始化JavaBridgeregisterJavaBridge获取JWebCoreJavaBridge类的mNativeBridge成员变量的fieldID,以及注册JWebCoreJavaBridge类中的native方法2.

44、 初始化JniUtilregisterJniUtil注册JniUtil类中的native方法3. 初始化WebFrameregisterWebFrame获取BrowserFrame类的mNativeFrame成员变量的ID,以及注册BrowserFrame类中的native方法4. 初始化WebCoreResourceLoaderregisterResourceLoader获取LoadListener类的mNativeLoader成员的ID,以及注册LoadListener类中的native方法5. 初始化WebViewCoreregisterWebViewCore获取WebViewCore类的java成员的ID,以及注册WebViewCore类中的native方法6. 初始化WebHistoryregisterWebHistory获取WebHistoryItem类的java成员的ID

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论