资讯专栏INFORMATION COLUMN

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

CloudDeveloper / 563人阅读

摘要:借助语法树,开发者能够更好地展现和修改源程序代码,优化开发环节,提高安全系数,还能进一步实现安卓预编译。用语法树来实现预编译指令开发者还能用语法树来实现预编译指令,常见的预编译指令主要分为条件编译宏定义文件包含三大类。

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

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

什么是语法树

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

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

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

语法树的应用

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

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

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

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

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

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

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

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

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

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14685.html

相关文章

  • 发者进阶之路语法树来实现编译

    摘要:借助语法树,开发者能够更好地展现和修改源程序代码,优化开发环节,提高安全系数,还能进一步实现安卓预编译。用语法树来实现预编译指令开发者还能用语法树来实现预编译指令,常见的预编译指令主要分为条件编译宏定义文件包含三大类。 如何在保证安全性的前提下,提升开发过程的效率,是每个开发者都在不断探索的问题。借助语法树,开发者能够更好地展现和修改源程序代码,优化开发环节,提高安全系数,还能进一步实...

    CoffeX 评论0 收藏0
  • 前端进阶之路

    摘要:事件模型事件捕获阶段。事件到达目标元素触发目标元素的监听函数。的状态值与状态码的状态值未初始化还没有调用方法。载入完成已经执行完成,已经接收到全部的响应内容。 前言 总括: 包含这三个月来碰到的一些觉得比较好的面试题,三个月没怎么写博客着实有些手痒,哈哈哈。7000余字,不成敬意2333 原文地址:我的前端进阶之路 知乎专栏&&简书专题:前端进击者(知乎)&&前端进击者(简书) 博主...

    cloud 评论0 收藏0
  • 前端进阶之路

    摘要:事件模型事件捕获阶段。事件到达目标元素触发目标元素的监听函数。的状态值与状态码的状态值未初始化还没有调用方法。载入完成已经执行完成,已经接收到全部的响应内容。 前言 总括: 包含这三个月来碰到的一些觉得比较好的面试题,三个月没怎么写博客着实有些手痒,哈哈哈。7000余字,不成敬意2333 原文地址:我的前端进阶之路 知乎专栏&&简书专题:前端进击者(知乎)&&前端进击者(简书) 博主...

    raledong 评论0 收藏0
  • 前端进阶之路

    摘要:事件模型事件捕获阶段。事件到达目标元素触发目标元素的监听函数。的状态值与状态码的状态值未初始化还没有调用方法。载入完成已经执行完成,已经接收到全部的响应内容。 前言 总括: 包含这三个月来碰到的一些觉得比较好的面试题,三个月没怎么写博客着实有些手痒,哈哈哈。7000余字,不成敬意2333 原文地址:我的前端进阶之路 知乎专栏&&简书专题:前端进击者(知乎)&&前端进击者(简书) 博主...

    zorpan 评论0 收藏0
  • C语言进阶:程序处理

    摘要:程序预处理本章节研究的是,源代码文件是如何一步步得到一个可执行程序的。如的语句被称为预处理指令,还有注释文本的删除,都在此阶段完成替换。目的是能够将所有文件中的代码组合到一起成一个完整的程序。终止程序可以正常也可以意外终止程序。 ...

    gxyz 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<