開發者的進階之路:用語法樹來實現預編譯

如何在保證安全性的前提下,提高開發過程的效率,是每一個開發者都在不斷探索的問題。藉助語法樹,開發者可以更好地展示和修改源程序代碼,優化開發環節,提升安全係數,還能進一步實現安卓預編譯。安全

本文基於個推高級研發工程師李健民在該領域的實踐經驗,與廣大開發者們一同交流語法樹在開發過程當中的相關應用和具體使用場景。數據結構

 

什麼是語法樹

語法樹是一種樹狀結構的源程序代碼呈現方式,它能夠很好地展現源程序代碼的信息,這其中就包含了:保存源程序的代碼信息和對應運行時的結構。ide

如何生成一棵語法樹?在回答這個問題前,咱們須要先了解編譯器的工做流程,它主要分爲詞法分析、語法分析、中間代碼和目標代碼這四個過程,語法樹則是由語法分析一過程生成。工具

在詞法分析過程當中,會產生一系列的token流,token是一個保存着type和value的數據結構。詞法分析將源代碼的每個關鍵詞都分割出來,以後經過語法分析器進行語法模板匹配,最後生成語法樹。gradle

語法樹的應用

這一階段,開發者能夠對語法樹進行修改,達到修改源代碼的效果,從而實現不一樣的應用目的。優化

開發者能夠對語法樹的一些節點進行修改或增長,來達到代碼自動生成的目的。同理,開發者也能夠經過遍歷代碼塊插入部分埋點代碼,或者找到沒有用到的代碼進行代碼縮減。spa

 

線上發版後,開發者會遇到各式各樣的問題,須要經過日誌定義這些問題。明文輸出的日誌存在安全隱患,日誌混淆插件能夠對日誌的輸出內容進行混淆,大大提升了這一過程當中的安全係數。基於語法樹實現的個推日誌混淆插件,經過遍歷指定簽名的方法調用,修改它參數的值進行混淆。插件

 

用語法樹來實現預編譯指令

開發者還能用語法樹來實現預編譯指令,常見的預編譯指令主要分爲條件編譯、宏定義、文件包含三大類。過去,開發者通常使用Antenna來實現預編譯指令,它是一個基於ant的工具,隨着ide的更新換代,開發者會發現ant中的一些缺陷。Antenna須要配置環境變量,配置文件比較繁瑣,且不支持gradle集成。debug

個推預編譯插件是一個基於語法樹的流程,它通過詞法分析產生token流,再經過語法分析進行模板匹配執行相應的預編譯指令。調試

基於Antenna進行了改進的個推預編譯插件,不只支持集成到gradle,還簡化了配置文件的流程。插件支持常見的預編譯指令,如條件編譯、宏定義、debug、mdebug等。

 

插件在Antenna上進行了類型擴展,支持float、double類型擴展;在表達式操做進行了擴展,提供了字符串的startwith、endwith等操做。

 

預編譯指令在安卓中的使用場景

開發者常常須要輸出一些調試信息,這些調試信息沒法帶到線上,開發者須要在發包時手動刪除,並在再次調試時進行添加,這個過程不只效率低,並且容易出現漏刪的狀況。

經過預編譯指令,開發者能夠在調試時加上預編譯指令debug,在發線上包時,執行預編譯指令,註釋掉沒必要要的信息。提升開發效率的同時,大大減小了因遺漏致使的安全隱患。

 

個推日誌混淆插件個推預編譯插件目前正處於代碼整理階段,將來這兩個項目都會提供開源,幫助開發者打造一個既安全又高效的開發環境。

相關文章
相關標籤/搜索