开发者的进阶之路:用语法树来实现预编译

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发者的进阶之路:用语法树来实现预编译相关的知识,希望对你有一定的参考价值。

如何在保证安全性的前提下,提升开发过程的效率,是每个开发者都在不断探索的问题。借助语法树,开发者能够更好地展现和修改源程序代码,优化开发环节,提高安全系数,还能进一步实现安卓预编译。

本文基于个推高级研发工程师李健民在该领域的实践经验,与广大开发者们一同交流语法树在开发过程中的相关应用和具体使用场景。


什么是语法树

语法树是一种树状结构的源程序代码呈现方式,它可以很好地展示源程序代码的信息,这其中就包含了:保存源程序的代码信息和对应运行时的结构

技术分享图片

如何生成一棵语法树?在回答这个问题前,我们需要先了解编译器的工作流程,它主要分为词法分析、语法分析、中间代码和目标代码这四个过程,语法树则是由语法分析一过程生成

技术分享图片

在词法分析过程中,会产生一系列的token流,token是一个保存着type和value的数据结构。词法分析将源代码的每一个关键词都分割出来,之后通过语法分析器进行语法模板匹配,最后生成语法树。

技术分享图片


语法树的应用

这一阶段,开发者可以对语法树进行修改,达到修改源代码的效果,从而实现不同的应用目的。

开发者可以对语法树的一些节点进行修改或增加,来达到代码自动生成的目的。同理,开发者也可以通过遍历代码块插入部分埋点代码,或者找到没有用到的代码进行代码缩减。

技术分享图片

线上发版后,开发者会遇到各式各样的问题,需要通过日志定义这些问题。明文输出的日志存在安全隐患,日志混淆插件可以对日志的输出内容进行混淆,大大提高了这一过程中的安全系数。基于语法树实现的个推日志混淆插件,通过遍历指定签名的方法调用,修改它参数的值进行混淆。

技术分享图片


用语法树来实现预编译指令

开发者还能用语法树来实现预编译指令,常见的预编译指令主要分为条件编译、宏定义、文件包含三大类。过去,开发者一般使用Antenna来实现预编译指令,它是一个基于ant的工具,随着ide的更新换代,开发者会发现ant中的一些缺陷。Antenna需要配置环境变量,配置文件比较繁琐,且不支持gradle集成。

技术分享图片

个推预编译插件是一个基于语法树的流程,它经过词法分析产生token流,再通过语法分析进行模板匹配执行相应的预编译指令。
技术分享图片

基于Antenna进行了改进的个推预编译插件,不仅支持集成到gradle,还简化了配置文件的流程。插件支持常见的预编译指令,如条件编译、宏定义、debug、mdebug等

技术分享图片

插件在Antenna上进行了类型扩展,支持float、double类型扩展;在表达式操作进行了扩展,提供了字符串的startwith、endwith等操作。
技术分享图片


预编译指令在安卓中的使用场景

开发者经常需要输出一些调试信息,这些调试信息无法带到线上,开发者需要在发包时手动删除,并在再次调试时进行添加,这个过程不仅效率低,而且容易出现漏删的情况。

通过预编译指令,开发者可以在调试时加上预编译指令debug,在发线上包时,执行预编译指令,注释掉不必要的信息。提高开发效率的同时,大大减少了因遗漏导致的安全隐患。

技术分享图片

技术分享图片

个推日志混淆插件和个推预编译插件目前正处于代码整理阶段,未来这两个项目都会提供开源,帮助开发者打造一个既安全又高效的开发环境。

以上是关于开发者的进阶之路:用语法树来实现预编译的主要内容,如果未能解决你的问题,请参考以下文章

Python之路,Day8 - 面向对象编程进阶

PyTorch进阶之路:使用logistic回归实现图像分类

Python之路-python(面向对象进阶)

PyTorch进阶之路:张量与梯度

APICloud开发者进阶之路 |iOS修改entitlements文件

Python之路,Day7 - 面向对象编程进阶