探秘Weex工具链

在2017年1月12日 Weex Conf 2017上,来自阿里的卜道依据Weex开发中的痛点介绍了Weex的打包和插件机制,同样来自阿里的归影介绍了Weex的调试工具Devtools,共同揭秘了Weex的工具链。本文是卜道和归影关于Weex工具链实践的分享整理。

Weexpack与插件机制

Weex开发中的痛点

Weex提供了一个高效的引擎,但是开发者仅有这个SDK是不够的,我们还需要更完善的类库和强大的调试工具,遇到问题可以用工具来解决,复杂的场景需要用工具来消解其复杂度,把复杂问题简单化。

Weex工具链

Pack一键打包,适合纯前端的开发者建立Weex应用,不需要关心native的具体做法。Devtools主要解决Weex代码的调试问题。插件机制能够让开发者从Weex市场安装插件到本地的工程中, 以搭积木的方式开发app。IDE还在持续建设中。

Weex SDK支持的扩展方式

Module是一些非UI的特定功能,sendHttp、openURL等可以作为module来扩展。Component是一些UI控件,RichText、DatePicker等可以作为component来扩展。Adapter/Handler是SDK内置的一些适配器接口,没有指定具体的实现,可以根据自己APP的情况选择合适的实现来作为功能的扩展,例如图片加载器等。

插件机制

示意图最上方是市场,市场中会有开发者发布的很多的可复用的插件。中间是我们的应用,与OS进行通信的是SDK,基于SDK有一个APP Framework(应用容器,包括了一些页面控制逻辑,解析插件的配置文件),Plugin Framework插件容器是插件安装的target,插件既可以从市场下载安装,也可以从本地或者github安装。插件是上述SDK的三种扩展方式的封装,可以调动native的接口,具有和native通信的能力,极大地扩展了应用的能力,扩展了Weex应用的边界。

插件到插件容器的映射

左侧是插件结构的示意图,配置文件为Plugin.xml,里面配置了插件的组成和相应平台需要安装的资源、源码及依赖,安装到了Plugin Framework中后,映射为了右侧的相应文件,分别对应到android平台和IOS平台。

打包及插件相关命令

左图是打包命令,Weexpack create创建一个新工程,包括必要的目录和一些配置文件,Weexpack platform add/remove用来安装或者移除应用模版,它的参数是相应平台的应用模板, Weexpack plugin add/remove用来安装和移除插件,参数为插件名,它是打包流程的一个可选项。右图是插件开发者的一些命令,通过Weexpack plugin create创建插件,配置好相关命令,通过publish发布。

插件的安装使用

打包及插件机制应用示例

上图案例中的插件是一个复杂插件,我们设置了其对其它插件的依赖关系,Weex-gcanvas插件提供基础的绘图能力,Weex-chart基于其所依赖的Weex-gcanvas进一步提供图表的能力。具体的步骤如上图所示。

Weex-gcanvas安装怎么完成的?首先,插件在plugin.xml定义了其依赖关系以及需要暴露的接口;然后,我们的工具会根据plugin.xml的配置去维护几个文件——config.xml和build.gradle, 如果涉及权限或者其他资源相应的也会去修改AndroidManifest, 源码和资源会被复制到插件容器对应的目录中。

插件机制的优点

  • 按需打包,插件可以按需灵活配置打包,app完全自主;
  • 独立升级,插件可独立升级,支持细粒度的版本控制;
  • 支持二次开发,插件可以二进制库或者源码形式发布,方便二次开发;
  • 流程自动化,提供完善的命令行工具,自动合并代码、资源及编译脚本;
  • 面向定制,可按需定制自己的插件仓库和平台模板;
  • 集成一键打包,插件工具和打包工具彻底打通,降低开发app的门槛。

展望——插件化的Weex APP

如果插件市场已经有了很多插件,功能很丰富,前端的开发者只需要写最熟悉的业务逻辑就能生成应用;而native开发者也能参与开发发布Plugin和Framework中来。

调试工具Devtools

Weex的调试需求

