Android 项目中资源文件 -- asset 目录和 re
为了引出了本片文章的主题,我专门去找了一张资源图片
都说“巧妇难为无米之炊”,不错的,对于我们做Android开发的筒靴们是一样的,要想页面效果搞的花里胡哨的,那你不得给我们一点资源(一张图片,一个视频,一段音频,一个字体文件,一个html文件)。有时候这些资源比较固定不更换的,我们往往会把它直接放在整个项目中,然后打包进apk,程序运行的时候就直接可以使用了。
assets目录 res目录
在Android中,我们常常提到资源文件一般只要分为两种:
-
assets目录 的文件,被称为原生文件,在apk的编译打包流程不会生成资源ID,也就是说我们无法通过R.xxx.xxx的方式去访问,这个目录下的文件在被打包生成apk的时候不会进行压缩。
-
res目录 的文件,这类文件在打包生成apk的时候,直接通过aapt(资源文件打包工具)打包res资源文件,生成R.java、resources.arsc和res文件,我们可以直接通过R.xxx.xxx的方式访问到资源文件。(注意:raw下的文件会被原封不动的打包到apk中)
assets目录 res/raw目录
先说说raw目录吧。它是创建在res文件下的一个资源文件(常见的会放一些视频/音频文件等等)。它虽然是res的子目录但是它里面的文件在打包生成apk的时候不会像其他res文件一样,对资源文件进行压缩,这一点和assets文件相似。
下面就再说一下assets目录 和 res/raw目录的异同
相同点
assets和res/raw工程目录下都可以放一些小于1M的文件(2.3版本以前的要求,现在无限制)两个文件夹下的文件都会被原封不动的打包到APK中应用使用。而不会像其它资源文件那样被编译成二进制的形式。(不管放在哪个文件夹下apk的大小是不变的)
不同点
- res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.xxx;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
- res/raw不可以有目录结构,而assets则可以有目录结构,也就是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会自动的为这个目录中的所有资源文件生成一个ID并映射到R.java文件中,作为一个文件的引用。这样我们就可以很容易的访问到它了,在Android XML文件中可以用@raw/xxx的形式引用。mp3,mp4等文件适合放在这个目录下。
assets文件更像是一个附录类型的目录,Android不会为这个目录中的资源文件创建ID。同时,访问的时候需要一个字符串路径来获取这个目录下的文件描述,所以访问的速度会更慢。而且我们只能通过AssetManager这个统一管理类来访问这些文件。数据库、字体文件、json文件、html文件适合放在这里。