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

相关文章

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

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