English | 简体中文
ByteX(Infinite Possibilities)
Powered by ByteDance TikTok & Douyin Android team.
ByteX is a bytecode plugin platform based on Android Gradle Transform Api and ASM.
(Maybe you can think of it as a socket with unlimited plugs?)
In the apk building process, each plugin is completely independent. It not only can run independently from the ByteX host, but also can be automatically integrated into the host into a single Transform along with other plugins.
What's more, each plugin's code is decoupled from one another, as well as their host, which makes it extensible and highly efficient for the development of new plugins.
Background
If all features are developed as a separate plugin, each plugin will cost 10+s, and the compilation time will increase linearly.
But if the iterative development in only one plugin module will make it more and more cluttered, for the code is deeply coupled.
So an idea was raised. It could make sense to build a bytecode plugin platform, and the new feature can be extended based on it as a new plugin.
Feature
-
Code reuse. The common code sinks to
common
module and is reused by all plugins, so that each plugin only needs to focus on bytecode operation. -
Plugin code is isolated and decoupled from each other. Based on ByteX, each feature is independent as a single plugin, and the code of each plugin is isolated from each other, which is conducive to develop a new plugin.
-
Platformization makes
Transform
more efficient.-
Class files are processed in multiple threads concurrently, making full use of the CPU resources of your machine.
-
Plugins are automatically and seamlessly integrated into a single
Transform
to improve the efficiency of processing. During theTransform
process, the IO of the class file is time-consuming. Integrating all the plugins into a single transform can avoid the costing time increasing linearly. It makes "1 + 1 = 2" become "1 + 1 <2" or approximately equal to 1.
-
-
Plugin portability is outstanding. Each plugin can be separated from the ByteX host, working as a transform independently.
Structure
TransformEngine
Reading all the class files in the project and Android SDK, and writing back to the specified directory.
base-plugin
ByteX host.
common
Basic code library, including class diagram construction, logs, interfaces provided to various plugins.
other plugin modules
Depending on common
module and focusing on bytecode operation.
Quick Start
Add those configuration code to your build.gradle, and apply your plugins on demand.
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 host
apply plugin: 'bytex'
ByteX {
enable true
enableInDebug false
logLevel "DEBUG"
}
// apply bytex plugins on demand...
apply plugin: 'bytex.refer_check'
// ...
Note: If ByteX host is not applied, there is no difference between ByteX plugins and ordinary ones, and all of them will run separately. On the contrary, all ByteX plugins can be automatically merged into one single Transform with the help of the ByteX host.
Plugins
- access-inline-plugin(Inline access method)
- shrink-r-plugin(Slimming R files&Unused resource check)
- closeable-check-plugin(Detect opening stream without close)
- const-inline-plugin(Inline constants)
- field-assign-opt-plugin(Optimize redundant assignment instructions)
- getter-setter-inline-plugin (Inline Getters and Setters)
- method-call-opt-plugin(Delete some method invoking instructions clearly e.g.
Log.d
) - coverage-plugin(Online code coverage)
- refer-check-plugin(Detect if there is a invocation to a non-existent method and a reference to a non-existent field)
- serialization-check-plugin(Serialization check)
- SourceFileKiller(Shrink SourceFile and linenumber)
- ButterKnifeChecker(detect exceptions caused by cross-module use of ButterKnife)
- RFileKnife(Fix R.java code too large)
Apps Using ByteX
抖音 | Tik Tok | 今日头条 |
火山小视频 | 飞书 | 多闪 |
FaceU激萌 | 轻颜 | 飞聊 |
What else can the ByteX do?
There are more than 25 plugins developed based on ByteX in ByteDance (We only open sourced some of them). You can quickly develop the following related plugins based on ByteX:
- Performance optimization(SPI...)
- Optimize apk size(xxx-inline...)
- Fix Bug
- Code analysis / security scan
- AOP(replace SharedPreferences...)
- and so on
Contribution
If you have some creative ideas and demands related to bytecode, come to join us to develop a new bytecode plugin based on ByteX!
Please read through our Developer API.
Thanks
Contact us
If you have any question or advice about ByteX, feel free to join our WeChat group.
Besides, sending email to yangzhiqian@bytedance.com or tanlehua@bytedance.com is also available for you.
Change Log
License
Apache 2.0