原文地址:http://xhmj12.iteye.com/blog/1988025
在開發java工程時,一個大的項目可能分爲多個模塊,爲了實現模塊間的解耦和獨立,提高模塊的複用性,通常將該項目按模塊分爲多個java工程進行開發,最後通過jar包等工程依賴的方式實現系統集成,提高模塊的解耦和複用。
現在開發android項目,通過實踐開發的總結,發現這種方式特別有必要。比如,開發一個android端視頻應用,肯定有播放和下載模塊,之前放在一個工程裏,不斷添加新的功能,產品裏的每一個研發都不斷改動和添加功能,最後維護越來越難,bug越來越多,並相互推諉。這種方式能避免這種情況,此爲第一優點。
其二,下載模塊是很多app都會用到的模塊,獨立出來,並不斷完善和優化,可以變成一個通用組件,給不同的app使用,這就是提高了模塊和代碼的解耦,提高了複用性,提高了工作效率。現在很多公司都是這樣做的。
比如,下拉刷新,android沒有提供下拉刷新,很多項目爲了實現android的下拉刷新,爲集成開源的下拉刷新android項目。
那麼,如果實現這種設計和需求呢?即已經有一個 Android工程 A 。 現在的工程 B 中 需要集成A工程作爲一個模塊?
首先想到 B工程中能否直接 包含 A的apk文件, 發現不可行。然後又想着將其中一個項目(含有res資源)打包成jar包,另一個項目來引用。但是多次嘗試總是發現找不到資源。
這是因爲android的特殊性,android不僅有java文件還有res文件,需要研究如何將資源以及activity文件打包成jar文件供其他項目調用,最終多方嘗試,找到如下兩種方案。方案二是從android的官方文檔中找到的完美解決方案。方案二更優,方案一要求兩個工程包名最好一樣,而方案二不需要包名一致。
方法一:
1將A工程 的src文件夾下面所有的內容 導出 jar包。2保留 res下的 圖片,xml 等資源文件, 還有 AndroidManifest.xml 的內容。
3將A工程的jar包 導入到B工程中, res中的文件放到相應的文件夾下面。 AndroidManifest裏面的Activity複製到B的對應文件。
這個時候存在兩個工程 包名 不相同的情況, 容易出錯, 最好兩個工程保持一致。
這樣完成了 B 工程 對 A工程的集成。
方法二:(android的官方文檔)
將其中一個項目設置爲引用的庫,在另一個項目中添加這個庫引用。簡單點的做法是
在被引用項目A中的project-properties 中添加一行 android.library=true
在引用的項目B 中添加android.library.reference.1=../A
其中 1表示引用的包的序號,“../A”表示 引用的項目的路徑
具體做法如下:
第一步,把普通的android project設置成庫項目
庫項目也是一個標準的android項目,因此你先創建一個普通的android項目。 這個項目可以起任何的名稱,任何的包名,設置其他需要設置的字段等,如圖1所示。
接着把項目設置成庫項目,步驟如下
- 在Package Explorer中, 鼠標右鍵項目文件夾,點擊 Properties.
- 在Properties 窗口, 選擇"Android" ,Library屬性顯示在右下邊.
- 把"is Library" 單選框選擇上,再點擊 Apply.
- 點擊 OK 關閉Properties 窗口.
這時,這個項目就變成庫項目了。
當然,java項目也可以讓其變成一個庫項目,非常簡單,執行上面的四步。其他程序項目就可以引用庫項目了。
圖 1.使一個項目爲庫項目
創建manifest文件
一個庫項目的manifest文件也和標準的android應用程序一樣,聲明所有共享的組件。
比如APIDemo中的TicTacToeLib 這個例子,庫項目聲明瞭Activity GameActivity
:
<manifest> ... <application> ... <activity android:name="GameActivity" /> ... </application> </manifest>
第二步 引用庫項目
如果你開發的應用程序想要包括庫項目中的代碼和資源,非常簡單,引用步驟如下
- 在Package Explorer中, 鼠標右鍵項目文件夾,點擊 Properties.
- 在Properties 窗口, 選擇"Android" ,Library屬性顯示在右下邊.
- 點擊Add ,打開了Project Selection對話框.
- 從可用庫項目列表選擇一個項目,然後點擊 OK.
- 對話框關閉之後點擊 Apply (在Properties窗口).
- 點擊 OK 關閉Properties 窗口.
完成以上六步,Eclipse 會重建項目,把庫項目中的內容包含進去。 如圖2所示
圖 2.讓項目引用一個庫項目
如果你想增加多個庫項目的引用,使用up和down可以設置他們的相對的優先級和合並順序。工具在合併引用的庫的時候順序是從低優先級(列表的下面)到高優先級(列表的上面)。 如果不只一個庫定義了相同的資源ID,這個工具選擇資源時會選擇高優先級的資源。應用程序自身擁有最高的優先級,自身的資源zThe application itself has highest priority and its resources are always used in preference to identical resource IDs defined in libraries.
在menifest文件中聲明庫中的組件
在manifest文件中必須增加對在當前程序中用到的庫項目中的所有的組件。比如,你必須聲明任何用到的 <activity>, <service>, <receiver>, <provider>等,<permission>, <uses-library>,和其他類似的元素。
聲明庫項目中的組件時,必須使用包含包名的類全名。
在TicTacToeMain例子中,聲明庫Activity GameActivity :
<manifest> ... <application> ... <activity android:name="com.example.android.tictactoe.library.GameActivity" /> ... </application> </manifest>
需要了解更多關於androidManifest的信息請參閱 AndroidManifest.xml.
例子參見android-SDK下的\android-sdk\samples\android-x下的兩個例子工程:TicTacToeLib和TicTacToeMain。可以看見兩個工程下的project.properties文件。
庫工程TicTacToeLib的:
android.library=true
target=android-3
主工程TicTacToeMain的:
android.library.reference.1=../TicTacToeLib/
target=android-8
可以參考SDK下的自帶的例子,很好的學習庫::\android-sdk\samples\... 真是一個大的寶庫