最近有個 sdk 的項目使用了多模塊(Module)開發(fā)伴挚,然后提供 jar 包給接入者使用,要求大部分類是混淆過的灾炭,保留幾個接口茎芋,
Android Studio 能夠?qū)С?aar 文件,對于導(dǎo)出 jar 卻要大費一番周折蜈出。我在網(wǎng)上找到這個比較靠譜的解決方案: [Android Studio分模塊自動化構(gòu)建實戰(zhàn)](Android Studio分模塊自動化構(gòu)建實戰(zhàn))田弥,它通過 shell 腳本執(zhí)行 Java 打包命令,解壓各個模塊的 class 文件然后合成一個完整的 class 文件铡原。
導(dǎo)出 jar 后偷厦,下一步就是進(jìn)行混淆了。根據(jù)網(wǎng)上的資料燕刻,我自己寫了一個 gradle task: proguardJar只泼,專門用來做混淆。遇到的坑就是下面的 libraryjars卵洗,加上該參數(shù)會忽略 jar 包引用的 Java 和 Android API请唱,保證混淆繼續(xù)進(jìn)行,要不然就會出現(xiàn)類似 can't find referenced class java.lang.String
這樣的報錯过蹂。
// 混淆 jar 包
task proguardJar(type: ProGuardTask) {
def properties = new Properties()
def file = file("../../local.properties")
properties.load(new FileInputStream(file))
def sdkDir = properties.getProperty("sdk.dir")
// 輸出路徑
def path = "../../output/${project.ext.SDK_NAME}.jar"
delete path
// 未混淆的jar路徑
injars "../../output/unminified/${project.ext.SDK_PRODUCT}_sdk_unminified.jar"
// 混淆后的jar輸出路徑
outjars path
// 混淆協(xié)議
configuration '../../proguard-rules.pro'
// 忽略 Java 和 Android API
libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
libraryjars "${System.getProperty('java.home')}/lib/jce.jar"
libraryjars "${sdkDir}/platforms/android-${rootProject.ext.pyramidneyCompileSdkVersion}/android.jar"
println("proguardJar done!")
}
另外十绑,混淆規(guī)則需要加上 -dontshrink
,表示不壓縮輸入的類文件榴啸,比如不會移除無用的方法孽惰、域或者類晚岭。這樣做的目的是保留對外的接口鸥印,但是帶來的問題是 jar 包體積的增大,所以在編碼中就要做好優(yōu)化工作坦报。