<h4 align="right"> <strong>简体中文</strong> | <a href="https://github.com/FlyJingFish/FastTransform/blob/master/README.md">English</a> </h4> <p align="center"> <a href="https://central.sonatype.com/search?q=io.github.flyjingfish.FastTransform"><img src="https://img.shields.io/maven-central/v/io.github.FlyJingFish.FastTransform/fast-transform" alt="Build" /></a> <a href="https://github.com/FlyJingFish/FastTransform/stargazers"><img src="https://img.shields.io/github/stars/FlyJingFish/FastTransform.svg" alt="Downloads" /></a> <a href="https://github.com/FlyJingFish/FastTransform/network/members"><img src="https://img.shields.io/github/forks/FlyJingFish/FastTransform.svg" alt="Python Package Index" /></a> <a href="https://github.com/FlyJingFish/FastTransform/issues"><img src="https://img.shields.io/github/issues/FlyJingFish/FastTransform.svg" alt="Docker Pulls" /></a> <a href="https://github.com/FlyJingFish/FastTransform/blob/master/LICENSE"><img src="https://img.shields.io/github/license/FlyJingFish/FastTransform.svg" alt="Sponsors" /></a> </p> # 简述 对于使用 AGP8 的 toTransform 的api的各位小伙伴来说都应该接入本框架,或遵循本框架的设计,这将使打包速度显著加快 ### 版本限制 版本要求AGP 7.6 以上 ## 使用步骤 **在开始之前可以给项目一个Star吗?非常感谢,你的支持是我唯一的动力。欢迎Star和Issues!** ### 1、在 你的插件库的类库中引入 ```gradle dependencies { implementation 'io.github.FlyJingFish.FastTransform:fast-transform:1.0.5' } ``` ### 2、使用本库 ```kotlin class MyPlugin : Plugin<Project> { override fun apply(project: Project) { val androidComponents = project.extensions.getByType(AndroidComponentsExtension::class.java) androidComponents.onVariants { variant -> val task = project.tasks.register("${variant.name}XXX", MyClassesTask::class.java) /* variant.artifacts .forScope(ScopedArtifacts.Scope.ALL) .use(taskProvider) .toTransform( ScopedArtifact.CLASSES, MyTask::allJars, MyTask::allDirectories, MyTask::outputFile ) */ variant.toTransformAll(task) //等价于上边的写法 // variant.toTransformAll(task,false) 第二个参数传入 false 就代表使用原本未加速的逻辑 } } } //继承 DefaultTransformTask abstract class MyClassesTask : DefaultTransformTask() { // 相当于以前被 @TaskAction 注解的方法 override fun startTask() { /** * singleClassesJar() 是否只有一个jar包,返回true代表之前有一个使用 toTransform 的插件,而且他没有使用本插件或没有遵循本设计 */ /** * isFastDex 是调用 toTransformAll 传入的第二个参数 */ allDirectories().forEach { directory -> directory.walk().forEach { file -> if (file.isFile) { val relativePath = file.getRelativePath(directory) val jarEntryName: String = relativePath.toClassPath() FileInputStream(file).use { inputs -> val cr = ClassReader(inputs) val cw = ClassWriter(cr,0) cr.accept( MyClassVisitor(cw), ClassReader.EXPAND_FRAMES ) cw.toByteArray().inputStream().use { //写入jar directory.saveJarEntry(jarEntryName,it) } } } } } allJars().forEach { file -> if (file.absolutePath in ignoreJar){ return@forEach } val jarFile = JarFile(file) val enumeration = jarFile.entries() while (enumeration.hasMoreElements()) { val jarEntry = enumeration.nextElement() val entryName = jarEntry.name if (jarEntry.isDirectory || entryName.isEmpty() || entryName.startsWith("META-INF/") || "module-info.class" == entryName || !entryName.endsWith(".class")) { continue } jarFile.getInputStream(jarEntry).use { inputs -> val cr = ClassReader(inputs) val cw = ClassWriter(cr,0) cr.accept( MyClassVisitor(cw), ClassReader.EXPAND_FRAMES ) cw.toByteArray().inputStream().use { //写入jar file.saveJarEntry(jarEntryName,it) } } } jarFile.close() } } override fun endTask() { //在此写一些结束性工作 } } ``` ## 直接加速现有项目 你现有的项目存在使用 `toTransform` 的插件,而它没有使用本框架或遵循本框架的设计,则可以选择下边一种方式去加速你的项目 ### 方式一 在 **项目根目录** 的 `build.gradle` 里依赖插件 - 新版本 ```gradle plugins { //必须项 👇 注意 apply 设置必须为 true id "io.github.FlyJingFish.FastTransform" version "1.0.5" apply true } ``` - 或者老版本 ```gradle buildscript { dependencies { //必须项 👇 classpath 'io.github.FlyJingFish.FastTransform:fast-transform:1.0.5' } } apply plugin: "fast.dex" ``` ### 方式二 在 **app 所在module** 的 `build.gradle` 里依赖插件 ```gradle //必须项 👇 plugins { ... id "io.github.FlyJingFish.FastTransform" version "1.0.5" } ``` ### 最后推荐我写的另外一些库 - [AndroidAOP 帮助 Android App 改造成AOP架构的框架,只需一个注解就可以请求权限、切换线程、禁止多点、一次监测所有点击事件、监测生命周期等等](https://github.com/FlyJingFish/AndroidAOP) - [OpenImage 轻松实现在应用内点击小图查看大图的动画放大效果](https://github.com/FlyJingFish/OpenImage) - [ShapeImageView 支持显示任意图形,只有你想不到没有它做不到](https://github.com/FlyJingFish/ShapeImageView) - [GraphicsDrawable 支持显示任意图形,但更轻量](https://github.com/FlyJingFish/GraphicsDrawable) - [ModuleCommunication 解决模块间的通信需求,更有方便的router功能](https://github.com/FlyJingFish/ModuleCommunication) - [FormatTextViewLib 支持部分文本设置加粗、斜体、大小、下划线、删除线,下划线支持自定义距离、颜色、线的宽度;支持添加网络或本地图片](https://github.com/FlyJingFish/FormatTextViewLib) - [主页查看更多开源库](https://github.com/FlyJingFish)