如何在保证安全性的前提下,提高开发过程的效率,是每一个开发者都在不断探索的问题。借助语法树,开发者可以更好地展示和修改源程序代码,优化开发环节,提升安全系数,还能进一步实现安卓预编译。安全
本文基于个推高级研发工程师李健民在该领域的实践经验,与广大开发者们一同交流语法树在开发过程当中的相关应用和具体使用场景。数据结构
语法树是一种树状结构的源程序代码呈现方式,它能够很好地展现源程序代码的信息,这其中就包含了:保存源程序的代码信息和对应运行时的结构。ide
如何生成一棵语法树?在回答这个问题前,咱们须要先了解编译器的工做流程,它主要分为词法分析、语法分析、中间代码和目标代码这四个过程,语法树则是由语法分析一过程生成。工具
在词法分析过程当中,会产生一系列的token流,token是一个保存着type和value的数据结构。词法分析将源代码的每个关键词都分割出来,以后经过语法分析器进行语法模板匹配,最后生成语法树。gradle
这一阶段,开发者能够对语法树进行修改,达到修改源代码的效果,从而实现不一样的应用目的。
优化
开发者能够对语法树的一些节点进行修改或增长,来达到代码自动生成的目的。同理,开发者也能够经过遍历代码块插入部分埋点代码,或者找到没有用到的代码进行代码缩减。插件
线上发版后,开发者会遇到各式各样的问题,须要经过日志定义这些问题。明文输出的日志存在安全隐患,日志混淆插件能够对日志的输出内容进行混淆,大大提升了这一过程当中的安全系数。基于语法树实现的个推日志混淆插件,经过遍历指定签名的方法调用,修改它参数的值进行混淆。debug
开发者还能用语法树来实现预编译指令,常见的预编译指令主要分为条件编译、宏定义、文件包含三大类。过去,开发者通常使用Antenna来实现预编译指令,它是一个基于ant的工具,随着ide的更新换代,开发者会发现ant中的一些缺陷。Antenna须要配置环境变量,配置文件比较繁琐,且不支持gradle集成。3d
个推预编译插件是一个基于语法树的流程,它通过词法分析产生token流,再经过语法分析进行模板匹配执行相应的预编译指令。调试
基于Antenna进行了改进的个推预编译插件,不只支持集成到gradle,还简化了配置文件的流程。插件支持常见的预编译指令,如条件编译、宏定义、debug、mdebug等。
插件在Antenna上进行了类型扩展,支持float、double类型扩展;在表达式操做进行了扩展,提供了字符串的startwith、endwith等操做。
开发者常常须要输出一些调试信息,这些调试信息没法带到线上,开发者须要在发包时手动删除,并在再次调试时进行添加,这个过程不只效率低,并且容易出现漏删的状况。
经过预编译指令,开发者能够在调试时加上预编译指令debug,在发线上包时,执行预编译指令,注释掉没必要要的信息。提升开发效率的同时,大大减小了因遗漏致使的安全隐患。
个推日志混淆插件和个推预编译插件目前正处于代码整理阶段,将来这两个项目都会提供开源,帮助开发者打造一个既安全又高效的开发环境。