android 埋点工具,Android 全埋点解决方案之AST

27279c91b53775cfa6971a456b9fd07d.png

APT

APT 是 Annotation Processing Tool 的缩写,即注解处理器,是一种处理注解的工具。确切的说它是 javac 的一个工具, 它用来在编译时扫描和处理注解。注解处理器以 Java 代码(或者编译过的字节码)作为输入,生成 .java 文件作为输出。 简单来说就是在编译期,通过注解生成 .java 文件。权限控制、代码调试等。

Element

自定义注解处理器,需要继承 AbstractProcessor 类,而 AbstractProcessor 最终要的就是 process 方法。process 方法 处理的核心是 Element 对象。

Element 的源码源码如下:

12fef8c928748959e69582222f5c3c8e.png

08d18a822d7ef1e934280fdc3a5fa85e.png

从定义可以看出,Element 是一个接口,它定义了外部可以调用的方法。

74b2d486666a4b679ee9a144c3a26a7b.png

Element 有 5 个直接子类,它们分别代表一种特定类型的元素。五个子类各有各的用处并且有各种独有的方法,在使用的 时候可以强制将 Element 对象转换成其中的任何一种,但是必须满足转换的条件,不然会抛出异常。

910cd69b2146a9954ec61a71528a11a0.png

其中 TypeElement 和 VariableElement 是最核心的两个 Element,也是我们下文会使用到的。

ATP 实例

我们通过 APT 来实现一个功能,功能类似于 ButterKnife 中的 @BindView 注解。即:通过对 View 变量的注解,实现 View 的绑定(无需调用 findViewById)。

完整的项目源码后续会 release 给大家。

AST

AST,是 Abstract Syntax Tree 的缩写,即“抽象语法树”,是编辑器对代码的第一步加工之后的结果,是一个树形式表示 的源代码。源代码的每个元素映射到一个节点或子树。

Java 的编译过程可以分成三个阶段:

第一阶段:

所有的源文件会被解析成语法树;

第二阶段:

调用注解处理器,即 APT。如果注解处理器产生了新的源文件,新的源文件也要参与编译;

第三阶段:

语法树会被分析并转化成类文件。

7ba2af3961ea8033830b8ed98d77dc2a.png

原理概述

编辑器对代码处理的流程大概是:

JavaTXT-> 词语法分析 -> 生成 AST -> 语义分析 -> 编译字节码

通过操作 AST,可以达到修改源代码的功能。

可 以 在 注 解 处 理 器 的 process 函 数 里,通 过 roundEnvironment.getRootEle- ments() 方法可以拿到所有的 Element 对象,通过 trees.getTree(element) 方 法可以拿到对应的抽象语法树(AST),然后我们自定义一个 TreeTranslator, 在 visitMethodDef 里即可对方法进行判断。如果是目标处理方法,则通过 AST 的相关 API 插入埋点代码。

实现步骤

完整的项目源码后续会 release 给大家

知识点

• APT

• AST

缺点

• com.sun.tools.javac.tree 相关 API 语法晦涩,理解难度大,要求对编译原理 有一定的基础

• APT 无法扫描其他 module,导致 AST 无法处理其他 module

• 不支持 Lambda 语法

• 带有返回值的方法,很难把埋点代码插入到方法之后

参考资料

[6]http://www.massapi.com/source/bitbucket/20/86/2086842069/- Processor/src/TimeAnnotationProcessor.java.html

注:该内容来自神策数据用户行为洞察研究院出品的《Android 全埋点解决方案》白皮书,查看完整白皮书可点击《Android 全埋点解决方案》

更多白皮书、报告、干货和案例,可以关注“神策数据”和“用户行为洞察研究院”公众号了解~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ob混淆 ast工具是一种用于混淆源代码的工具,主要针对Python语言编写的代码。AST是Abstract Syntax Tree的缩写,即抽象语法树,它是Python解释器在分析源代码时生成的一种表示方式。ob混淆 ast工具通过操作抽象语法树来混淆源代码,使其难以被逆向工程分析和理解。 ob混淆 ast工具的原理是通过修改和替换抽象语法树中的节点和结构,使得源代码的结构、语义和逻辑变得混乱和困惑。它可以对变量名、函数名、类名等进行重命名,使得原本可读性强的代码变得难以阅读和理解。同时,还可以对源代码中的函数调用关系、控制流等进行修改和隐藏,增加解析和分析的复杂度。 ob混淆 ast工具的优点是能够在不改变源代码的功能和逻辑的前提下,提高源代码的保护性。通过混淆源代码,可以有效地防止源代码被反编译、逆向工程和非法盗用。对于需要加密和保护源代码的应用场景,ob混淆 ast工具是一种非常有效的安保护措施。 然而,ob混淆 ast工具也存在一些缺点。首先,混淆后的源代码可读性较差,给后续的维护和调试带来不便。其次,由于混淆是通过修改和替换抽象语法树实现的,因此在一些复杂和庞大的项目中,可能会导致混淆过程失败或引入新的错误。 总之,ob混淆 ast工具是一种在保护源代码安性方面非常有用的工具。通过操作和修改抽象语法树,可以有效地混淆和加密源代码,使得其难以被逆向工程分析,增加了源代码的安性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值