作为前端的开发者,需要哪些功能?在逻辑方面,最重要的,我们需要断点调试js,最好能直接在we文件里打断点;在渲染方面,需要可以查看dom层级结构(前端)/native view层级结构(native端)的工具;在优化方面,能不能看到native的各种网络加载信息,如加载bundle的信息和时间,或者JS运行时的堆快照(heap snapshot)等等。

Weex Devtool主要功能

上图是Weex Devtool提供的主要功能。Debugger可以远程调试Weex源码,可呈现原始的we代码结构并打断点。Inspector展示渲染节点的层级结构,可随时切换dom tree和native view tree,可以高亮某一个节点。

远程调试

在解决问题之前需要抽象问题,一个客观事实是如果想在Chrome里面调试JS,那这个JS必须运行在Chrome的运行时里面。Weex现有的流程概括为用户写的业务代码运行在native的运行时(android是V8,IOS是JSCore)里面,由这些运行时和JS的worker负责与native渲染引擎的通信。那么,问题抽象为如果要实现远程的运行时——Chrome,并实现运行时和native渲染引擎的通信。运行时环境哪家强?显然是worker,基于worker的前端是浏览器解决多线程的一种技术手段。今天用到的是其灵活和隔离性,一个worker可以很方便的创建和销毁,而且它又有比较好的独立性,所以是一个比较好的运行时环境。通信方面,利用一种计算RPC的方式,制定自己的协议,并通过这个协议与native的渲染引擎进行通信。优化方面,Weex加载Bundle的方式是直接加载Bundle的运行源码,调试时没办法打断点,所以调试工具做了一个中间层,将Bundle包装成一个函数并将其放在一个JS文件里面,利用Chrome的运行时去加载这个文件。还原成源码中打断点,即提供一个Sourcemap。

Inspector原理

Inspector是模仿Chrome的Inspector制作的。Chrome的调试工具是一个Web APP,是纯前端技术写出来的APP。其数据是Chrome通过remote debug protocol协议发送给Devtool工具,这些数据一部分来自渲染引擎,另外一部分来自V8引擎。对于前端来说,无论是渲染引擎还是V8都在一个Chrome里面,但是对于Weex的场景并不是这样的。Weex的JS是运行在Chrome的运行时里面,渲染是在手机native端,调试这些调试信息需要通过Chrome的V8来获取,而且只能给到原生的Devtool。而我们的层级信息需要手机的native端给到,所以只能自己做了一个extension页面去承载和表现这部分的数据。

整体架构

分三层:最上层是Devtool的前端;中间是Node Server,主要负责RPC消息转发、维持session多实例管理的功能;最下层是Native Inspector。这些RPC是需要在native端安插内应的,即android和IOS的Native Inspector模块,它会截获本身Weex的SDK应该发给native runtime的所有信息,然后将这些信息转发给远程的Weex调试工具。

困境和展望

最大的困境是调试体验太分离,因为分为两个界面,并且一部分的功能需要extension提供。但是,Weex Devtool 1.0.0已经正在开发,逐步完善解决这些问题。

时间: 2024-08-17 18:34:19

探秘Weex工具链的相关文章

编译mini2440工具链

原文:http://www.adamjiang.com/pukiwiki/index.php?%E7%BC%96%E8%AF%91mini2440%E5%B7%A5%E5%85%B7%E9%93%BE          首先,从下面的地址下载工具链  http://www.codesourcery.com/.../arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2          等待下载完成后,将工具链解压到/usr/

构建gcc freestanding工具链出现问题

问题描述 构建gcc freestanding工具链出现问题 我使用如下命令进行安装 $../gcc-4.7.2/configure --prefix=$CROSS_GCC_TMP --target=$TARGET --with-sysroot=$SYSROOT --with-newlib --enable-languages=c --with-mpfr-include=/vita/build/gcc-4.7.2/mpfr/src --with-mpfr-lib=/vita/build/gcc-

Android中编译工具链的改动----LLVM份量的增加

