Android资源文件的大小限制及解决方案

 

一个应用调用自定义字体,在部分机器上无法正确使用自定义的字体。有些甚至是同一款机器,所以分辨率之类的因素可以排除。最后发现是版本原因,系统版本低于Android 2.3的机器上通通出问题,2.3以上的正常。但代码都是针对Android 1.6的API的啊,别说2.3,连2.0的API都没用到。查询Android 2.3的highlights,看到下面这句话:

There is no longer a limit on the size of compressed .apk assets that can be read.

从2.3开始,对可读取的压缩后的.apk中的资源的大小不再有限制。这意味着在2.3之前都是有限制的。翻看LogCat中的记录,会有如下的信息:

Data exceeds UNCOMPRESSE_DATA_MAX ( XXXXXXXXXX vs 1048576)

其中XXXXXXX是一个大于1048576的值。也就是说,在压缩打包到APK文件中的资源文件,在解压后的大小不能超过1MB。否则在Android 2.3之前的系统中就无法正确读取该资源文件。而我们用的中文字体文件的大小显然超过了1MB,失败的原因就在这里。怎么办?

中文社区中对此有这样的一篇广为转载的文章,《Asset限制文件大小UNCOMPRESS_DATA_MAX为1MB》,其中的结论是:

目前解决的方法只有将文件放入到sdcard,但这样除了microsd的读取IO效率和耗电量解决不是很好,同时sd卡移除时可能存在问题,解决的方法如果数据量大的化通过sqlite是一种解决方法,同时openFileOutput方式读取也是不错的选择,看来android操作系统中最安全控制的严格,但犯了一个不小的错误。

字体文件显然没办法塞到sqlite里面,要求所有的用户都有SD卡也不太友好。又翻到一篇相关的英文文章,Dealing with Asset Compression in Android Apps。从中可以看出,Android 2.3之前的版本只对压缩过的资源文件的原始大小做了限制,这种限制可能是出于计算性能的考虑。对于没有压缩的文件,是没有大小限制的。哪些文件不会压缩?图片、音频、视频,包括这些后缀:

“.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的源代码中可以知道,Android的打包工具是通过文件的后缀名来判断文件是否需要压缩的。如果文件的后缀名是上面这些后缀,文件就不会被压缩,大小也就没有限制;如果文件的后缀不是上面这些,就对其进行压缩,并且在Android 2.2上有1MB的大小限制。字体文件后缀通常是.ttf,属于要被压缩的,在Android 2.2之前的版本中就有了体积限制。不过,看到这里,解决方案也出来了,把字体文件的.ttf后缀改成上述任意一个后缀,然后修改相应的代码就可以。好猥琐的解决方案啊~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值