Android Library項目中如果使用Android Gradle plugin打aar包,通過maven依賴的庫,或者是local依賴的aar都不會包含在生成的aar包裡,如果項目是釋出一個SDK,為了友善開發者使用,我們傾向于生成一個包含所有依賴庫以及.so等檔案的aar包。
通過反複研究和測試,以下Gradle腳本能滿足需求,如果需要對代碼運作ProGuard混淆,則需要使用Gradle 2.1
方法是為項目增加一個sub project(如
pkg_project
)專門用于打包,該項目中
build.gradle
内容如下:
- apply plugin: 'java'
- version = 1.0
-
- buildscript {
- repositories {
- mavenCentral()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:19.1.0'
- }
- }
-
- repositories {
- mavenCentral()
- }
-
- dependencies {
- compile project(':<your_library_project>') //此處填寫需要打包的Android Library Project name
- }
-
- task sync_jars() << {
- //把所有依賴的.jar庫都拷貝到build/aar/libs下
- copy {
- into buildDir.getPath() +"/aar/libs"
- from configurations.compile.findAll {
- it.getName().endsWith(".jar")
- }
- }
- }
-
- task sync_aars(dependsOn:':<your_library_project>:assembleRelease') << {
- //把所有依賴的.aar庫裡包含的classes.jar都拷貝到build/aar/libs下,并重命名以不被覆寫
- def jar_name
- def aar_path
- def dest_dir = buildDir.getPath()+"/aar"
- configurations.compile.findAll {
- it.getName().endsWith(".aar")
- }.collect {
- aar_path = it.getPath()
- jar_name = "libs/"+it.getName().replace(".aar",".jar")
- copy {
- from zipTree(aar_path)
- into dest_dir
- include "**/*"
- rename 'classes.jar', jar_name
- }
- }
- }
-
- task fataar(dependsOn:[sync_aars, sync_jars]) << {
- task (obfuse_classes_jar, type: proguard.gradle.ProGuardTask) {
- //把build/aar/libs/*.jar混淆後生成build/aar/classes.jar
- configuration "proguard.cfg"
- injars buildDir.getPath()+"/aar/libs"
- outjars buildDir.getPath()+"/aar/classes.jar"
- libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
- libraryjars "${System.getProperty('java.home')}/Contents/Classes/classes.jar"
- libraryjars System.getenv("ANDROID_HOME")+"/platforms/android-19/android.jar"
- }.execute()
-
- task (gen_aar, type: Zip) {
- //把生成最終的aar包,注意libs目錄需要被排除
- def dest_dir = buildDir.getPath()+"/aar/"
- baseName = "mysdk-all"
- extension = "aar"
- destinationDir = file(buildDir.getPath())
- from dest_dir
- exclude "libs"
- }.execute()
- }
最後就可以使用
gradlew pkg_project:fataar
來打包了