专栏首页Eureka伽罗的技术时光轴Android 常见问题之Assets文件大小限制

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 怎样设置Android Studio的工作空间编码

    我们在使用Android Studio编写Android项目的时候,会发现在运行的时候,手机上看到的中文字符是乱码,这是怎么回事呢?这是因为Android St...

    战神伽罗
  • [转]Android应用安装包apk文件的反编译与重编译、重签名

    背景介绍:最近在做Robotium自动化测试,使用到solo.takeScreenshot()函数以在测试过程中截图,但此函数需要被测试APP具有<uses-p...

    战神伽罗
  • Minifilter的动态安装、加载及卸载

    MINIFILTER框架的文件系统过滤驱动,无法使用的CreateService和OpenService进行动态加载。 看了一下,使用Inf文件安装Minif...

    战神伽罗
  • 怎样压缩PDF文件大小?简单的步骤是什么?

      PDF文件传输的时候经常因为PDF文件太大无法进行传输,遇到这样的情况我们应该怎样将其进行压缩呢?其实很简单,我们可以借助来进行实现,下面将PDF文件压缩的...

    用户4838056
  • Java开发环境系列:你真的会用eclipse吗?

    2、找到Eclipse IDE for Java EE Developers,根据自己的系统选择Windows 32-bit 还是 64-bit的,点击相应链接...

    架构师小跟班
  • 每天打开Eclipse就看到太阳下山,难道一上班就可以下班了?还是。。。

    每天打开Eclipse就看到太阳下山,难道一上班就可以下班了?还是。。。

    阿敏总司令
  • 六步更改Mysql最高权限密码【Linux平台】

    1、停止MySQL服务 执行: #service mysqld stop 2、跳过验证启动MySQL #/usr/bin/mysqld_safe –skip-...

    苦咖啡
  • centos7 部署Apache服务器

    Apache程序是目前拥有很高市场占有率的Web服务程序之一,其跨平台和安全性广泛被认可且拥有快速、可靠、简单的API扩展。 它的名字取自美国印第安人土著语,寓...

    拓荒者
  • 代码管理| 简易教程之Cocopods的安装和使用

    CocoaPods的工作主要是通过ProjectName.xcworkspace来组织的,在打开ProjectName.xcworkspace文件后,发现Xco...

    進无尽
  • 印度多家银行寻求利用人工智能提高业务能力

    据印度新闻网站livemint报道2016年6月报道,总部位于新加坡的星展银行在印度推出了一款带有内置人工智能(AI)的银行应用。在过去几个月,印度工业信贷投资...

    人工智能快报

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动