Android Studio 使用 Gradle 打包 Jar
Android Studio 打 Jar 包一直是一個麻煩的事,按照網上現有的教程,打包一個混淆的 jar 需要完成下列步驟:
- 將 plugin 修改為library後 build 出 aar,再提取 aar 裡面的 classes.jar
- 使用 jarjar 等工具剔除多餘的 class
- 對第二步得到的 jar 進行混淆
無論哪一步,所做的工作量都不少。於我個人而言,相當麻煩,於是花了些時間研究了下 Gradle 打 Jar 包。
程式碼
廢話不多說,先上程式碼( 注 :只在 Gradle Android Plugin 1.2.3 測試過)
build.gradle
import com.android.build.gradle.AppPlugin import proguard.gradle.ProGuardTask apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "org.chaos.demo.jar" minSdkVersion 22 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } //dependsOn 可根據實際需要增加或更改 task buildJar(dependsOn: ['compileReleaseJava'], type: Jar) { appendix = "demo" baseName = "androidJar" version = "1.0.0" classifier = "release" //字尾名 extension = "jar" //最終的 Jar 包名,如果沒設定,預設為 [baseName]-[appendix]-[version]-[classifier].[extension] archiveName = "AndroidJarDemo.jar" //需打包的資源所在的路徑集 def srcClassDir = [project.buildDir.absolutePath + "/intermediates/classes/release"]; //初始化資源路徑集 from srcClassDir //去除路徑集下部分的資源 // exclude "org/chaos/demo/jar/MainActivity.class" // exclude "org/chaos/demo/jar/MainActivity/$*.class" exclude "org/chaos/demo/jar/BuildConfig.class" exclude "org/chaos/demo/jar/BuildConfig/$*.class" exclude "**/R.class" exclude "**/R/$*.class" //只匯入資源路徑集下的部分資源 include "org/chaos/demo/jar/**/*.class" //注: exclude include 支援可變長引數 } task proguardJar(dependsOn: ['buildJar'], type: ProGuardTask) { //Android 預設的 proguard 檔案 configuration android.getDefaultProguardFile('proguard-android.txt') //會根據該檔案對 Jar 進行混淆,注意:需要在 manifest 註冊的元件也要加入該檔案中 configuration 'proguard-rules.pro' String inJar = buildJar.archivePath.getAbsolutePath() //輸入 jar injars inJar //輸出 jar outjars inJar.substring(0, inJar.lastIndexOf('/')) + "/proguard-${buildJar.archiveName}" //設定不刪除未引用的資源(類,方法等) dontshrink AppPlugin appPlugin = getPlugins().findPlugin(AppPlugin) if (appPlugin != null) { List<String> runtimeJarList if (appPlugin.getMetaClass().getMetaMethod("getRuntimeJarList")) { runtimeJarList = appPlugin.getRuntimeJarList() } else if (android.getMetaClass().getMetaMethod("getBootClasspath")) { runtimeJarList = android.getBootClasspath() } else { runtimeJarList = appPlugin.getBootClasspath() } for (String runtimeJar : runtimeJarList) { //給 proguard 新增 runtime libraryjars(runtimeJar) } } }
為什麼已在 manifest 註冊的元件需要在 .pro 檔案宣告對應的混淆規則?
可能各位注意到 proguardJar task 的第二行註釋,在 apk 的打包過程中,aapt 會在解析 manifest 後生成一個用於不混淆 manifest 中已註冊的元件的規則檔案。然而我們的 task 只是依賴於compileReleaseJava(該 task 在執行 aapt 前), Gradle Android Plugin 中配置上述 aapt 生成的規則檔案的程式碼如下:
BasePlugin.groovy
protected File createProguardTasks(@NonNull BaseVariantData variantData, @Nullable BaseVariantData testedVariantData) { ...... // also the config file output by aapt proguardTask.configuration(variantData.processResourcesTask.proguardOutputFile) ...... }
礙於技術原因,獲取不到processResourcesTask的例項,所以目前只能先新增對應的元件到規則檔案中,還望知道怎麼獲取的朋友能夠分享下,謝謝。
使用方法
不需要混淆則執行命令
gradle buildJar 或 ./gradlew buildjar
需要混淆則執行
gradle proguardJar 或 ./gradlew proguardJar
總結
buildJar這部分相對比較簡單,很多內容網上都有教程。關鍵在於混淆,由於需要匯入 runtime 相關的 jar,雖說可以寫死 runtime 的路徑,但是團隊每個人都有自己的安裝習慣,路徑不一定一致,於是乎看原始碼翻了一段時間才找到相應的程式碼。至於想更多個性化的朋友,建議從原始碼入手。
相關文章
- Android Studio 使用Gradle多渠道打包AndroidGradle
- Android studio gradle 打包 那些事AndroidGradle
- Android Studio打包apk,aar,jar包AndroidAPKJAR
- gradle專案打包jarGradleJAR
- android studio 3.0 gradle 打包指令碼配置AndroidGradle指令碼
- Android Studio Gradle編譯報input jar file is specified twiceAndroidGradle編譯JAR
- 關於Android studio Gradle 實現多渠道打包AndroidGradle
- Android Studio使用離線GradleAndroidGradle
- gradle 打包aar去除引用的jar檔案GradleJAR
- Android使用Gradle實現多渠道打包AndroidGradle
- Android Studio使用gradle向Maven私服提交AndroidGradleMaven
- 使用 Gradle 管理你的 Android Studio 工程GradleAndroid
- 史上最詳細的Android Studio系列教程六--Gradle多渠道打包AndroidGradle
- jar打包JAR
- jar 打包JAR
- 【Android】Android Studio啟動配置gradleAndroidGradle
- android gradle 多渠道打包小結AndroidGradle
- Android多渠道打包工具Gradle外掛使用詳解AndroidGradle
- Android Studio NDK:三、打包SOAndroid
- Android Studio打包專案:APKAndroidAPK
- Gradle for Android系列之五 多渠道打包GradleAndroid
- Android Studio Gradle 常用配置詳解AndroidGradle
- android studio4.0初次gradle配置AndroidGradle
- Android Studio 3.0 上 Gradle 改動AndroidGradle
- Android Studio之Gradle和Gradle外掛的區別AndroidGradle
- jar檔案打包JAR
- gradle and studioGradle
- Android Studio--》Gradle Scripts配置說明AndroidGradle
- Android Studio使用新的Gradle構建工具配置NDK環境AndroidGradle
- Android Studio使用筆記(1)使用android studio時避免每次啟動都進行網路gradle sync的方法Android筆記Gradle
- 清除gradle依賴jarGradleJAR
- Android Studio gradle外掛版本和gradle版本對應關係AndroidGradle
- flutter常見問題【3】:Flutter 使用Android studio 打包生成apkFlutterAndroidAPK
- Android 詳解Gradle(3.1.4)實現多渠道打包AndroidGradle
- Gradle For Android(二) 多渠道打包與簽名配置GradleAndroid
- Gradle 實現 Android 多渠道定製化打包GradleAndroid
- Gradle實戰:Android多渠道打包方案彙總GradleAndroid
- Gradle for Android(三)多渠道打包、配置簽名資訊GradleAndroid