1. 程式人生 > >Android Studio 打包jar中包含另一個jar或多個jar時解決方案

Android Studio 打包jar中包含另一個jar或多個jar時解決方案

關於.jar檔案:

平時我們Android專案開發中經常會用到第三方的.jar檔案。

其實.jar檔案就是一個類似.zip檔案的壓縮包,裡面包含了一些原始碼,注意的是.jar不包含資原始檔(res、圖片等)

一、首先學習如何在Android studio中將android專案打成.jar檔案

1、在app目錄下的 build.gradle檔案中 新增如下紅色字型程式碼:

複製程式碼
dependencies {
compile fileTree(include: [‘*.jar’], dir: ‘libs’)
testCompile ‘junit:junit:4.12’
compile ‘com.android.support:appcompat-v7:23.3.0’
}

task makeJar(type: Copy) {
delete ‘build/libs/mysdk.jar’
from(‘build/intermediates/bundles/release/’)
into(‘build/libs/’)
include(‘classes.jar’)
rename (‘classes.jar’, ‘myjar.jar’)
}

makeJar.dependsOn(build)
複製程式碼
2、生成.jar檔案

在Android studio 的下面有 Terminal 選項,可以看到這個命令列的形式

我們在此 輸入 “gradle makeJar” 然後回車。等待片刻,變會生成 .jar檔案

該.jar檔案的地址為:

build/intermediates/bundles/release/

至此,我們就可以將生成的.jar放在別的專案中使用了。

二、深入探索

問題:

存在這麼一種情況:

我們要打包的android專案中已經引用了一個或多個第三方.jar檔案。那麼我們按上面的方法打成.jar檔案,在引入到別的專案中使用中,

會發現出現錯誤:

NoClassDefFoundError
定位到錯誤程式碼位置,會發現 生成.jar檔案的原始android專案中引用的第三方.jar檔案中的類找不到。

這裡可以猜測,使用上述方法將android專案打成.jar檔案的過程中,並沒有將android專案原來引用的第三方.jar檔案也一起打入到新的.jar檔案中。

可以測試一下,將android專案打成的.jar檔案解壓縮,會發現只有java程式碼相關檔案,而沒有原來android專案中引用的第三方.jar檔案

解決方案:

1、首先 問題產生的原因就是 生成.jar檔案的android專案原先引用的第三方.jar檔案沒有被打入到 新的.jar檔案中

  那麼我們想:怎麼在android專案打成.jar檔案的時候 順帶把 android專案引用的第三方.jar文化也一併打入到新的.jar檔案?

試了幾天,目前沒有找到解決辦法。。。此路不通

2、既然android專案原來引用的.jar檔案打不進 要生成的.jar檔案中去,我們是否可以手動的將android專案引用的第三方專案整合到android專案打成的.jar檔案中去?

  即 將android專案打成的.jar檔案和android專案自身引用的.jar檔案合併成一個.jar檔案

網上查詢了一番: 可以使用 ANT 工具實現 將兩個或多個.jar檔案合併成一個.jar檔案

Apache Ant是一個基於Java的生成工具。據最初的創始人James Duncan Davidson的介紹,這個工具的名稱是another neat tool(另一個整潔的工具)的首字母的縮寫。

實現步驟:

(1)、下載ANT,這個網上百度一堆

(2)、配置環境變數

(3)、檢測是否配置成功

點選 開始 -> 執行 -> 輸入cmd
開啟命令視窗,

輸入如下命令:ant
如果出現如下內容,說明安裝成功:
Buildfile: build.xml does not exist!
Build failed
注意:因為ant預設執行build.xml檔案,這個檔案需要我們建立。
如果不想命名為build.xml,執行時可以使用 ant -buildfile test.xml 命令指明要執行的構建檔案。

(4)、編輯xml檔案,命名隨意,這裡命名build.xml

開啟檔案編輯:




<?xml version="1.0" encoding="utf-8"?>
<project
    name="hosa"                            //不用改       ,注意:這裡的所有註釋在 build.xml檔案中 都不要有  是我為了給你們看解釋寫的
    basedir="H:\soft\jar"                  //生成的jar存放的位置,並且將要合併的所有.jar檔案也放在該目錄下
    default="makeSuperJar" >               //不用改

    <target
        name="makeSuperJar"                //不用改  
        description="description" >        //不用改

        <jar destfile="standingbanlanceFB.jar" >                  //合併後的jar檔案的名稱
         <zipfileset src="avoscloud-sdk-v3.14.5.jar" />           // <zipfileset >標籤的都是要參與合併的子jar包 
        <zipfileset src="fastjson.jar" />
        <zipfileset src="okhttp-2.6.0-leancloud.jar" />
         <zipfileset src="standingbanlance.jar" />
          <zipfileset src="okio-1.6.0-leancloud.jar" />
         </jar>
    </target>

</project>

(5)、命令列執行合併操作,輸入第一行命令,紅色部分是我們編輯的build.xml檔案的地址

(6)、開啟build.xml檔案中 basedir=”H:\soft\jar” 該目錄,即可看到合併後的jar檔案。

再補一下, 關於Jar包中新增資源或者圖片檔案時的解決辦法;
由於Android應用工程的資源ID R.xxx.xxx是在編譯時生成的,所以,在sdk的jar包中的程式碼中,不能用R.xxx.xxx訪問資原始檔,包含xml佈局檔案和圖片、字元。

解決方案:
1. 圖片:
把圖片檔案放入asset中,通過context.getAssets().open(fileName)讀取檔案為InputStream即可,再用BitmapFactory.decodeStream()轉換為Bitmap。
2. xml佈局檔案:
講xml佈局檔案放入res中(library和application工程中都),在sdk library的原始碼中,通過context.getResources().getIdentifier(“preferences”, “layout”, context.getPackageName());訪問佈局檔案的id,獲取id後,即可呼叫inflate等函式。

打包把assets和程式碼檔案放入jar中,在res/layout下的xml佈局檔案不要放入打包。