ByteX 字节码插件开发平台开源项目

我要开发同款
匿名用户2021年12月17日
159阅读

技术信息

开源地址
https://github.com/bytedance/ByteX
授权协议
Apache 2.0

作品详情

ByteX是一个基于gradletrasformapi和ASM的字节码插件平台,由字节跳动抖音Adroid团队提供。

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

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

特点

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

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

平台化让trasform更高效。

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

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

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

项目结构

TrasformEgie

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

base-plugi

宿主,也就一个壳。

commo

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

其它插件module

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

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

buildscript{ext.plugi_versio="0.3.0"repositories{google()jceter()mave{url"https://artifact.bytedace.com/repository/byteX/"}}depedecies{classpath"com.bytedace.adroid.byteX:base-plugi:${plugi_versio}"//Addbytexplugis'depedeciesodemad.按需添加插件依赖classpath"com.bytedace.adroid.byteX:refer-check-plugi:${plugi_versio}"//...}}applyplugi:'com.adroid.applicatio'//applyByteX宿主applyplugi:'bytex'ByteX{eabletrueeableIDebugfalselogLevel"DEBUG"}//按需applybytex插件applyplugi:'bytex.refer_check'//...注意:如果不applyByteX宿主,那么这些ByteX插件与普通的插件无异,将会各自形成单独的Trasform。反之,所有ByteX的插件将会自动融合成一个Trasform。

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

已集成的插件access-ilie-plugi(access方法内联)shrik-r-plugi(R文件瘦身和无用资源检查)closeable-check-plugi(文件流的close检查)cost-ilie-plugi(常量内联)field-assig-opt-plugi(优化多余赋值指令)getter-setter-ilie-plugi (getter和setter方法内联)method-call-opt-plugi(干净地删除某些方法调用,如Log.d)coverage-plugi(线上代码覆盖率)refer-check-plugi(检查是否有调用不存在的方法和引用不存在的字段)serializatio-check-plugi(序列化检查)SourceFileKiller(删除SourceFile和行号属性,作为示例)ButterKifeChecker(检测跨module使用ButterKife可能导致的问题)RFileKife(修复R.java太大编译报codetoolarge的问题)

 

功能介绍

ByteX 是一个基于 gradle transform api 和 ASM 的字节码插件平台,由字节跳动抖音 Android 团队提供。 目前集成了若干个字节码插件,每个插件完全独立,既可以脱...

示例图片

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论