
為了引出了本片文章的主題,我專門去找了一張資源圖片
都說(shuō)“巧婦難為無(wú)米之炊”,不錯(cuò)的,對(duì)于我們做Android開(kāi)發(fā)的筒靴們是一樣的,要想頁(yè)面效果搞的花里胡哨的,那你不得給我們一點(diǎn)資源(一張圖片,一個(gè)視頻,一段音頻,一個(gè)字體文件,一個(gè)html文件)。有時(shí)候這些資源比較固定不更換的,我們往往會(huì)把它直接放在整個(gè)項(xiàng)目中,然后打包進(jìn)apk,程序運(yùn)行的時(shí)候就直接可以使用了。
assets目錄 res目錄
在Android中,我們常常提到資源文件一般只要分為兩種:
assets目錄 的文件,被稱為原生文件,在apk的編譯打包流程不會(huì)生成資源ID,也就是說(shuō)我們無(wú)法通過(guò)R.xxx.xxx的方式去訪問(wèn),這個(gè)目錄下的文件在被打包生成apk的時(shí)候不會(huì)進(jìn)行壓縮。
res目錄 的文件,這類文件在打包生成apk的時(shí)候,直接通過(guò)aapt(資源文件打包工具)打包res資源文件,生成R.java、resources.arsc和res文件,我們可以直接通過(guò)R.xxx.xxx的方式訪問(wèn)到資源文件。(注意:raw下的文件會(huì)被原封不動(dòng)的打包到apk中)

assets目錄 res/raw目錄
先說(shuō)說(shuō)raw目錄吧。它是創(chuàng)建在res文件下的一個(gè)資源文件(常見(jiàn)的會(huì)放一些視頻/音頻文件等等)。它雖然是res的子目錄但是它里面的文件在打包生成apk的時(shí)候不會(huì)像其他res文件一樣,對(duì)資源文件進(jìn)行壓縮,這一點(diǎn)和assets文件相似。
下面就再說(shuō)一下assets目錄 和 res/raw目錄的異同
相同點(diǎn)
assets和res/raw工程目錄下都可以放一些小于1M的文件(2.3版本以前的要求,現(xiàn)在無(wú)限制)兩個(gè)文件夾下的文件都會(huì)被原封不動(dòng)的打包到APK中應(yīng)用使用。而不會(huì)像其它資源文件那樣被編譯成二進(jìn)制的形式。(不管放在哪個(gè)文件夾下apk的大小是不變的)
不同點(diǎn)
- res/raw中的文件會(huì)被映射到R.java文件中,訪問(wèn)的時(shí)候直接使用資源ID即R.id.xxx;assets文件夾下的文件不會(huì)被映射到R.java中,訪問(wèn)的時(shí)候需要AssetManager類。
- res/raw不可以有目錄結(jié)構(gòu),而assets則可以有目錄結(jié)構(gòu),也就是assets目錄下可以再建立文件夾
Since raw is a subfolder of Resources (res), Android will >automatically generate an ID for any file located inside it. This ID >is then stored an the R class that will act as a reference to a file, >meaning it can be easily accessed from other Android classes >and methods and even in Android XML files. Using the >automatically generated ID is the fastest way to have access to >a file in Android.
The Assets folder is an “appendix” directory. The R class does not generate IDs for the files placed there, so its less compatible with some Android classes and methods. Also, it’s much slower to access a file inside it, since you will need to get a handle to it based on a String. However some operations are more easily done by placing files in this folder, like copying a database file to the system’s memory. There’s no (easy) way to create an Android XML reference to files inside the Assets folder.
raw是res的子目錄,Android會(huì)自動(dòng)的為這個(gè)目錄中的所有資源文件生成一個(gè)ID并映射到R.java文件中,作為一個(gè)文件的引用。這樣我們就可以很容易的訪問(wèn)到它了,在Android XML文件中可以用@raw/xxx的形式引用。mp3,mp4等文件適合放在這個(gè)目錄下。
assets文件更像是一個(gè)附錄類型的目錄,Android不會(huì)為這個(gè)目錄中的資源文件創(chuàng)建ID。同時(shí),訪問(wèn)的時(shí)候需要一個(gè)字符串路徑來(lái)獲取這個(gè)目錄下的文件描述,所以訪問(wèn)的速度會(huì)更慢。而且我們只能通過(guò)AssetManager這個(gè)統(tǒng)一管理類來(lái)訪問(wèn)這些文件。數(shù)據(jù)庫(kù)、字體文件、json文件、html文件適合放在這里。