Android 使用gradle打包Assets目錄的案例

現在提起Android開發工具,大多人第一個想到的肯定是Android Studio。谷歌專門為Android開發者推出的這款IDE,以其強大的功能迅速擊敗的老牌的eclipse。

與此同時,eclipse依賴的ant,也逐漸被更加強大更加靈活的gradle所取代,成為Android開發領域首選構建工具。

強大並不意味著沒有坑。在使用gradle的過程中,特別是打包assets目錄 下的一些資源時,筆者真沒想到你是這樣的assets,遇到瞭若幹問題,在此處做一個整理。

如何創建assets目錄

老實說,筆者在這個地方真的吃過大虧。在eclipse時代,筆者創建assets目錄時,習慣性地操作是“右鍵 -> new -> Directory”,然後隻需將文件夾命名為“assets”即可。

到瞭Studio下,還是同樣的操作,結果卻有可能導致打包的apk中assets資源丟失瞭!!!所以習慣一定要改,Android Studio下assets目錄正確的創建姿勢是:

1 在你的src或者main目錄上右鍵new;

2 在Folder菜單上找到Assets Folder,確定即可。

有個問題提一下,如果此時你的視圖是Project,新創建的assets目錄因為是空的,部分情況下會看不見(很詭異),這時你隻需要將視圖切換為Android,就能正常看見瞭。

assets目錄無法打包進gradle

如果你的某些資源放置在assets目錄下,本地編譯能夠正常訪問,構建打包卻死活讀取不到的時候,建議你把打包生成的apk拿出來,將後綴改成zip,然後解壓縮如下圖所示,確定一下你的assets目錄下的資源是否真的被打包進去瞭。提醒一下,不要試圖修改裡面的內容,都是驗過簽的。

如果沒有,原因可能是你在創建assets目錄時,並沒有按照上面的流程,而且gradle的構建腳本裡面也沒有指明assets資源的路徑,因此直接導致gradle懵逼。

解決辦法有兩個:

1 按照上面的流程重新創建assets目錄;

2 在gradle裡面android括號內,指定assets的路徑即可,如

sourceSets {
 main {
  assets.srcDirs = ['src/main/assets']
 }
}

當然,需要根據你的具體情況來看,如果你為不同版本準備瞭不同的assets資源,就要添加在對應的flavors中。

assets目錄下的同名文件

因為項目的需要,筆者要在assets目錄下為不同的版本(360和demo)提供不同的資源。但是資源的名稱也都是相同的。

筆者最初采取瞭在assets下創建文件夾對內容加以分類,同時配置不同Flavors的做法,如下圖所示。

本以為萬事無虞,結果卻讓人很無奈。

測試發現,這種方式並不奏效——assets目錄仍然在main目錄下,默認的仍然是一個文件夾(360或者demo)下的內容作為最終打包的資源,並沒有根據版本區分開來。

後來采取的做法是在每一種版本(即每一種flavors)都創建一個assets目錄,同時更改sourceSets,為每個Flavors提供不同配置,如下圖所示,通過這樣來區分不同的資源依賴,最後也證實可行。

總結一下

1 assets目錄一定要按照正確的流程創建。如果不是正確的流程,一定要在gradle中指明它的路徑;

2 assets目錄的位置不受限制,可以隨便指定,關鍵是gradles裡面的路徑;

3 src下默認的main目錄是所有flavors共有的資源。每個flavors與main的資源隻能夠合並,不能替換;

4 為不同的falvors提供不同的assets資源時,assets資源一定要創建在每個flavors下;

5 配置資源的地方是sourceSets,在sourceSets中區分不同的flavors;而不是在productFlavors下區分不同的sourceSets。

補充:關於AndroidStudio assets目錄的一些坑

1.新建assets目錄

2.在Activity中加載assets目錄中的圖片資源到bitmap

InputStream inputStream= null;
try {
 inputStream = getAssets().open("timg.jpg");
} catch (IOException e) {
 e.printStackTrace();
}
bitmap= BitmapFactory.decodeStream(inputStream);

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。