40 编译插桩技术-分类

作者: 凤邪摩羯 | 来源:发表于2021-01-29 09:01 被阅读0次

    编译插桩技术具体可以分为两类,如下所示:

    1)、APT(Annotation Process Tools) :用于生成 Java 代码。
    2)、AOP(Aspect Oriented Programming):用于操作字节码。

    1、APT(Annotation Process Tools)

    总所周知,ButterKnife、Dagger、GreenDao、Protocol Buffers 这些常用的注解生成框架都会在编译过程中生成代码。
    而 使用 AndroidAnnotation 结合 APT 技术 来生成代码的时机,是在编译最开始的时候介入的

    使用 APT 技术生成 Java 代码的方式具有如下 两方面 的优势:

    • 1)、隔离了框架复杂的内部实现,使得开发更加地简单高效。
    • 2)、大大减少了手工重复的工作量,降低了开发时出错的机率。

    2、AOP(Aspect Oriented Programming)

    AOP 是在编译完成后生成 dex 文件之前的时候,直接通过修改 .class 文件的方式,来直接添加或者修改代码逻辑的。

    而对于操作字节码的方式来说,一般都在 代码监控、代码修改、代码分析 这三个场景有着很广泛的应用。

    相对于 Java 代码生成的方式,操作字节码的方式有如下 特点:

    • 1)、应用场景更广。
    • 2)、功能更加强大。
    • 3)、使用复杂度较高。

    此外,我们不仅可以操作 .class 文件的 Java 字节码,也可以操作 .dex 文件的 Dalvik 字节码

    1、代码监控

    编译插桩技术除了 不能够实现耗电监控,它能够实现各式各样的性能监控,例如:网络数据监控、耗时方法监控、大图监控、线程监控 等等。

    譬如 网络数据监控 的实现,就是在 网络层通过 hook 网络库方法 和 自动化注入拦截器的形式,实现网络请求的全过程监控,包括获取握手时长,首包时间,DNS 耗时,网络耗时等各个网络阶段的信息

    实现了对网络请求过程的监控之后,我们便可以 对整个网络过程的数据表现进行详细地分析,找到网络层面性能的问题点,并做出针对性地优化措施。例如针对于 网络错误率偏高 的问题,我们可以采取以下几方面的措施,如下所示:

    • 1)、使用 HttpDNS。
    • 2)、将错误日志同步 CDN。
    • 3)、CDN 调度链路优化。

    2、代码修改

    用编译插桩技术来实现代码修改的场景非常之多,而使用最为频繁的场景具体可细分为为如下四种:

    • 1)、实现无痕埋点网易HubbleData之Android无埋点实践51 信用卡 Android 自动埋点实践%E3%80%82)
    • 2)、统一处理点击抖动:编译阶段统一 hook android.view.View.OnClickListener#onClick() 方法,来实现一个快速点击无效的防抖动效果,这样便能高效、无侵入性地统一解决客户端快速点击多次导致频繁响应的问题。
    • 3)、第三方 SDK 的容灾处理:我们可以在上线前临时修改或者 hook 第三方 SDK 的方法,做到快速容灾上线。
    • 4)、实现热修复框架:我们可以在 Gradle 进行自动化构建的时候,即在 Java 源码编译完成之后,生成 dex 文件之前进行插桩,而插桩的作用是在每个方法执行时先去根据自己方法的签名寻找是否有自己对应的 patch 方法,如果有,执行 patch 方法;如果没有,则执行自己原有的逻辑。

    3、代码分析

    例如 Findbugs 等三方的代码检查工具里面的 自定义代码检查 也使用了编译插桩技术,利用它我们可以找出 不合理的 Hanlder 使用、new Thread 调用、敏感权限调用 等等一系列编码问题。

    相关文章

      网友评论

        本文标题:40 编译插桩技术-分类

        本文链接:https://www.haomeiwen.com/subject/ceptzktx.html