【我的ASM学习进阶之旅】 介绍一个基于gradle transform api和ASM的字节码插件平台ByteX
原文链接: 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相关推荐
- 【我的ASM学习进阶之旅】ASM 实现 Hook Lambda 和方法引用
ASM 实现 Hook Lambda 和方法引用 | 数据采集 PS: 本文转载于:ASM 实现 Hook Lambda 和方法引用 | 数据采集 1. 前言 本文是前作「Lambda 设计参考」的实 ...
- 【我的OpenGL学习进阶之旅】介绍一下 绘制图元
目录 一.绘制图元 1.1 `glDrawArrays` 1.1.1 `glDrawArrays`API说明 1.1.2 `glDrawArrays`API示例 1.2 `glDrawElements ...
- 【我的C语言学习进阶之旅】介绍一下NDK开发中关于JNI函数的两种注册方式:静态注册和动态注册
目录 一.要介绍本篇博客的原因 二.静态注册 2.1 实现原理 2.2 实现过程 2.3 弊端 2.4 示例 三.动态注册 3.1 实现原理 3.2 实现过程 3.3 优点 3.4 示例 一.要介绍本 ...
- 【我的OpenGL学习进阶之旅】C++如何加载TGA文件?
一.TGA文件相关介绍 通过前面的博客 [我的OpenGL学习进阶之旅]什么是TGA文件以及如何打开TGA文件? 地址:https://ouyangpeng.blog.csdn.net/article ...
- 【我的OpenGL学习进阶之旅】【持续更新】关于学习OpenGL的一些资料
目录 一.相关书籍 OpenGL 方面 C方面 NDK 线性代数 二.相关博客 2.0 一些比较官方的链接 2.1 OpenGL着色器语言相关 2.2 [[yfan]](https://segment ...
- 【我的OpenGL学习进阶之旅】着色器和程序(上)------着色器
着色器和程序 一.前言 二.着色器和程序 2.1 创建和编译一个着色器 2.1.1 创建着色器 2.1.2 删除着色器 2.1.3 提供着色器源代码 2.1.4 编译色器 2.1.4 查询有关着色器对 ...
- 【我的OpenGL学习进阶之旅】OpenGL ES 3.0新功能
目录 1.1 纹理 1.2 着色器 1.3 几何形状 1.4 缓冲区对象 1.5 帧缓冲区 OpenGL ES 2.0 开创了手持设备可编程着色器的时代,在驱动大量设备的游戏.应用程序和用户接口中获得 ...
- JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)
JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...
- 一个基于codeigniter的淘宝客程序源码,适合学习参考,京东拼多多淘宝联盟api
一个基于codeigniter的淘宝客程序源码,直接调用淘宝联盟api,效果图如下: 该源码需要的环境是php5.6,适合初学者开发学习之用. 下载资源地址分享, https://download.c ...
最新文章
- Pycharm自定义包的导入
- 左神算法:在二叉树中找到累加和为指定值的最长路径长度(Java版)
- Entity Framework 6 Recipes 2nd Edition(10-3)译 - 返回结果是一个标量值
- 今日听闻这几款手机软件比较火爆 果然名不虚传!
- 移动计算比移动数据更划算
- dataframe修改列名_python dataframe操作大全数据预处理过程(dataframe、md5)
- Python基础入门知识点——Python中的异常
- 动手学servlet(六) 过滤器和监听器
- oracle离线文档查dbms_Oracle日志文件管理与查看
- 面试题分享,麻麻再也不用担心我的面试了
- 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList
- 《CDN技术详解》 - CDN知多少?
- 华为工作法--读后感
- 计算机cpu后面字母代表什么意思,CPU后缀含义是什么意思 AMD/intel处理器后缀字母代表什么涵义...
- mame模拟器版大家来找碴外挂,python源码
- 图深度学习模型进展和在阿里搜索广告中的应用创新
- Get “https://github.com/electron-userland/electron-builder-binaries/releases/download/appimage-12.0.
- ROS创建KDL tree
- Windows10超级好用的虚拟机
- 【笔记】下单但未支付的订单倒计时自动取消逻辑实现
热门文章
- 推荐系统实践--基于邻域的社会化推荐算法
- Js(一)Error [ERR_MODULE_NOT_FOUND]: Cannot find package ‘uuid‘ imported
- 交换机通过console线连接pc
- 陕西被欠薪特岗教师收到部分补发工资 纪委介入
- The listener supports no services问题解决
- 最大报文段长度——MSS
- net以execl做数据库_将Excel直接当作数据库使用,ASP.NET三层架构
- 开心截图让梦想照进现实
- 360浏览器非法上传用户隐私全程解析
- 进程和线程的区别及python多进程、多线程实现