天猫客户端组件动态化方案——VirtualView 工具大更新

前文《天猫客户端组件动态化的方案——VirtualView 上手体验》都提到了自定义模板编译成二进制数据的过程,在 Android 版的 Playground 里内置了一个编译工具可以实时调测,然而业务开发过程中,不可能在手机上编译,而是在电脑或者后台去编译模板。因此这里提供了一个独立的工具来编译模板,这里介绍下它的使用方法。

相关开源库

Android

  • Tangram-Android
  • Virtualview-Android

iOS

  • Tangram-iOS
  • Virtualview-iOS

前世今生

工具的源码也提交在 github 上。在一开始的设计里,编译模块是针对控件来设计的,每一个控件如 NTextNImageVHLayout 等都有自己的编译类,编译类的继承结构体系与控件本身的继承结构体系一样。它们各自会解析对应控件的属性及控件本身的类型,将其转换成整型值或索引序列化到最终输出文件里;这就带来了一个问题,当需要扩展控件属性,或者添加自定义控件的时候,需要编写一个新的编译类注册到编译工具里,这对开发者来说十分不友好,且不说还得搭建编译工具工程的本身的运行环境,还得熟悉编译器类的编写逻辑才行。从下图的原始设计图就可以看出其复杂性。

为了解决这一弊端,对原始设计进行了重构,重构的核心目标就是不依赖源码就能进行模板编译,思路是通过配置化的方式声明描述控件类型、属性类型、解析方式等,方案实施上是将原先针对控件编写编译类的模式改成针对属性来编译写编译类,只需要一个通用的属性编译类即可,具体行为都通过配置文件来描述。将重构后的工具模板导出可执行文件,就可以在项目中直接使用了。废话了这么多,接下来就是本文的重点了。

使用说明

独立运行模式

文件介绍

下载源码之后,可执行工具存放在目录 TemplateWorkSpace 里,包含以下几个文件/目录(或运行后产生):

文件作用
config.properties配置组件 ID、xml 属性对应的 value 类型
templatelist.properties编译的模板文件列表
build二进制文件的输出目录
templatexml 的存放路径
compiler.jarjava 代码编译后 jar 文件,执行 xml 的编译逻辑
buildTemplate.sh编译执行文件
如何运行
  • 打开命令行 执行 sh buildTemplate.sh
  • 模板编译后的文件会输出到 build 路径下
配置 config.properties
  • VIEW_ID_XXXX
    • 配置 xml 节点 id
    • 如配置 VIEW_ID_FrameLayout=1,则 xml 节点中的 <FrameLayout> 在编译后会用数值1代替
    • 节点配置以 VIEW_ID_ 开头
  • property=ValueType
    • 配置属性值的类型,配置对所有模板生效,不支持在 1.xml 和 2.xml 中对相同的属性用不同的 ValueType 解析
    • 目前已经支持
      • 常规类型:String(默认,不需要配置)、FloatColorExprNumberIntBool
      • 特殊类型 FlagTypeAlignLayoutWidthHeightTextStyleDataModeVisibility
      • 枚举类型 Enum<name:value,……>
        • 枚举说明:
          • 如配置 flexDirection=Enum<row:0,row-reverse:1,column:2,column-reverse:3>
          • 在解析属性是配置 row 直接转化成 int:0row-reverse 转成 int:1
  • DEFAULT_PROPERTY_XXXX
    • 为了兼容就模板的编译,写的强制在二进制中写入一些属性类型定义,可以忽略
配置 templatelist.properties
  • 格式 xmlFileName=outFileName,Version[,platform]
    • xmlFileName 标识 template 目录下需要编译的 xml 文件名建议不带 .xml 后缀,目前做了兼容
    • outFileName 输出到 build 目录下的 .out 文件名
    • Version 表示 xml 编译后的版本号
    • platform 同时兼容 iOS 和 android 时不写,可填的值为 androidiphone
xml 文件模板编写
  • 和以前的方式一样,不需要额外写 Java 代码,只需要对新增的属性在config.properties 中配置 ValueType

接口模式

除了直接使用命令行执行工具,还可以基于此搭建完整成熟的模板工具,它可以是个客户端,也可以是个后端服务,或者是个插件,所以需要提供接口模式供宿主程序调用。

//初始化构建对象
ViewCompilerApi viewCompiler = new ViewCompilerApi();
//设置配置文件加载器
viewCompiler.setConfigLoader(new LocalConfigLoader());
//读取模板数据
FileInputStream fis = new FileInputStream(rootDir);
//调用接口,传入必备参数,此时不区分平台,如果要区分平台,使用方单独编译即可
byte[] result = viewCompiler.compile(fis, "icon", 13);
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tableau可视化_如何在Tableau中构建自定义地图可视化

tableau可视化Sometime last year, I got fascinated with bubble charts when I saw a data visualization video, Hans Roslings 200 Countries, 200 Years, 4 Minutes - The Joy of Stats from BBC.去年的某个时候&#xff0c;当我看到一个数据可视化视频时&#xff0c;我迷…

数据分析和大数据哪个更吃香_处理数据,大数据甚至更大数据的17种策略

数据分析和大数据哪个更吃香Dealing with big data can be tricky. No one likes out of memory errors. ☹️ No one likes waiting for code to run. ⏳ No one likes leaving Python. &#x1f40d;处理大数据可能很棘手。 没有人喜欢内存不足错误。 No️没有人喜欢等待代码…

MySQL 数据还原

1.1还原使用mysqldump命令备份的数据库的语法如下&#xff1a; mysql -u root -p [dbname] < backup.sq 示例&#xff1a; mysql -u root -p < C:\backup.sql 1.2还原直接复制目录的备份 通过这种方式还原时&#xff0c;必须保证两个MySQL数据库的版本号是相同的。MyISAM…

