前文《天貓客戶端組件動態化的方案——VirtualView 上手體驗》都提到了自定義模板編譯成二進制數據的過程,在 Android 版的 Playground 裏內置了一個編譯工具能夠實時調測,然而業務開發過程當中,不可能在手機上編譯,而是在電腦或者後臺去編譯模板。所以這裏提供了一個獨立的工具來編譯模板,這裏介紹下它的使用方法。html
工具的源碼也提交在 github 上。在一開始的設計裏,編譯模塊是針對控件來設計的,每個控件如 NText
、NImage
、VHLayout
等都有本身的編譯類,編譯類的繼承結構體系與控件自己的繼承結構體系同樣。它們各自會解析對應控件的屬性及控件自己的類型,將其轉換成整型值或索引序列化到最終輸出文件裏;這就帶來了一個問題,當須要擴展控件屬性,或者添加自定義控件的時候,須要編寫一個新的編譯類註冊到編譯工具裏,這對開發者來講十分不友好,且不說還得搭建編譯工具工程的自己的運行環境,還得熟悉編譯器類的編寫邏輯才行。從下圖的原始設計圖就能夠看出其複雜性。java
爲了解決這一弊端,對原始設計進行了重構,重構的核心目標就是不依賴源碼就能進行模板編譯,思路是經過配置化的方式聲明描述控件類型、屬性類型、解析方式等,方案實施上是將原先針對控件編寫編譯類的模式改爲針對屬性來編譯寫編譯類,只須要一個通用的屬性編譯類便可,具體行爲都經過配置文件來描述。將重構後的工具模板導出可執行文件,就能夠在項目中直接使用了。廢話了這麼多,接下來就是本文的重點了。android
下載源碼以後,可執行工具存放在目錄 TemplateWorkSpace 裏,包含如下幾個文件/目錄(或運行後產生):git
文件 | 做用 |
---|---|
config.properties | 配置組件 ID、xml 屬性對應的 value 類型 |
templatelist.properties | 編譯的模板文件列表 |
build | 二進制文件的輸出目錄 |
template | xml 的存放路徑 |
compiler.jar | java 代碼編譯後 jar 文件,執行 xml 的編譯邏輯 |
buildTemplate.sh | 編譯執行文件 |
sh buildTemplate.sh
VIEW_ID_XXXX
VIEW_ID_FrameLayout=1
,則 xml 節點中的 <FrameLayout>
在編譯後會用數值1代替VIEW_ID_
開頭property=ValueType
String
(默認,不須要配置)、Float
、Color
、Expr
、Number
、Int
、Bool
Flag
、Type
、Align
、LayoutWidthHeight
、TextStyle
、DataMode
、Visibility
Enum<name:value,……>
flexDirection=Enum<row:0,row-reverse:1,column:2,column-reverse:3>
row
直接轉化成 int:0
,row-reverse
轉成 int:1
DEFAULT_PROPERTY_XXXX
xmlFileName=outFileName,Version[,platform]
xmlFileName
標識 template 目錄下須要編譯的 xml 文件名建議不帶 .xml
後綴,目前作了兼容outFileName
輸出到 build 目錄下的 .out
文件名Version
表示 xml 編譯後的版本號platform
同時兼容 iOS 和 android 時不寫,可填的值爲 android
和iphone
除了直接使用命令行執行工具,還能夠基於此搭建完整成熟的模板工具,它能夠是個客戶端,也能夠是個後端服務,或者是個插件,因此須要提供接口模式供宿主程序調用。github
//初始化構建對象
ViewCompilerApi viewCompiler = new ViewCompilerApi();
//設置配置文件加載器
viewCompiler.setConfigLoader(new LocalConfigLoader());
//讀取模板數據
FileInputStream fis = new FileInputStream(rootDir);
//調用接口,傳入必備參數,此時不區分平臺,若是要區分平臺,使用方單獨編譯便可
byte[] result = viewCompiler.compile(fis, "icon", 13);
複製代碼