天貓客戶端組件動態化方案——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.pswp.cn/news/391374.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391374.shtml
英文地址,請注明出處:http://en.pswp.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;我描述了生存分析的潛在用例…