原文链接: https://github.com/bytedance/ByteX/blob/master/README_zh.md

文章目录

  • ByteX(Infinite Possibilities)
      • 背景
      • 特点
      • 项目结构
    • 快速接入
    • 已集成的插件
    • 已知接入方
    • ByteX框架还能做什么?
    • Contribution
    • 鸣谢
    • 联系我们
    • Change Log
    • License

English | 简体中文

ByteX(Infinite Possibilities)

本工具由字节跳动抖音 Android 团队提供。

ByteX是一个基于gradle transform api和ASM的字节码插件平台(或许,你可以把它当成一个有无限个插头的插座?)。

目前集成了若干个字节码插件,每个插件完全独立,既可以脱离ByteX这个宿主而独立存在,又可以自动集成到宿主和其它插件一起整合为一个单独的Transform。插件和插件之间,宿主和插件之间的代码是完全解耦的(有点像组件化),这使得ByteX在代码上拥有很好的可拓展性,新插件的开发将会变得更加简单高效。

背景

如果所有feature都开发一个单独的插件,每个插件编译构建耗时+10s,各个插件叠在一起,编译耗时就会呈线性增长;那如果我们所有feature都基于一个现成的字节码插件做迭代开发,又会让插件代码变得越来越臃肿,代码耦合严重。所以就有了这个想法,单独做一个字节码插件开发平台,新的feature可以基于它做扩展。

特点

  • 代码复用。公共的代码下沉下到common,给所有插件复用,这样每个插件就只需要专注于字节码插桩就行了。

  • 插件间代码隔离,相互解耦。之前字节码的相关feature都是基于某个字节码插件module来迭代扩展的,但各个feature的代码耦合在一起,久而久之这个插件module就成为了大杂烩。而基于ByteX,各个feature都独立成一个个插件,各个feature的代码相互隔离,相互独立,有利于新插件的功能拓展。

  • 平台化让transform更高效。

    • class文件多线程并发处理,充分利用打包机的CPU资源。

    • 插件间自动无缝地整合成一个Transform,提高处理构建的效率。Transform过程中,对class文件的IO是比较耗时的,把所有的plugin整合成一个单独transform可以避免打包的额外时间开销呈线性增长。让耗时从1+1=2,变成1+1<2或者约等于1。

  • 插件移植性强。每个插件都可以脱离ByteX宿主,独立成一个transform,独立工作。

项目结构

TransformEngine

负责遍历读取工程和Android SDK里的所有class文件,并回写到transform指定目录。

base-plugin

宿主,也就一个壳。

common

基础代码库,包括类图构建逻辑,日志,提供给各个插件的适配接口等。

其它插件module

依赖common,实现相应的接口和各自的字节码插桩逻辑。

快速接入

在build.gradle里添加以下配置,按需apply你的插件:

