CAW的个人总结

2024-01-01 17:10
文章标签 总结 个人 caw

本文主要是介绍CAW的个人总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  由于工作的需要,最近正在忙的进行Chromium的移植,作为新人,首先需要学习研究基础的东西,由于是基于android 平台的,所以首先需要了解的就是WebView这个控件是如何和底层chromium内核交互的。在工作之余,把最近工作学习的内容总结下来,以供学习记忆。

                   Android Chromium for WebView代码结构
   
    Chromium for WebView的实现代码结构。其实现分为两部分,一部分是Android WebView的Framework 以及public API 还有一部分是WebView的实现核心Chromium 下面这幅图展示这两种之间的关系以及上下结构。




Android Tree side

1.frameworks/base -- core/java/android/webkit/
(1)定义Public API(WebView,WebViewSettings, etc)
(2) 定义包内部隐藏类 WebViewFactoryProvider,WebViewProvider
(3)定义各种"POD(plain old data)“数据类型,用户在应用程序与 WebView实现间传递的数据类型。比如URLUtil类。
(4)定义一些WebView 的具体实现代码
2.frameworks/webview -- chromium/java
(1)glue 层代码,桥接Android WebView Framework 和 external/chromium_org
(2)在java部分这是chromium WebViewFactory的主要入口。
(3)这个目录下实现代码的目标是仅仅依赖android_webview的public API(部分除外,比如ThreadUtils,LibraryLoader,etc).并且不包含复杂逻辑。仅仅保持glue层状态。
3.frameworks/webview -- chromium/plat_support
   这部分代码提供平台支持,native support library绑定少部分android_webview/public api的副本(GL functor, skia bitmap访问utilities)

Chromium Tree side

1.android_webview/java
 (1)chromium 的顶层入口部分。
 (2)在Chromium 代码基础上提供一层wrapper/semi来向下兼容Android系统版本。
 (3)WebView的大部分API实现的后台支持由Chromium content    module(http://dev.chromium.org/developers/content-module)以及附属的components  browser (http://dev.chromium.org/developers/design-documents/browser-components)
这部分代码通过JNI对应到native部分代码 android_webview/native 目录下.
2.android_webview/native
(1)这个目录的代码更应该叫JNI部分代码,这一层代码只是android_webview/java与native代码的衔接层代码。类的命名基本是java层类的副本映射,并且承当的作用也是相同的。
(2)此目录存在可以存放避免复杂的实现逻辑,减轻android_webview/browser的压力或者 components压力
(3)这部分代码必须和WebView 的Public API运行在同一线程,WebView Public API运行在UI 线程,因此这部分的代码功能也必须运行在UI 线程。与BrowserThread 或者IPC 渲染线程 这种重要的交互代码放在browser目录之下。
3.android_webview/browser
 (1)这个目录代码实现浏览等重要的特性功能。
 (2) 需要复杂与native 线程交互的代码需要在此封装。
 (3) 为了模块化以及模块测试,在这部分代码没有静态强制依赖上层代码(android_webview/native)层代码。
4.android_webview/renderer
 包含所有在渲染进程中运行的逻辑代码。目前WebView只支持单进程渲染,browser/renderer保持分离,          这是个非常实用的架构,分离java应用程序部分与web platform代码,避免两者偶尔,相互独立更稳定。
5.android_webview/lib
这个目录下主要是libwebviewchromium.so的入口,没有其他模块依赖这目录下代码。
6.android_webview/common
  声明一些raw type 提供给android_webview/browser 和android_webview/renderer。
  WebView采用单进程模式,优势可以共享全局状态。这里也定义每个IPC的类型声明。
7.android_webview/public
(1)定义导出native部分的抽象接口,为关注在Java不能实现的重要的性能检测(比如渲染) 
(2)使用Android Framework内部工具来实现高性能后台兼容的custom view。
8.android_webview/unittestjava
   主要测试JNI部分代码

                                            
   总的来说 Android WebView 适配的代码大概可以分作两部分,一部分属于 Chromium source tree,一部分属于 Android source tree。
   只属于 Android source tree,不属于 Chromium source tree 的代码,分别位于 AOSP 源码树的 frameworks/base/core/java/android/webkit 和 frameworks/webview 目录下。
    frameworks/base/core/java/android/webkit 主要为第三方应用提供公开的 WebView API,它的代码包括:
 Android SDK 对外公开的 WebView API,包括 WebView,WebViewClient,WebChromeClient,WebSettings 等; 
 私有接口类,包括 WebViewProvider,WebViewFactoryProvider,这些接口供内部实现; 
 一些用于参数传递的简单数据结构(比如 WebViewTransport)和辅助类(比如 URLUtil); 
    frameworks/webview 是 Android WebView API 与 Chromium Content 层之间的 glue layer,它隔绝了 frameworks/base 和 external/chromium_org 代码之间的相互依赖,它实现了 frameworks/base 下的 WebViewProvider 等接口,将 WebView 发送过来的请求转发给 Chromium,并通过注册回调的方式为 Chromium 提供一些必须使用 Android 非公开 API 的代码。
   Chromium 的代码位于 AOSP 源码树的 external/chromium_org 目录下,它是 Chromium 代码仓库某个分支的一个 Clone,其中 android_webview 子目录下就是 Chromium 为 Android WebView 这个 Platform Configuration 适配的代码(如果是为 Android 平台适配的代码,一般位于各个模块的 android 子目录下,这部分是 CAW 和 Chrome for Android 共用的)。Chromium 的代码可以使用标准的 Android SDK/NDK 编译,它不依赖于上面列举的 Android source 的部分,是完全独立的,甚至代码里面还包括了一个 TestShell 可以进行简单的测试(external/chromium_org/android_webview/test)。

个人的想法总结(难免理解有出入,时时纠正更新):
   针对Android WebView在frameworks层的代码,WebView是由WebViewProvider实现,而WebViewProvider是接口,WebViewProvider由WebViewChromium实现,WebViewFactory和WebViewFactoryProvider是由WebViewChromiumFactoryProvider的实现。(其实WebViewFactory通过反射创建WebViewChromiumFactoryProvider,但我并不知道反射是什么?)
   WebSettings的接口,Android 4.4做了chromium 的桥阶层,主要涉及的WebSettings相关代码在ContentSettingsAdapter,AwSettings中。

 目前已经将几个重要的流程追踪了一下,已经将WebView这部分代码提上来,开始做项目,主要的难点就是与底层的对接。

这篇关于CAW的个人总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/559953

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern