zoukankan      html  css  js  c++  java
  • 说说 ByteX 的能力

    说说 ByteX 的能力

    说说 ByteX 的能力

    今天以笔者简陋的知识说下对 ByteX 的了解。

    ByteX 是一个 Android gradle 插件管理库,其中默认提供了很多功能。今天只是希望可以简明地述说一下 ByteX 的功能,以及其实现的一些重点。因为笔者理解能力有限,可能有些错误,希望可以有朋友指出哈。

    ByteX 的能力说明

    Android 使用 gradle 进行编译的时候,java 源码部分会先编译成 class 文件,然后 class 文件再经过打包处理,成为 dex 文件。为了简化理解的步骤,可以认为 dex 文件就是最后 Android 应用执行时候的代码。

    在开发的时候,很多情况下都会有这样的需求:在符合某些条件的方法执行的某个位置,执行某操作。例如:给现在的代码里的所有方法的第一句都增加一条 log。我们以 “给现在的代码里的所有方法都增加一条 log” 为例,做法可以是

    • 在 java 文件转成 class 之前,在所有的 java 方法第一句都增加 log 。(为了简化表述,这里不考虑构造方法需要先 super 了。)
    • 在 class 文件生成后,在所有的 class 方法第一句都增加 log。 (为了简化表述,这里也忽略有的不应该加了。)

    这里通常会选择第二种方式,原因有:

    1. 因为 java 文件的处理相比 class 文件不够通用(比如 Kotlin 文件也会转成 class 文件,但是如果是按照 java 文件进行处理的话,还需要新增一份对 kotlin 文件的处理)。
    1. 目前 Android 编译提供的就是 class 的遍历处理,而不是 java 的文件处理。

    而 class 文件的处理很简单,就是将许多个 class 文件依次进行遍历并进行处理,处理之后会生成新的 class 文件。

    假设有多个修改代码的需求的话,比如说除了 给现在的代码里的所有方法的第一句都增加一条 log , 我们还要 给现在的代码里的所有方法的最后一句都增加一条 log 。那么我们有两种方式:

    1. 是在一次 class 的遍历之中做两件事情。
    1. 进行两次遍历,一次在头部加一句 log,一次在尾部加一句 log。

    上面的只是类比,实际上肯定会有很多类似“给每个方法增加 log”这类需求,比如说检测并拦截对敏感设备字段的访问给某些关键方法增加性能统计以及日志上报 等。我们一般的应对也是上面两种,但是前者是不能接受的,因为 各个需求是互不相干的代码执行的(甚至大部分是第三方库里提供的处理),无法整合到一起,因此只能接受第二种模式——重复遍历处理 class。

    这样的话,循环遍历 class 文件会导致 class 处理用了太多的时间,增加了编译时间。

    而 ByteX 的诞生,就是为了将这些处理整合到一起,即将第二种模式修改为第三种模式。

    ByteX 的实现

    那么我们推测一下 ByteX 所作的事情 :

    1. 作为一个普通的 class 处理者,遍历 class 进行处理
    1. 作为一个 “class 处理者” 的容器,将 遍历 class 的操作 传递到其中每个元素上面。

    其实基本上也差不多哈。

  • 相关阅读:
    Bit Manipulation
    218. The Skyline Problem
    Template : Two Pointers & Hash -> String process
    239. Sliding Window Maximum
    159. Longest Substring with At Most Two Distinct Characters
    3. Longest Substring Without Repeating Characters
    137. Single Number II
    142. Linked List Cycle II
    41. First Missing Positive
    260. Single Number III
  • 原文地址:https://www.cnblogs.com/wkmcyz/p/15680626.html
Copyright © 2011-2022 走看看