衆所周知,Android應用使用ADT打包成apk,apk中包含了運行程序所須要的一切,包括:class、asset、res、AndroidManifest.xml等。而對於類庫項目(library project),ADT生成的jar包裏只包含編譯生成的class文件,不包含res資源文件,res只能在應用項目打包apk的時候打進apk包。 html
那考慮自行導出jar如何? 針對類庫項目(library project)執行導出(export),導出時把res打上勾,這樣導出的jar包裏確實包含了res下的資源文件。很不幸,經反覆試驗得知,即便在jar包裏包含了res,目標應用項目在編譯時仍然不會對jar包裏的res進行處理,打成apk包時是不會包含jar裏的res的。這樣一來,經過在jar包裏包含res以供目標應用項目使用的路走不通了。 android
先作個總結: eclipse
1.android類庫(library project)能支持打包成jar,而且jar裏的字節碼類文件可以成功被打進目標應用項目的apk包裏。若是類庫中不包含activity等須要界面資源的內容,或者在類庫中手工讀取資源,而不使用ADT的從res下讀取資源的機制,這個類庫jar的使用徹底沒問題,不需特別關注。 ide
2.res下的資源文件打進jar包沒有意義,目標應用項目在打apk包時不會從jar中讀取res打進apk。猜想不支持從jar中讀res的可能的緣由是擔憂資源名與目標應用項目中重複(純屬我的猜想,做不得準)。 ui
打不成jar包,直接把源碼給出去又不合適,怎麼辦? google
下面是一個辦法: spa
1.開發類庫項目(library project,即Project -> Properties -> Android -> Check "Is Library"),正常編譯,生成jar包(在bin下,jar中只包含src下的類生成的字節碼,不包含gen下自動生成的類,也不包含res)。假設這個類庫叫作mylib,生成的jar名稱爲mylib.jar。 xml
2.新建一個類庫項目(library project,一樣設置 Project -> Properties -> Android -> Check "Is Library" ),假設這個類庫叫作mylibdeploy,設置其命名空間與mylib相同。在mylibdeploy下新建一個libs目錄,把mylib.jar導入到libs目錄下。再將mylib項目下的assets、res目錄複製到mylibdeploy下。 htm
3.開發目標應用(常規Android project,不勾選「Is Library」),在這個目標應用項目中設置對mylibdeploy的引用。引用方法以下: 打開android應用設置 Project -> Properties -> Android , 點「Add...」按鈕選擇mylibdeploy。經如此設置後,在目標應用項目中就能夠引用mylib中的類了。最後編譯、導出成apk,這個apk裏會包含mylibdeploy下的res,也會包含相應的gen下自動生成的類編譯後的文件。 ip
對於須要向外發佈的類庫,將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