您的位置:首页 > 移动开发 > Android开发

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

2013-01-06 13:30 387 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: