摘要:借助語(yǔ)法樹(shù),開(kāi)發(fā)者能夠更好地展現(xiàn)和修改源程序代碼,優(yōu)化開(kāi)發(fā)環(huán)節(jié),提高安全系數(shù),還能進(jìn)一步實(shí)現(xiàn)安卓預(yù)編譯。用語(yǔ)法樹(shù)來(lái)實(shí)現(xiàn)預(yù)編譯指令開(kāi)發(fā)者還能用語(yǔ)法樹(shù)來(lái)實(shí)現(xiàn)預(yù)編譯指令,常見(jiàn)的預(yù)編譯指令主要分為條件編譯宏定義文件包含三大類(lèi)。
如何在保證安全性的前提下,提升開(kāi)發(fā)過(guò)程的效率,是每個(gè)開(kāi)發(fā)者都在不斷探索的問(wèn)題。借助語(yǔ)法樹(shù),開(kāi)發(fā)者能夠更好地展現(xiàn)和修改源程序代碼,優(yōu)化開(kāi)發(fā)環(huán)節(jié),提高安全系數(shù),還能進(jìn)一步實(shí)現(xiàn)安卓預(yù)編譯。
本文基于個(gè)推高級(jí)研發(fā)工程師李健民在該領(lǐng)域的實(shí)踐經(jīng)驗(yàn),與廣大開(kāi)發(fā)者們一同交流語(yǔ)法樹(shù)在開(kāi)發(fā)過(guò)程中的相關(guān)應(yīng)用和具體使用場(chǎng)景。
什么是語(yǔ)法樹(shù)語(yǔ)法樹(shù)是一種樹(shù)狀結(jié)構(gòu)的源程序代碼呈現(xiàn)方式,它可以很好地展示源程序代碼的信息,這其中就包含了:保存源程序的代碼信息和對(duì)應(yīng)運(yùn)行時(shí)的結(jié)構(gòu)。
如何生成一棵語(yǔ)法樹(shù)?在回答這個(gè)問(wèn)題前,我們需要先了解編譯器的工作流程,它主要分為詞法分析、語(yǔ)法分析、中間代碼和目標(biāo)代碼這四個(gè)過(guò)程,語(yǔ)法樹(shù)則是由語(yǔ)法分析一過(guò)程生成。
在詞法分析過(guò)程中,會(huì)產(chǎn)生一系列的token流,token是一個(gè)保存著type和value的數(shù)據(jù)結(jié)構(gòu)。詞法分析將源代碼的每一個(gè)關(guān)鍵詞都分割出來(lái),之后通過(guò)語(yǔ)法分析器進(jìn)行語(yǔ)法模板匹配,最后生成語(yǔ)法樹(shù)。
語(yǔ)法樹(shù)的應(yīng)用這一階段,開(kāi)發(fā)者可以對(duì)語(yǔ)法樹(shù)進(jìn)行修改,達(dá)到修改源代碼的效果,從而實(shí)現(xiàn)不同的應(yīng)用目的。
開(kāi)發(fā)者可以對(duì)語(yǔ)法樹(shù)的一些節(jié)點(diǎn)進(jìn)行修改或增加,來(lái)達(dá)到代碼自動(dòng)生成的目的。同理,開(kāi)發(fā)者也可以通過(guò)遍歷代碼塊插入部分埋點(diǎn)代碼,或者找到?jīng)]有用到的代碼進(jìn)行代碼縮減。
線(xiàn)上發(fā)版后,開(kāi)發(fā)者會(huì)遇到各式各樣的問(wèn)題,需要通過(guò)日志定義這些問(wèn)題。明文輸出的日志存在安全隱患,日志混淆插件可以對(duì)日志的輸出內(nèi)容進(jìn)行混淆,大大提高了這一過(guò)程中的安全系數(shù)?;谡Z(yǔ)法樹(shù)實(shí)現(xiàn)的個(gè)推日志混淆插件,通過(guò)遍歷指定簽名的方法調(diào)用,修改它參數(shù)的值進(jìn)行混淆。
用語(yǔ)法樹(shù)來(lái)實(shí)現(xiàn)預(yù)編譯指令開(kāi)發(fā)者還能用語(yǔ)法樹(shù)來(lái)實(shí)現(xiàn)預(yù)編譯指令,常見(jiàn)的預(yù)編譯指令主要分為條件編譯、宏定義、文件包含三大類(lèi)。過(guò)去,開(kāi)發(fā)者一般使用Antenna來(lái)實(shí)現(xiàn)預(yù)編譯指令,它是一個(gè)基于ant的工具,隨著ide的更新?lián)Q代,開(kāi)發(fā)者會(huì)發(fā)現(xiàn)ant中的一些缺陷。Antenna需要配置環(huán)境變量,配置文件比較繁瑣,且不支持gradle集成。
個(gè)推預(yù)編譯插件是一個(gè)基于語(yǔ)法樹(shù)的流程,它經(jīng)過(guò)詞法分析產(chǎn)生token流,再通過(guò)語(yǔ)法分析進(jìn)行模板匹配執(zhí)行相應(yīng)的預(yù)編譯指令。
基于Antenna進(jìn)行了改進(jìn)的個(gè)推預(yù)編譯插件,不僅支持集成到gradle,還簡(jiǎn)化了配置文件的流程。插件支持常見(jiàn)的預(yù)編譯指令,如條件編譯、宏定義、debug、mdebug等。
插件在Antenna上進(jìn)行了類(lèi)型擴(kuò)展,支持float、double類(lèi)型擴(kuò)展;在表達(dá)式操作進(jìn)行了擴(kuò)展,提供了字符串的startwith、endwith等操作。
開(kāi)發(fā)者經(jīng)常需要輸出一些調(diào)試信息,這些調(diào)試信息無(wú)法帶到線(xiàn)上,開(kāi)發(fā)者需要在發(fā)包時(shí)手動(dòng)刪除,并在再次調(diào)試時(shí)進(jìn)行添加,這個(gè)過(guò)程不僅效率低,而且容易出現(xiàn)漏刪的情況。
通過(guò)預(yù)編譯指令,開(kāi)發(fā)者可以在調(diào)試時(shí)加上預(yù)編譯指令debug,在發(fā)線(xiàn)上包時(shí),執(zhí)行預(yù)編譯指令,注釋掉不必要的信息。提高開(kāi)發(fā)效率的同時(shí),大大減少了因遺漏導(dǎo)致的安全隱患。
個(gè)推日志混淆插件和個(gè)推預(yù)編譯插件目前正處于代碼整理階段,未來(lái)這兩個(gè)項(xiàng)目都會(huì)提供開(kāi)源,幫助開(kāi)發(fā)者打造一個(gè)既安全又高效的開(kāi)發(fā)環(huán)境。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/72788.html
摘要:事件模型事件捕獲階段。事件到達(dá)目標(biāo)元素觸發(fā)目標(biāo)元素的監(jiān)聽(tīng)函數(shù)。的狀態(tài)值與狀態(tài)碼的狀態(tài)值未初始化還沒(méi)有調(diào)用方法。載入完成已經(jīng)執(zhí)行完成,已經(jīng)接收到全部的響應(yīng)內(nèi)容。 前言 總括: 包含這三個(gè)月來(lái)碰到的一些覺(jué)得比較好的面試題,三個(gè)月沒(méi)怎么寫(xiě)博客著實(shí)有些手癢,哈哈哈。7000余字,不成敬意2333 原文地址:我的前端進(jìn)階之路 知乎專(zhuān)欄&&簡(jiǎn)書(shū)專(zhuān)題:前端進(jìn)擊者(知乎)&&前端進(jìn)擊者(簡(jiǎn)書(shū)) 博主...
摘要:事件模型事件捕獲階段。事件到達(dá)目標(biāo)元素觸發(fā)目標(biāo)元素的監(jiān)聽(tīng)函數(shù)。的狀態(tài)值與狀態(tài)碼的狀態(tài)值未初始化還沒(méi)有調(diào)用方法。載入完成已經(jīng)執(zhí)行完成,已經(jīng)接收到全部的響應(yīng)內(nèi)容。 前言 總括: 包含這三個(gè)月來(lái)碰到的一些覺(jué)得比較好的面試題,三個(gè)月沒(méi)怎么寫(xiě)博客著實(shí)有些手癢,哈哈哈。7000余字,不成敬意2333 原文地址:我的前端進(jìn)階之路 知乎專(zhuān)欄&&簡(jiǎn)書(shū)專(zhuān)題:前端進(jìn)擊者(知乎)&&前端進(jìn)擊者(簡(jiǎn)書(shū)) 博主...
摘要:程序預(yù)處理本章節(jié)研究的是,源代碼文件是如何一步步得到一個(gè)可執(zhí)行程序的。如的語(yǔ)句被稱(chēng)為預(yù)處理指令,還有注釋文本的刪除,都在此階段完成替換。目的是能夠?qū)⑺形募械拇a組合到一起成一個(gè)完整的程序。終止程序可以正常也可以意外終止程序。 ...
閱讀 1970·2021-11-17 09:33
閱讀 6617·2021-10-12 10:20
閱讀 2417·2021-09-22 15:50
閱讀 1939·2021-09-22 15:10
閱讀 850·2021-09-10 10:51
閱讀 791·2021-09-10 10:50
閱讀 3201·2021-08-11 11:19
閱讀 1873·2019-08-30 15:55