Android studio 將 Module 打包成 Jar 包

1、默認自動生成的 jar 包

  衆所周知 android studio 會在library所依賴的 app運行 或 build 以後自動生成 jar 包,路徑爲 Module根目錄/build/intermediates/bundles/debug or release/classes.jar,這樣生成的jar是能夠用的,但不是咱們能夠控制的,因此咱們須要經過其餘方式來解決這個問題。android

  注意:api

  若發現 Android Studio 項目 bundle 文件夾下沒有 release 目錄,多是沒有將 module 添加到主 module 依賴中。app

  方式1:主module右鍵 --> 倒數第二個Open Module Setting--> 上面最後一個選項Dependencies-->右邊綠色加號-->Module dependency......而後肯定post

  方式2:主Module的gradle的dependencies(平時添加第三方庫的地方)中加上 compile project(':lib-zxing')gradle

2、自定義生成 jar 包

  首先,須要將待打包 module 項目中的 build.gradld 文件進行修改,以下圖: 
  
ui

  其次,在 build.gradle 文件中加入以下代碼: 
spa

  方式一:命令行

複製代碼
def _BASENAME = "TestJar";
def _VERSION = "_V1.0";
def _DestinationPath = "build"; //生成jar包的位置
def zipFile = file('build/intermediates/bundles/default/classes.jar'); //待打包文件位置

task deleteBuild(type:Delete){
    delete _DestinationPath + _BASENAME + _VERSION + ".jar"
}

task makeJar(type:Jar){
    from zipTree(zipFile)
    from fileTree(dir:'src/main',includes:['assets/**']) //將assets目錄打入jar包  
    baseName = _BASENAME + _VERSION
    destinationDir = file(_DestinationPath)
}

makeJar.dependsOn(deleteBuild, build)
複製代碼

  方式二:打包的 jar 只有源代碼的.class 文件,不包含資源文件debug

複製代碼
task makeJar(type: Copy) {
    delete 'build/TestJar_V1.0.jar' //刪除以前的舊jar包
    from('build/intermediates/bundles/default/') //從這個目錄下取出默認jar包
    into('build/') //將jar包輸出到指定目錄下
    include('classes.jar')
    rename('classes.jar', 'TestJar_V1.0.jar') //自定義jar包的名字
}
makeJar.dependsOn(build)
複製代碼

  方式三:3d

複製代碼
task clearJar(type: Delete) {
    delete 'build/TestJar_V1.0.jar' //jar包的名字,隨便命名 
}
task makeJar(type:org.gradle.api.tasks.bundling.Jar) {
    //指定生成的jar名 
    baseName 'TestJar_V1.0'
    //從哪裏打包class文件 
    from('build/intermediates/bundles/default/')
    //打包到jar後的目錄結構 
    into('build/')
    //去掉不須要打包的目錄和文件 
    exclude('test/', 'BuildConfig.class', 'R.class')
    //去掉R開頭的文件  
    exclude{it.name.startsWith('R');}
}
makeJar.dependsOn(clearJar, build)
複製代碼

  注意:

  以上配置信息要與 android {…….} 配置的腳本成平級關係。

  其中 _BASENAME = "TestJar"; _VERSION = "_V1.0"; 是定義生成 jar 包的名字爲TestJar_V1.0.jar。

  配置好之後就能夠編譯jar包了,有兩種方式:

   方式 A :點擊 Android Studio 右側(通常在這個位置)的 Gradle 面板,在項目或者該類庫的目錄中找到 Tasks -> other -> makeJar 命令,雙擊這個makeJar以後等一會就會編譯好jar包。
  
  打包成功後:在配置的指定目錄下生成jar包
     
 
   方式 B :經過 cmd 命令行,在項目根目錄下,執行 gradlew makeJar 命令,看到編譯完成的信息之後就OK了,也能生成同樣的jar包,和直接使用①中的方式是等價的。
  注意:使用此方式前要配置好 gradle 的「 環境變量 」,不然直接在項目根目錄下找不到這個命令。使用 cmd 比較費勁,不推薦。
 
   方式 C :在 Android Studio 終端窗口中輸入 gradlew makeJar 命令。
  
  打包成功以下圖:
  
  打包成功後:在配置的指定目錄下生成jar包
  
 
  注意:
  問題1:
       

  對於以上配置 form 默認 jar 包部分,在用目錄是 from('build/intermediates/bundles/release/') ,注意粗體部分,最初我也是按照這個目錄寫的,確實沒問題。但後來,也就是Android Studio 更新到2.3之後,發現這個目錄沒有了,取而代之的是 default 和 debug 目錄,debug目錄以前也是有的,沒有變化,只是原來的release目錄被如今的default目錄代替了。這致使我後來生成jar包的時候始終沒有找到jar包,報上圖所示錯誤。

  緣由就是沒有了 release 目錄,找不到默認的 classes.jar 文件,因此也就沒有生成自定義名字的jar包,改成 default 或者 debug 目錄之後就能正常生成jar包了,要注意這點變化。

  問題2

Execution failed for task ':mylibrary:lint'.
> Lint found errors in the project; aborting build.

  解決在 build.gradle 文件中,加入下面的代碼塊(注意代碼塊所在的位置),從新執行 gradlew makeJar 命令。

android {
    lintOptions {
        abortOnError false
    }
    ...
}

  最後注意:

  將被嵌入的應用打包成 jar 包,可是這樣的方式有侷限性,沒法將被嵌入的應用所使用的資源性文件一塊兒打包。下面介紹 aar 打包方式。

3、直接使用 aar 包

  將被嵌入的應用打包成 aar 包,這也是 Android Studio 的一種新特性,能夠將應用所使用的資源性文件一塊兒打包。編譯便可打包生成 aar 包,並且也不用擔憂漏掉資源問題。

  若是Project 中 Module 是一個應用,則在 Module 的 build.gradle 文件中定義屬性爲:apply plugin: 'com.android.application';而若是 Mudule 是一個被引用的依賴 lib 庫的話,則在 Module 的 build.gradle 文件中定義屬性爲: apply plugin: 'com.android.library;因此當咱們將應用 Module 打包出 aar 文件的時候,須要修改類型屬性。正常狀況下,直接從新編譯 Module,生成的 aar 包在 Module 根目錄的/build/outputs/aar/,以下圖:

  
  下面介紹將 aar 包添加到其餘 Android 工程:
  首先,將 aar 包複製到 libs 目錄下
  其次,配置build.gradle文件:

  A 在 android 中加入,以下:

repositories {  
    flatDir {  
        dirs 'libs'  
    }  
}  

  B 在 dependencies 中加入 compile(name:lib-zxing-release', ext:'aar')

  完整 build.gradle 文件以下:

複製代碼
apply plugin: 'com.android.application'  
  
android {  
    ...
    repositories {  
        flatDir {  
            dirs 'libs'  
        }  
    }  
}  
  
dependencies {  
    ...
    compile(name:'lib-zxing-release', ext:'aar')  
}  
複製代碼

  最後,從新編譯 Rebuild 的如下工程。

相關文章
相關標籤/搜索