test6

test6 转载于:https://www.cnblogs.com/Forever77/p/11474320.html

VueJs学习入门指引

新产品开发决定要用到vuejs&#xff0c;总结一个vuejs学习指引。 1.安装一个Node环境 去Nodejs官网下载windows版本node 下载地址&#xff1a; https://nodejs.org/zh-cn/ 2.使用node的npm工具搭建一个Vue项目&#xff0c;这里混合进入了ElementUI 搭建指引地址: https:…

粒子网格算法 pm_使粒子网格与Blynk一起使用的2种最佳方法

粒子网格算法 pmThis post is originally from my blog on www.jaredwolff.com.这篇文章最初来自我在www.jaredwolff.com上的博客。 Writing an app takes time. It takes even more time to write one that works with hardware.编写应用程序需要时间。 编写与硬件兼容的代码…

python:对list去重

1、set()方法 numbers [1,7,3,2,5,6,2,3,4,1,5] new_numbers list(set(numbers)) print new_numbers 输出 [1, 2, 3, 4, 5, 6, 7] 特点&#xff1a;不保证原有顺序 2、原始方法 numbers [1,7,3,2,5,6,2,3,4,1,5] new_numbers [] for x in numbers:if x not in new_numbers:…

运维工程师如果将web服务http专变为https

1&#xff1a;生成私钥 2&#xff1a;生成证书签署请求 3&#xff1a;在提供CA签署的web网站上&#xff0c;提交生成的证书签署请求 4&#xff1a;下载已经签署的CA证书 5&#xff1a;将证书的信息保留在web服务器中&#xff0c;且应用到提供web服务的软件即可转载于:https://w…

leetcode 363. 矩形区域不超过 K 的最大数值和

给你一个 m x n 的矩阵 matrix 和一个整数 k &#xff0c;找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。 题目数据保证总会存在一个数值和不超过 k 的矩形区域。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,0,1],[0,-2,3]], k 2 输出&#xff1a;2 解释&…

centos7.4二进制安装mysql

1&#xff1a;下载二进制安装包&#xff08;安装时确保没有mysql数据库服务器端&#xff09;&#xff1a; mariadb-10.2.12-linux-x86_64.tar.gz、 mariadb-10.2.12.tar.gz。2&#xff1a;创建系统账号指定shell类型&#xff08;默认自动创建同名的组&#xff09;3&#xff1a;…

批梯度下降 随机梯度下降_梯度下降及其变体快速指南

批梯度下降 随机梯度下降In this article, I am going to discuss the Gradient Descent algorithm. The next article will be in continuation of this article where I will discuss optimizers in neural networks. For understanding those optimizers it’s important to…

java作业 2.6

//程序猿&#xff1a;孔宏旭 2017.X.XX /**功能&#xff1a;在键盘输入一个三位数&#xff0c;求它们的各数位之和。 *1、使用Scanner关键字来实现从键盘输入的方法。 *2、使用取余的方法将各个数位提取出来。 *3、最后将得到的各个数位相加。 */ import java.util.Scanner; p…

ubuntu 16.04 挂载新硬盘

2、挂载数据盘 mkdir /datausrubuntu:~$ lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 465.8G 0 disk sda1 8:1 0 512M 0 part /boot/efisda2 8:2 0 464.3G 0 part /sda3 8:3 0 976…

Go语言实战 : API服务器 (2) 运行流程

1.API服务器的总流程 分为两步&#xff1a; 启动API服务器API服务器对HTTP请求进行处理 2.API服务器启动流程 解析配置文件&#xff0c;利用配置文件完成对服务器的初始化配置初始化logger&#xff0c;开启日志记录与数据库建立连接设置http连接&#xff08;例如设置响应头…

Linux 命令 之查看程序占用内存

2019独角兽企业重金招聘Python工程师标准>>> 查看PID ps aux | grep nginx root 3531 0.0 0.0 18404 832 ? Ss 15:29 0:00 nginx: master process ./nginx 查看占用资源情况 pmap -d 3531 top -p 3531 转载于:https://my.oschina.net/mengzha…

逻辑回归 自由度_回归自由度的官方定义

逻辑回归 自由度Back in middle and high school you likely learned to calculate the mean and standard deviation of a dataset. And your teacher probably told you that there are two kinds of standard deviation: population and sample. The formulas for the two a…

动画电影的幕后英雄怎么说好_幕后编码面试-好与坏

动画电影的幕后英雄怎么说好Interviewing is a skill in and of itself. You can be the best developer in the world but you may still screw up an interview.面试本身就是一种技能。 您可以成为世界上最好的开发人员&#xff0c;但您仍可能会搞砸面试。 How many times h…

数据库之DML

1、表的有关操作&#xff1a; 1.1、表的创建格式&#xff1a; CREATE TABLE IF NOT EXISTS 表名(属性1 类型&#xff0c;属性2 类型&#xff0c;....&#xff0c;属性n 类型&#xff09;&#xff1b;# 标记部分表示可以省略 1.2、表的修改格式&#xff1a;ALTER table 表名 ADD…

网络对抗技术作业一 201421410031

姓名&#xff1a;李冠华 学号&#xff1a;201421410031 指导教师&#xff1a;高见 1、虚拟机安装与调试 安装windows和linux&#xff08;kali&#xff09;两个虚拟机&#xff0c;均采用NAT网络模式&#xff0c;查看主机与两个虚拟机器的IP地址&#xff0c;并确保其连通性。同时…

生存分析简介:Kaplan-Meier估计器

In my previous article, I described the potential use-cases of survival analysis and introduced all the building blocks required to understand the techniques used for analyzing the time-to-event data.在我的上一篇文章中 &#xff0c;我描述了生存分析的潜在用例…