版本:0.18.0
自己对于Weex源码学习的一些记录,帮助理解,如有错误请指出,部分图片以及描述来源于官方的源码解析文章,文末会附上链接。
一、简单概述
因为整个Weex SDK的内容很多,想要分析也不可能一行代码一行代码的写,所以我个人倾向于先从简单的模块来进行分析,等各个模块的功能都基本清晰了再从流程上进行分析。在分析模块的过程中会穿插一些小的流程,即使不懂是做什么的也不影响其整体性。
首先我们应该知道的是Weex的主要工作,其实就是完成了前端代码 —> Native View的转换过程,这个是使用者都知道的基本概念,具体来说,调用过Api都知道,最常见的过程就是render(渲染),这也是后面最主要想搞清楚的过程。
但是这个过程,牵扯的模块和功能太多,一次分析没法完全看透,所以我个人从模块开始,先理清楚各个模块的作用和其主要内容,才能在过程中更加清晰。
1、按照官方的分析,其主要模块有三个:Bridge、Dom和Render,分别有三个Manager进行控制和流程管理,WXBridgeManager、WXRenderManager、WXDomManager,都可以在WXSDKManager中获取,分别简单介绍一下:
- Bridge:负责JS和Java的通信,相互调用,比如常见使用创建一个模块来扩展Android端功能,在JS代码中使用,就是这个模块负责的;
- Dom:主要负责创建Dom树,以及Dom的各类操作
- Render:主要负责创建Native View树,以及Native View的各类操作
2、Weex线程模型
Android主线程就是UI线程,负责UI的所有操作,使用的是单线程模型(主要避免了锁操作),在Weex中,Render模块就是运行在UI线程中的,这个可以通过代码中看到:
//WXRenderHandler代码
public WXRenderHandler() {
super(Looper.getMainLooper());
}
而剩下的Dom、Bridge模块,采用了相似的模型,使用HandlerThread来维持一个自有线程,这个在后面会有分析和代码,所有操作都在此线程中,所以协同工作的线程在Weex中有三条&#