Merge pull request #109 from bytedance/yangzhiqian/master Upgrade asm libs from 6.2.1 to 9.2;Replace booster-gradle-api with gradle-compat-api;Check unexpected bytecode modifications;Fix memory leak caused by gradle;New whiteList feature in access-inline-plugin
Merge pull request #109 from bytedance/yangzhiqian/master
Upgrade asm libs from 6.2.1 to 9.2;Replace booster-gradle-api with gradle-compat-api;Check unexpected bytecode modifications;Fix memory leak caused by gradle;New whiteList feature in access-inline-plugin
English | 简体中文
本工具由字节跳动抖音 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.3.0" repositories { google() jcenter() maven { url "https://artifact.bytedance.com/repository/byteX/" } } 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 true enableInDebug false logLevel "DEBUG" } // 按需apply bytex 插件 apply plugin: 'bytex.refer_check' // ...
注意:如果不apply ByteX宿主,那么这些ByteX插件与普通的插件无异,将会各自形成单独的Transform。反之,所有ByteX的插件将会自动融合成一个Transform。
以下是基于ByteX开发的插件,可以进入各个插件的README.md了解插件的接入方式。
Log.d
在字节跳动公司内基于ByteX开发的插件超过25个(只开源了部分),你可以基于ByteX快速开发出以下几点相关的插件:
如果你有一些关于字节码的相关需求或脑洞,完全可以基于ByteX来开发新的字节码插件。
请参考研发WIKI:Developer API
如果你有任何关于ByteX的问题或建议,可以加入到微信群与我们沟通交流,我们会及时回复你哒。
除此之外,你也可以发邮件到邮箱:yangzhiqian@bytedance.com、tanlehua@bytedance.com,在邮件中详细描述你的问题。
Change Log
Apache 2.0
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802032778号
English | 简体中文
ByteX(Infinite Possibilities)
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你的插件:
注意:如果不apply ByteX宿主,那么这些ByteX插件与普通的插件无异,将会各自形成单独的Transform。反之,所有ByteX的插件将会自动融合成一个Transform。
以下是基于ByteX开发的插件,可以进入各个插件的README.md了解插件的接入方式。
已集成的插件
Log.d)已知接入方
ByteX框架还能做什么?
在字节跳动公司内基于ByteX开发的插件超过25个(只开源了部分),你可以基于ByteX快速开发出以下几点相关的插件:
Contribution
如果你有一些关于字节码的相关需求或脑洞,完全可以基于ByteX来开发新的字节码插件。
请参考研发WIKI:Developer API
鸣谢
联系我们
如果你有任何关于ByteX的问题或建议,可以加入到微信群与我们沟通交流,我们会及时回复你哒。
除此之外,你也可以发邮件到邮箱:yangzhiqian@bytedance.com、tanlehua@bytedance.com,在邮件中详细描述你的问题。
Change Log
Change Log
License
Apache 2.0