作者:史宁宁 -----------------------------------------------------------------------------------转载请注明出处---------------------------------------------------------------------------------        最近,Android中的编译工具链发生了改动,这个改动是Android的runtime(也可以说是VM,这两种说法在Google

qtcreator-为什么ubuntu Qtcreator 工具链不能够设置,求大神们帮忙看看

问题描述 为什么ubuntu Qtcreator 工具链不能够设置,求大神们帮忙看看 解决方案 自己顶顶,这到底是怎么回事啊 解决方案二: gcc环境有没有装到系统目录.看上去找不到,所以灰掉了 解决方案三: gcc编译器路径安装不对 解决方案四: sudo apt-get install build-essential 解决方案五: 求大神们帮帮忙啊,小弟不胜感激

手把手教你安装交叉编译工具链(宿主机系统为ubuntu10.04)

Linux操作系统安装完成后,就可以在系统里安装交叉编译工具链了,这里我们选择的交叉编译工具的版本为arm-linux-gcc3.4.6.具体安装步骤如下: 1.下载交叉编译工具安装包. 2.将交叉编译工具解压到指定目录,这里解压到/usr/local/目录下,解压命令为: Sudo tar xjvf arm-linux-gcc.3.4.6.tar.bz2 –C /usr/local/ 3.设置编译工具的环境变量,具体命令为: Sudo gedit ~/.profile 在打开的文件中输入:ex

《树莓派实战秘籍》——第 2 章 为树莓派做Linux黑客 2.1 技巧21建立交叉编译器工具链

第 2 章 为树莓派做Linux黑客 虽然树莓派有很多可用的操作系统,但支持得最好的一个肯定是Linux,树莓派基金会通过维护一个Linux内核源代码树的方式保持了对树莓派的硬件支持. Linux以其灵活性和对大量设备的支持而著名.无论你是刚刚开始有兴趣学习Linux,或者准备对Linux动手改造以成为一个令人敬服的黑客,本章都将帮助你完成这一过程. 本文仅用于学习和交流目的,不代表异步社区观点.非商业转载请注明作译者.出处,并保留本文的原始链接. 2.1 技巧21建立交叉编译器工具链 树莓派适

重走LFS之路:(四) 工具链编译-1

重走LFS之路:(四) 工具链编译-1 经过了充分的准备工作之后,我们要来着手工具链的编译.LFS不能直接使用宿主系统的编译器和库进行编译,而是用宿主系统的编译器和库再编译出来一份编译器和库,然后二次编译编译器和库,最后才能用最终的编译器来编译构建LFS系统.所以我们现在需要做的是来编译这些工具. (题图来自: techradar.com) 这些工具的编译比较冗长,所以可能需要数篇的篇幅来记录这些过程. 首先需要创建一个目录来安置这些工具 mkdir -v $LFS/tools 然后为了方便,我

库-配置QT5.5.0源码包时总出现找不到工具链,各种情况尝试如下:请纠错!!!

问题描述 配置QT5.5.0源码包时总出现找不到工具链,各种情况尝试如下:请纠错!!! 前提: 自己用户的shell:修改了$HOME/.bashrc 中的export PATH=/usr/local/arm/arm-2009q3/bin:$PATH 系统环境变量:修改了/etc/profile 中的 export PATH=/usr/local/arm/arm-2009q3/bin:$PATH 全部用户的shell:修改了/etc/bash.bashrc中的 export PATH=/usr/

【DevOps&SRE活动实录】经验+案例,教你如何打造易用DevOps工具链!

6月10日,优维科技与数人云.中生代联合举办了DevOps&SRE超越传统运维之道(北京站).DevOps&SRE上海站将于7月15日举办,敬请期待! 任发科老师在此次活动中分享了<如何打造易用的DevOps工具链>,以下为演讲实录. 任发科 网名常新居士.曾任职于唯品会.会唐网.亚马逊和ThoughtWorks,是QCON,TOP100Summit,TiD优秀讲师,近年主要关注和从事DevOps工具链设计与实现,并长期从事和关注高效研发团队的组件和管理,译作有<DevO