動(dòng)態(tài)編譯技術(shù):編譯期間動(dòng)態(tài)的在class文件中注入代碼或者或修改,大多插件化熱修復(fù)都會(huì)采用此技術(shù)。
自定義Gradle插件
①

WX20180528-180941@2x.png
常規(guī)操作創(chuàng)建Project,新建一個(gè)module,此處新建了一個(gè)lib1新模塊用于編寫gradle插件.
②

WX20180528-181404@2x.png
如圖將lib1中的所有文件刪除,保留main,build,lib1.iml
③

QQ20180529-092037@2x.png
- 創(chuàng)建groovy文件
- main--->groovy--->包名(com.xxx.xxx)--->XXX.groovy(注意添加.groovy后綴)
④
插件模塊build添加groovy和maven
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//gradle sdk
compile gradleApi()
//groovy sdk
compile localGroovy()
}
repositories {
mavenCentral()
}
⑤ 創(chuàng)建resouces定義插件使用名

WX20180529-101926@2x.png
在mian--->resources--->META-INF--->gradle-plugins--->com.allure.plugin.properties
此處注意com.allure.plugin是定義的插件名,后綴properties,其他地方使用:
apply plugin: 'com.allure.plugin'
在此文件指定加載的具體插件類
implementation-class=com.allure.plugin.MyPlugin
⑥ 書寫插件類執(zhí)行的任務(wù)
public class MyPlugin implements Plugin<Project> {
void apply(Project project) {
println('========================');
println('test plugin!');
println('========================');
}
}
到此插件制作完畢
(二)打包到本地或者maven
在插件類的build
group='com.allure.plugin'
version='1.0.0'
uploadArchives {
repositories {
mavenDeployer {
//提交到遠(yuǎn)程服務(wù)器:
// repository(url: "http://www.xxx.com/repos") {
// authentication(userName: "admin", password: "admin")
// }
//本地的Maven地址設(shè)置為/Users/mac/Downloads/ttt
repository(url: uri('/Users/mac/Downloads/ttt'))
}
}
}
- 執(zhí)行上傳task

WX20180529-102516@2x.png
執(zhí)行后生成文件

WX20180529-102623@2x.png
(三)使用自定義的Gradle插件
在任意module(如app)里的build引入自定義的插件
apply plugin :'com.allure.plugin'
buildscript {
repositories {
maven {//本地Maven倉(cāng)庫(kù)地址
url uri('/Users/mac/Downloads/ttt')
}
}
dependencies {
//格式為-->group:module:version
classpath 'com.allure.plugin:lib1:1.0.0'
}
}
執(zhí)行效果如圖
Configuration on demand is an incubating feature.
========================
test plugin!
========================
Configuration 'compile' in project ':app' is deprecated. Use 'implementation' instead.
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:checkDebugManifest UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:prepareLintJar UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:createDebugCompatibleScreenManifests UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:splitsDiscoveryTaskDebug UP-TO-DATE
....