Transform简介
是Android官方提供给开发者在项目构建阶段即由class到dex转换期间修改class文件的一套api。
我们可以通过Gradle插件来注册我们编写的Transform。注册后的Transform会被Gradle包装成一个Gradle Task,这个TransForm Task会在java compile Task执行完毕后运行。
Gradle插件
自定义gradle插件有三种方式
- Build script gradle文件,构建脚本内,不过这种只能在文件内使用
- buildSrc project 可以在自己的工程内随意使用,但是其他工程就无法使用
WubaTimeAssist.properties文件中需要实现这样一行代码
com.plugin.TestPlugin是你实现Plugin<Project>类的路径
implementation-class= com.plugin.TestPlugin
-
Standalone project 单独项目的插件,可以随意一个工程去引用,前提是需要发布到本地仓库或者maven私服
工程结构与buildSrc project 差不多,但是需要发布maven,上传脚本,upload task
屏幕快照 2019-07-23 上午10.04.33.png
Transform API
- TransformInput:就是对输入的class文件转变成目标字节码文件,目前它包括两部分:DirectoryInput与JarInput。
- DirectoryInput:就是项目编译的所有目录结构及其目录下的源码文件,可以借助于它来修改输出文件的目录结构、已经目标字节码文件。
- JarInput:所有本地jar包或远程jar包,可以借助于它来动态添加jar包。
- TransformOutputProvider:Transform的输出,可以通过它来获取输出路径
继承自Transform 的类需要实现几个重要方法
- getName()就是指定自定义的Transform的名字。
- 自定义的这个Transform处理的输入类型,现在的就是两种类型即分为class文件或者java资源(resource)
@Override
public Set<QualifiedContent.ContentType> getInputTypes() {
return TransformManager.CONTENT_CLASS;
}
- 该方法是定义你tranform的作用范围,整个工程,当前工程等
@Override
public Set<QualifiedContent.Scope> getScopes() {
return TransformManager.SCOPE_FULL_PROJECT
}
注册Transform
注意这里是以开源项目DroidAssist为例子
class DroidAssistPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.extensions.create("droidAssistOptions", DroidAssistExtension)
//对整个工程的处理
if (project.plugins.hasPlugin(AppPlugin.class)) {
AppExtension extension = project.extensions.getByType(AppExtension)
extension.registerTransform(
new DroidAssistTransform(project, true))
}
//只对lib工程做处理
if (project.plugins.hasPlugin(LibraryPlugin.class)) {
LibraryExtension extension = project.extensions.getByType(LibraryExtension)
extension.registerTransform(
new DroidAssistTransform(project, false))
}
}
}
关于Extension
注册的名字,可以在gradle文件中配置,类似与一种bean,可以获取到gradle文件中相应的值,用来做一些输入控制
project.extensions.create("droidAssistOptions", DroidAssistExtension)
gradle文件中
droidAssistOptions {
enable true
logLevel 3
config file("droidassist.xml")
logDir file("${project.buildDir.absolutePath}/logs")
}
参考
官方API文档:
http://google.github.io/android-gradle-dsl/javadoc/2.1/com/android/build/api/transform/Transform.html
https://www.jianshu.com/p/031b62d02607
网友评论