buildscript {ext.plugin_version="0.2.7"repositories {google()jcenter()}dependencies {classpath "com.bytedance.android.byteX:base-plugin:${plugin_version}"// Add bytex plugins' dependencies on demand. 按需添加插件依赖classpath "com.bytedance.android.byteX:refer-check-plugin:${plugin_version}"// ...}
}apply plugin: 'com.android.application'
// apply ByteX宿主
apply plugin: 'bytex'
ByteX {enable trueenableInDebug falselogLevel "DEBUG"
}// 按需apply bytex 插件
apply plugin: 'bytex.refer_check'
// ...

注意:如果不apply ByteX宿主,那么这些ByteX插件与普通的插件无异,将会各自形成单独的Transform。反之,所有ByteX的插件将会自动融合成一个Transform。

以下是基于ByteX开发的插件,可以进入各个插件的README.md了解插件的接入方式。

已集成的插件

  • access-inline-plugin(access方法内联)
  • shrink-r-plugin(R文件瘦身和无用资源检查)
  • closeable-check-plugin(文件流的close检查)
  • const-inline-plugin(常量内联)
  • field-assign-opt-plugin(优化多余赋值指令)
  • getter-setter-inline-plugin (getter和setter方法内联)
  • method-call-opt-plugin(干净地删除某些方法调用,如Log.d
  • coverage-plugin(线上代码覆盖率)
  • refer-check-plugin(检查是否有调用不存在的方法和引用不存在的字段)
  • serialization-check-plugin(序列化检查)
  • SourceFileKiller(删除SourceFile和行号属性,作为示例)
  • ButterKnifeChecker(检测跨module使用ButterKnife可能导致的问题)
  • RFileKnife(修复R.java太大编译报code too large的问题)

已知接入方

抖音 Tik Tok 今日头条
火山小视频 飞书 多闪
FaceU激萌 轻颜 飞聊

ByteX框架还能做什么?

在字节跳动公司内基于ByteX开发的插件超过25个(只开源了部分),你可以基于ByteX快速开发出以下几点相关的插件:

  • 性能优化(SPI…)
  • 优化包大小(xxx-inline…)
  • 修复bug
  • 代码分析检查/安全扫描
  • AOP(SharedPreferences替换…)
  • 其他

Contribution

如果你有一些关于字节码的相关需求或脑洞,完全可以基于ByteX来开发新的字节码插件。

请参考研发WIKI:Developer API

鸣谢

  • lancet
  • booster

联系我们

如果你有任何关于ByteX的问题或建议,可以加入到微信群与我们沟通交流,我们会及时回复你哒。

除此之外,你也可以发邮件到邮箱:yangzhiqian@bytedance.com、tanlehua@bytedance.com,在邮件中详细描述你的问题。

Change Log

Change Log

License

Apache 2.0

【我的ASM学习进阶之旅】 介绍一个基于gradle transform api和ASM的字节码插件平台ByteX相关推荐

  1. 【我的ASM学习进阶之旅】ASM 实现 Hook Lambda 和方法引用

    ASM 实现 Hook Lambda 和方法引用 | 数据采集 PS: 本文转载于:ASM 实现 Hook Lambda 和方法引用 | 数据采集 1. 前言 本文是前作「Lambda 设计参考」的实 ...

  2. 【我的OpenGL学习进阶之旅】介绍一下 绘制图元

    目录 一.绘制图元 1.1 `glDrawArrays` 1.1.1 `glDrawArrays`API说明 1.1.2 `glDrawArrays`API示例 1.2 `glDrawElements ...

  3. 【我的C语言学习进阶之旅】介绍一下NDK开发中关于JNI函数的两种注册方式:静态注册和动态注册

    目录 一.要介绍本篇博客的原因 二.静态注册 2.1 实现原理 2.2 实现过程 2.3 弊端 2.4 示例 三.动态注册 3.1 实现原理 3.2 实现过程 3.3 优点 3.4 示例 一.要介绍本 ...

  4. 【我的OpenGL学习进阶之旅】C++如何加载TGA文件?

    一.TGA文件相关介绍 通过前面的博客 [我的OpenGL学习进阶之旅]什么是TGA文件以及如何打开TGA文件? 地址:https://ouyangpeng.blog.csdn.net/article ...

  5. 【我的OpenGL学习进阶之旅】【持续更新】关于学习OpenGL的一些资料

    目录 一.相关书籍 OpenGL 方面 C方面 NDK 线性代数 二.相关博客 2.0 一些比较官方的链接 2.1 OpenGL着色器语言相关 2.2 [[yfan]](https://segment ...

  6. 【我的OpenGL学习进阶之旅】着色器和程序(上)------着色器

    着色器和程序 一.前言 二.着色器和程序 2.1 创建和编译一个着色器 2.1.1 创建着色器 2.1.2 删除着色器 2.1.3 提供着色器源代码 2.1.4 编译色器 2.1.4 查询有关着色器对 ...

  7. 【我的OpenGL学习进阶之旅】OpenGL ES 3.0新功能

    目录 1.1 纹理 1.2 着色器 1.3 几何形状 1.4 缓冲区对象 1.5 帧缓冲区 OpenGL ES 2.0 开创了手持设备可编程着色器的时代,在驱动大量设备的游戏.应用程序和用户接口中获得 ...

  8. JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)

    JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...

  9. 一个基于codeigniter的淘宝客程序源码,适合学习参考,京东拼多多淘宝联盟api

    一个基于codeigniter的淘宝客程序源码,直接调用淘宝联盟api,效果图如下: 该源码需要的环境是php5.6,适合初学者开发学习之用. 下载资源地址分享, https://download.c ...

最新文章

  1. Pycharm自定义包的导入
  2. 左神算法:在二叉树中找到累加和为指定值的最长路径长度(Java版)
  3. Entity Framework 6 Recipes 2nd Edition(10-3)译 - 返回结果是一个标量值
  4. 今日听闻这几款手机软件比较火爆 果然名不虚传!
  5. 移动计算比移动数据更划算
  6. dataframe修改列名_python dataframe操作大全数据预处理过程(dataframe、md5)
  7. Python基础入门知识点——Python中的异常
  8. 动手学servlet(六) 过滤器和监听器
  9. oracle离线文档查dbms_Oracle日志文件管理与查看
  10. 面试题分享,麻麻再也不用担心我的面试了
  11. 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList
  12. 《CDN技术详解》 - CDN知多少?
  13. 华为工作法--读后感
  14. 计算机cpu后面字母代表什么意思,CPU后缀含义是什么意思 AMD/intel处理器后缀字母代表什么涵义...
  15. mame模拟器版大家来找碴外挂,python源码
  16. 图深度学习模型进展和在阿里搜索广告中的应用创新
  17. Get “https://github.com/electron-userland/electron-builder-binaries/releases/download/appimage-12.0.
  18. ROS创建KDL tree
  19. Windows10超级好用的虚拟机
  20. 【笔记】下单但未支付的订单倒计时自动取消逻辑实现

热门文章

  1. 推荐系统实践--基于邻域的社会化推荐算法
  2. Js(一)Error [ERR_MODULE_NOT_FOUND]: Cannot find package ‘uuid‘ imported
  3. 交换机通过console线连接pc
  4. 陕西被欠薪特岗教师收到部分补发工资 纪委介入
  5. The listener supports no services问题解决
  6. 最大报文段长度——MSS
  7. net以execl做数据库_将Excel直接当作数据库使用,ASP.NET三层架构
  8. 开心截图让梦想照进现实
  9. 360浏览器非法上传用户隐私全程解析
  10. 进程和线程的区别及python多进程、多线程实现