import proguard.gradle.ProGuardTask
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'net.sf.proguard:proguard-gradle:5.3.3'
}
}
task proguardFiles(type: ProGuardTask, dependsOn: compileJava) {
// 讓jar這個task依賴於本task,後文會說明
tasks.jar.dependsOn.add(proguardFiles)
println "proguarding"
// 配置ProGuardTask
printmapping "$buildDir/mapping.txt"
configuration 'proguard-rules.pro'
libraryjars files(configurations.compile.findAll {}.collect())
libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
libraryjars "${System.getProperty('java.home')}/lib/jce.jar"
injars sourceSets.main.output
// 設置輸出路徑,注意這裏輸出物爲文件(不是默認的jar)
outjars "$buildDir/libs/${project.name}"
// 清除上次的生成物
delete "$buildDir/libs/${project.name}"
// 在本task的execute階段,將混淆後的class文件替換正常class文件
doLast {
println "copying product:${sourceSets.main.output.classesDir}"
// 刪除原有的class文件
delete "${sourceSets.main.output.classesDir}"
// 將混淆class文件複製過去
copy {
from "$buildDir/libs/${project.name}"
into "${sourceSets.main.output.classesDir}"
}
}
}
這裏做了幾件事情:
定義proguard task,令jar這個java task依賴於它。即proguard task運行完畢後才運行jar。
使用文件替換的方式,在jar運行前替換掉class文件。
通過觀察gradle console的輸出,得知app在編譯時會運行jar task。經過1.2.兩步我們可以在正常編譯
流程中插入proguard處理後的class文件。
引入debug/release
在lib模塊的build.gradle中加入如下代碼:
// 定義debug compile的回調函數
void onDebug() {
println " ----- onDebug ----- "
// 在debug模式下,關閉混淆優化等一系列操作
proguardFiles.dontobfuscate()
proguardFiles.dontoptimize()
proguardFiles.dontshrink()
proguardFiles.dontpreverify()
}
// 定義release compile的回調函數
void onRelease() {
println " ----- onRelease -----"
}
然後在app的build.gradl中加入如下代碼:
tasks.whenTaskAdded { task ->
if (task.name == 'preReleaseBuild') {
// release build
task.doLast {
def taskProject = rootProject.subprojects.findAll {it.name == "lib"}
taskProject[0].onRelease()
}
} else if (task.name == 'preDebugBuild') {
// debug build
task.doLast {
def taskProject = rootProject.subprojects.findAll {it.name == "lib"}
taskProject[0].onDebug()
}
}
}
這段代碼做了兩個事情:
監聽了task的添加流程,在'preReleaseBuild'和'preDebugBuild'的execute階段添加了代碼邏輯。
在'preReleaseBuild'和'preDebugBuild'執行完後,執行lib模塊中的onRelease或者onDebug方法。
綜上,實現了在android項目中對純Java module使用release/debug build並啓用proguard。
注:本文默認讀者具有gradle基礎知識。
注:附Java Plugin依賴圖: