Android 常见问题之Assets文件大小限制

Stella981
• 阅读 722

Android中有个很恶心的潜规则,就是当assets或是raw目录下单个压缩文件大小超过1024K之后,编译期appt会去强行处理此文件,使得我们运行期读取的时候会收到一个

This file can not be opened as a file descriptor; it is probably compressed

要解决这个问题可以将文件扩展名改为mp3或是wma这类的就OK了,具体细节可以参考:

Android Asset Packaging Tool(aapt)使用这个工具可打包所有数据 Image XML文件 任何资源文件.在生成APK时aapt选择性的压缩各种资源来节省设备空间,aapt使用后缀来决定哪个资源需要压缩,aapt源码定义一些不需要压缩的文件后缀。附aapt源码Package.cpp

以下是代码片段:
view plainprint? 
  /* these formats are already compressed, or don't compress well */ 
  static const char* kNoCompressExt[] = { 
  ".jpg", ".jpeg", ".png", ".gif", 
  ".wav", ".mp2", ".mp3", ".ogg", ".aac", 
  ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet", 
  ".rtttl", ".imy", ".xmf", ".mp4", ".m4a", 
  ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2", 
  ".amr", ".awb", ".wma", ".wmv" 
  };

在Android 2.3以前的任何压缩的资源的原始大小超过1M将不能从APK中读出,如果你使用AssetManager 或 Resources classes方法来获取InputStream,将抛出java.io.IOException的异常如下 DEBUG/asset(1123): Data exceeds UNCOMPRESS_DATA_MAX (20078432 vs 1048576);

  可以看到如果需要打包数据库的童鞋文件过大就需要注意了。

  解决方法如下:

  1.将你的资源文件后缀改成上面列出的后缀。

  2.在命令行上使用-0参数来指定不需要压缩的文件后缀。当你使用Eclipse内的ADT目前还不知道有什么方法可以传递-0参数给aapt。

  3.将你的资源文件分割成UNCOMPRESS_DATA_MAX(1M)以下的文件.

转自:http://webservices.ctocio.com.cn/429/12134429.shtml

点赞
收藏
评论区
推荐文章
Immortal Immortal
2年前
vue项目中使用element-ui实现excel表格上传
恰逢项目中要实现excel表格上传,度娘甚久,得此一文,留之。原文:https://blog.csdn.net/qq36718999/article/details/95387542需求vuecli搭建前端项目,并使用elementui实现本地excel表格上传。(1)限制上传文件只能是xls、xlsx格式;(2)限制上传文件大小不能超过2MB
Wesley13 Wesley13
2年前
SQL语句优化方式
_MYSQL性能_最大数据量抛开数据量和并发数,谈性能都是扯淡(扯的最疼的那种).Mysql没有限制单表最大记录数,它取决与操作系统对文件大小的限制文件系统单文件大小限制FAT32(采用32位二进制数(https://www.oschina.net/action/GoToLink?urlh
Stella981 Stella981
2年前
Android 项目中文件夹作用(res文件夹详细介绍)
1\.src:存放所有的\.Java(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Flib.csdn.net%2Fbase%2Fjavase)源程序。2\.gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID。3\.assets:可以存放
Stella981 Stella981
2年前
Android跨进程通信的四种方式
由于Android(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Flib.csdn.net%2Fbase%2Fandroid)系统中应用程序之间不能共享内存。因此,在不同应用程序之间进行数据(https://www.oschina.net/action/GoToLink?urlht
Stella981 Stella981
2年前
Hibernate中的merge使用详情解说
merge的作用是:新new一个对象,如果该对象设置了ID,则这个对象就当作游离态处理:当ID在数据库(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Flib.csdn.net%2Fbase%2Fmysql)中不能找到时,用update的话肯定会报异常,然而用merge的
Stella981 Stella981
2年前
Android如何判断当前手机是否正在播放音乐,并获取到正在播放的音乐的信息
我想实现如下的场景,判断当前Android(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Flib.csdn.net%2Fbase%2F15)手机上是否正在播放音乐,如果是,通过某个特定的手势,或者点击某个按键,将当前我正在听的音乐共享出去。第一步,就是判断当前是否有音乐正在播放。
Easter79 Easter79
2年前
SVNServer常用HOOK
svnserver可通过hook的方式 来自定义SVN行为控制,这里列几个常用的。1.限制单个提交文件大小不超过100MBPrecommithook@echooffsetlocalenabledelayedexpansionsetREPOS%1setTXN%2
Wesley13 Wesley13
2年前
Java properties文件中如何添加空格
Java(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Flib.csdn.net%2Fbase%2Fjavase)的properties文件中存储的是keyvalue格式的数据,例如:name1value1name2value2如果要在value1后面加上
Stella981 Stella981
2年前
SVNServer常用HOOK
svnserver可通过hook的方式 来自定义SVN行为控制,这里列几个常用的。1.限制单个提交文件大小不超过100MBPrecommithook@echooffsetlocalenabledelayedexpansionsetREPOS%1setTXN%2
Wesley13 Wesley13
2年前
MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)
摘要:MySQL(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Flib.csdn.net%2Fbase%2Fmysql)数据库(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Flib.csdn.net%2Fbase%2