Transform簡介
是Android官方提供給開發(fā)者在項目構(gòu)建階段即由class到dex轉(zhuǎn)換期間修改class文件的一套api泳桦。
我們可以通過Gradle插件來注冊我們編寫的Transform花鹅。注冊后的Transform會被Gradle包裝成一個Gradle Task,這個TransForm Task會在java compile Task執(zhí)行完畢后運行痢法。
Gradle插件
自定義gradle插件有三種方式
- Build script gradle文件崇堰,構(gòu)建腳本內(nèi)座享,不過這種只能在文件內(nèi)使用
- buildSrc project 可以在自己的工程內(nèi)隨意使用帝嗡,但是其他工程就無法使用
屏幕快照 2019-07-23 上午9.54.35.png
WubaTimeAssist.properties文件中需要實現(xiàn)這樣一行代碼
com.plugin.TestPlugin是你實現(xiàn)Plugin<Project>類的路徑
implementation-class= com.plugin.TestPlugin
-
Standalone project 單獨項目的插件,可以隨意一個工程去引用坟桅,前提是需要發(fā)布到本地倉庫或者maven私服
工程結(jié)構(gòu)與buildSrc project 差不多华望,但是需要發(fā)布maven,上傳腳本桦卒,upload task
屏幕快照 2019-07-23 上午10.04.33.png
Transform API
- TransformInput:就是對輸入的class文件轉(zhuǎn)變成目標(biāo)字節(jié)碼文件立美,目前它包括兩部分:DirectoryInput與JarInput。
- DirectoryInput:就是項目編譯的所有目錄結(jié)構(gòu)及其目錄下的源碼文件方灾,可以借助于它來修改輸出文件的目錄結(jié)構(gòu)建蹄、已經(jīng)目標(biāo)字節(jié)碼文件。
- JarInput:所有本地jar包或遠(yuǎn)程jar包裕偿,可以借助于它來動態(tài)添加jar包洞慎。
- TransformOutputProvider:Transform的輸出,可以通過它來獲取輸出路徑
繼承自Transform 的類需要實現(xiàn)幾個重要方法
- getName()就是指定自定義的Transform的名字嘿棘。
- 自定義的這個Transform處理的輸入類型劲腿,現(xiàn)在的就是兩種類型即分為class文件或者java資源(resource)
@Override
public Set<QualifiedContent.ContentType> getInputTypes() {
return TransformManager.CONTENT_CLASS;
}
- 該方法是定義你tranform的作用范圍,整個工程鸟妙,當(dāng)前工程等
@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))
}
}
}
關(guān)于Extension
注冊的名字焦人,可以在gradle文件中配置,類似與一種bean重父,可以獲取到gradle文件中相應(yīng)的值花椭,用來做一些輸入控制
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
http://www.reibang.com/p/031b62d02607