當然我們可以不用 jar,讓其他人直接 import 我們的 library project,
可是這樣程式碼不就被看光光了嗎?
但當我們的 library 有自己的 resources,而且想 build 出 jar 檔給其他人用時該怎麼辦?
我可以把 resources 也包進去嗎?
The answer is No!
但有其他替代的方法來解決這樣的問題。
畫了幾張圖來說明:
(一樣一開始準備一個要 build 出 jar 檔的 "myLib" project)
問題在於 Android 的每個 project 會產生自己的 R 檔,
在編譯的時候會自動把程式碼裡的 R.xxx 轉換成 id,
但 "myLib" 引用到的 id 不在於 jar 檔裡也不在於 apk 檔裡,
所以得把 "myLib" 用到的 resources 給搬到 "myAppTestbed" 主要應用程式的 project,
這樣 apk 檔裡就會有這個 id,然後再動態的去引用這些 resources。
Android 提供了一個 API Context.getResources().getIdentifier()
可以在 runtime 的時候取得 resources。
流程如圖1 所示。
![]() |
圖1. |
![]() |
圖2. |
但是把 resources 都搬到 main project 也不是很好,一來開發 main project 的人
得手動搬一次,二來弄髒了 main project 的 resource folder。
所以我們可以參考 google-play-services_lib 的作法,
再另建一個 lib project "myLibWrapper"(名字可能取的不太好,大家可以自行決定),
這個 "myLibWrapper" 的主要功能有三個:
- 引用 myLib.jar。
- 存放 myLib.jar 所需的 resources。
- 讓 main project 引用。
這樣一來開發 main project 的人,只要 import "myLibWrapper",
並設定 dependencies 的關係就好,雖然迂迴了一下,但是簡單又乾淨。
詳細如圖3 的流程所示。
(當然弄成 aar 更簡單,不過這又是另一個議題了)
(當然弄成 aar 更簡單,不過這又是另一個議題了)
![]() |
圖3. |