標籤:
開發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
http://developer.android.com/guide/developing/projects/projects-eclipse.html
Android Developer Tools
http://developer.android.com/guide/developing/tools/adt.html
How to export the project as a JAR file
http://groups.google.com/group/android-developers/browse_thread/thread/bc4b509765bd1956
How to create Android library in Eclipse?
http://groups.google.com/group/android-developers/browse_thread/thread/ce546a393cbb8bcf
Android類庫打包方法探究