Android 多模組打包混淆
最近有個 sdk 的專案使用了多模組(Module)開發,然後提供 jar 包給接入者使用,要求大部分類是混淆過的,保留幾個介面,
Android Studio 能夠匯出 aar 檔案,對於匯出 jar 卻要大費一番周折。我在網上找到這個比較靠譜的解決方案: [Android Studio分模組自動化構建實戰](Android Studio分模組自動化構建實戰),它通過 shell 指令碼執行 Java 打包命令,解壓各個模組的 class 檔案然後合成一個完整的 class 檔案。
匯出 jar 後,下一步就是進行混淆了。根據網上的資料,我自己寫了一個 gradle task: proguardJar,專門用來做混淆。遇到的坑就是下面的 libraryjars,加上該引數會忽略 jar 包引用的 Java 和 Android API,保證混淆繼續進行,要不然就會出現類似 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 // 混淆協議 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!") }
另外,混淆規則需要加上 -dontshrink,表示不壓縮輸入的類檔案,比如不會移除無用的方法、域或者類。這樣做的目的是保留對外的介面,但是帶來的問題是 jar 包體積的增大,所以在編碼中就要做好優化工作。
【附錄】
資料圖
需要資料的朋友可以加入Android架構交流QQ群聊:513088520
點選連結加入群聊【Android移動架構總群】: 加入群聊
獲取免費學習視訊,學習大綱另外還有像高階UI、效能優化、架構師課程、NDK、混合式開發(ReactNative+Weex)等Android高階開發資料免費分享。