深入解析Android類庫打包方法

2021-08-06 05:04:45 字數 1920 閱讀 5677

開發android應用的時候,對於可用於多個應用的公用的部分,或是打算發布給第三方進行應用整合的部分,要把這部分打包成類庫怎麼做呢?

眾所周知,android應用使用adt打包成apk,apk中包含了執行程式所需要的一切,包括:class、asset、res、androidmanifest.xml等。而對於類庫專案(library project),adt生成的jar包裡只包含編譯生成的class檔案,不包含res資源檔案,res只能在應用專案打包apk的時候打進apk包。

那考慮自行匯出jar如何? 針對類庫專案(library project)執行匯出(export),匯出時把res打上勾,這樣匯出的jar包裡確實包含了res下的資源檔案。很不幸,經反覆試驗得知,即使在jar包裡包含了res,目標應用專案在編譯時仍然不會對jar包裡的res進行處理,打成apk包時是不會包含jar裡的res的。這樣一來,通過在jar包裡包含res以供目標應用專案使用的路走不通了。

先做個總結:

1.android類庫(library project)能支援打包成jar,並且jar裡的位元組碼類檔案能夠成功被打進目標應用專案的apk包裡。如果類庫中不包含activity等需要介面資源的內容,或者在類庫中手工讀取資源,而不使用adt的從res下讀取資源的機制,這個類庫jar的使用完全沒問題,不需特別關注。

2.res下的資源檔案打進jar包沒有意義,目標應用專案在打apk包時不會從jar中讀取res打進apk。猜測不支援從jar中讀res的可能的原因是擔心資源名與目標應用專案中重複(純屬個人猜測,作不得準)。

打不成jar包,直接把原始碼給出去又不合適,怎麼辦?

下面是乙個辦法:

1.開發類庫專案(library project,即project -> properties -> android -> check 「is library」),正常編譯,生成jar包(在bin下,jar中只包含src下的類生成的位元組碼,不包含gen下自動生成的類,也不包含res)。假設這個類庫叫做mylib,生成的jar名稱為mylib.jar。

2.新建乙個類庫專案(library project,同樣設定 project -> properties -> android -> check 「is library」 ),假設這個類庫叫做mylibdeploy,設定其命名空間與mylib相同。在mylibdeploy下新建乙個libs目錄,把mylib.jar匯入到libs目錄下。再將mylib專案下的assets、res目錄複製到mylibdeploy下。

3.開發目標應用(常規android project,不勾選「is library」),在這個目標應用專案中設定對mylibdeploy的引用。引用方法如下: 開啟android應用設定 project -> properties -> android , 點「add…」按鈕選擇mylibdeploy。經如此設定後,在目標應用專案中就可以引用mylib中的類了。最後編譯、匯出成apk,這個apk裡會包含mylibdeploy下的res,也會包含相應的gen下自動生成的類編譯後的檔案。

對於需要向外發布的類庫,將mylibdeploy直接發出。可以將其壓縮打包成zip或者其它的什麼格式,只要使用方能解開就行。使用方(目標應用開發方)按照第3步的方式引用mylibdeploy,就能正常使用mylib.jar,正常打包apk。

當然,在打包jar(上例中的mylib.jar)時,可以根據需要對其進行部分混淆生成不易被反編譯的jar包。

這種發布包的辦法並不完美,期待adt的改進,未來也許可以直接發布jar。

參考:

managing projects from eclipse with adt

android developer tools

how to export the project as a jar file

how to create android library in eclipse?

android類庫常用型別解析

android類庫常用型別解析 在android類庫中,各種包寫成android.的方式,重要包的描述如下所示 android.content 包含各種的對裝置上的資料進行訪問和發布的類 android.database 通過內容提供者瀏覽和運算元據庫 android.graphics 底層的圖形庫...

jbpm binding類深入解析

jbpm 的 binding 深入解析 jbpm 實現了自己的 ioc機制,其中重要的成員就是 binding 這些類了!流程引擎初始化都需要載入那些 binding 類?我們可以在 jbpm.wire.bindings.xml 中定義流程引擎初始化需要載入的 binding 類。當然我們也可以設計...

Android中AsyncTask類解析

asynctask暫且翻譯為非同步任務 asynctask使ui執行緒的使用變得恰當和簡單。這個類允許在後台執行操作並且在ui執行緒呈現處理的結果,無需操作執行緒。乙個非同步任務是指在後台執行的執行緒,其執行結果在ui執行緒呈現。乙個非同步任務由3個泛型和4個步驟定義完成。用法 乙個asynctas...