2015/4/19

使用 Android Studio 開發 Web 程式 - 設定共用函式庫

設定共用函式庫

接續前一篇文章,雖然程式碼編寫已大致滿足工作上的需求,但是還有一項未來潛在性的需求要確認是否能夠達成。目前在開發設計上的主流是物件導向,物件導向的基本精神是提高重用性,也就是在設計時要讓程式碼儘可能地異中求同。所以在不斷地重構之下就會形成很多共用的 Class,共用的 Class 集合起來就會形成一個共用的 Package 來讓不同的程式碼專案來引用。

在 Android Studio 中專案檔結構的概念和 Eclipse 不太一樣,Eclipse 可以在同一個 Workspace 裡加入各種不同類型的程式碼專案,並透過 Working Set 來做專案檔的管理。在 Android Studio 裡,Project 可類比成 Eclipse 的 Workspace、Module 則可類比成 Eclipse 的 Project。Android Studio 的 Project 雖然有像是 Working Set 的 Group 功能,但是以 Android Studio 的專案結構來看,似乎不太適合套用 Eclipse 的 Workspace 模式來管理,比較偏向一個專案開啟一個 IDE 的 Instance。

如果要配合 Android Studio 程式碼專案結構的特性來架構程式,就會形成一個問題是:跨專案共用的函式庫目錄結構如何規劃?嚴格地來說,這不應該是一個問題,既然是要被跨專案使用,在被產品專案引用之前,就應該是處於經過測試、編譯好的狀態,需要使用的開發人員只要取得 Binary 檔就行了。

只是現實和理想畢竟有差距,在函式庫的初期大多是透過各個產品專案來累積經驗,利用重構的手法把可以共用的部份抽取出來單獨地放在函式庫的專案裡。在這種情況下,很多的設計思考是不週全的,所以需要在後續的產品專案中來發掘問題、持續地修正。

這時候,如果引用的是 Binary 檔案在偵錯上就不是那麼地直接,使用原始碼來開發會是一項可預見的需求。要引用原始碼勢必就會需要把不在目前 Android 專案目錄下的 Module 包含進來。

所以為了這個問題,在閱讀了 JetBrains 的說明文件後,試了以下幾個 Android Studio 上的功能:
  • 【File -> New -> Import Module...】
  • 【File -> Project Structure... -> Modules -> Add】
  • 【Gradle Tool Window -> Attach Gradle project】
但不知道是不是 IntelliJ IDEA 和 Gradle 專案整合性還不夠完整的關係,都會出現一些顯示不如預期或沒有反應的情況。唯一比較滿意的是透過【Project Structure】的 Menu 功能,在匯入 Module 時選擇已經有與 IDE 連結所產生的 *.iml 檔案,而不是選擇 Gradle 的 build.gradle。只可惜這項功能在 Android 類型的專案裡,【Project Structure】的畫面被調整過了,沒有辦法使用。

於是就退而求其次,改為手動編輯 Gradle Root Project 下的 settings.gradle。在 settings.gradle 裡增加以下內容,其中 utils 是 IDE 裡 Module 的名稱,必須要是一個 Gradle 的 Project。new File 裡的參數是 Gradle Project 所在的路徑,可以是絕對路徑,或是相對於 settings.gradle 所在的路徑。


以上的範例在實體的路徑中會呈現以下示範的結構:

WebProject
├── build.gradle
├── settings.gradle
├── web-module
│   ├── build.gradle
│   └── src
│       ├── main
│       └── test
├── common-module
│   ├── build.gradle
│   └── src
│       ├── main
│       └── test
shared
└── utils
    ├── build.gradle
    └── src
        ├── main
        └── test

修改好了之後,按下 Toolbar 上的 Sync Project with Gradle Files 圖示,在 Project Tool Window 就可以看到在原本樹狀結構第一階只有 Root Project 一項,更新後多了一個平行的 utils 項目。



接下來就可以新增 Gradle Project 間的依存關係,原本應該可以透過【Project Structure】的 Menu 功能來修改,但是在「以匯入方式產生的純 Web 專案」的情況下,無法將新增的 Depedencies 資訊反映回 Module 所對應的 build.gradle,應該是 IDE 的功能不正常造成的。這會使 CI 系統與開發時的建置結果出現不一致的情況,所以保險的作法還是手動編輯 build.gradle,要增加的內容可以參考以下的範例


如果要參照的函式庫只是使用在測試的目的上,則 compile 可以更換為 testCompile。

到目前為止,共用函式庫的問題已經有了一個明確的解決方案,接下來將會進入到下一個研究主題:偵錯


0 意見:

張貼留言