Sean's Note: 9月 2015

2015年9月14日 星期一

Can I package Android resources to jar?

當然我們可以不用 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" 的主要功能有三個:
  1. 引用 myLib.jar。
  2. 存放 myLib.jar 所需的 resources。
  3. 讓 main project 引用。
這樣一來開發 main project 的人,只要 import "myLibWrapper",
並設定 dependencies 的關係就好,雖然迂迴了一下,但是簡單又乾淨。
詳細如圖3 的流程所示。
(當然弄成 aar 更簡單,不過這又是另一個議題了)

圖3.