摘要

Android assets目录下资源文件超过1MB的问题。

由于要显示一些奇奇怪怪的日文字符,我们在应用里放了一个字库文件,譬如叫做jp.ttf,放在assets目录下打包。

开发、调试一切正常。可是突然发现,在Android 2.2的设备上,文字无法显示。折腾一番后发现了一些故事,也产生了更多疑问。

  1. 放在assets目录下的资源文件不会被映射到R.java,访问需要AssetManager类。不同于res/rawres/raw中的资源文件会被映射到R.java,访问时使用资源ID。

  2. 能搜索到很多网页(但内容几乎相同)指出AssetManager有个bug,不能处理单个超过1MB的文件。但没有说明Android版本。从我们对这个字库的使用来看,Android 2.3以上没有问题。

  3. 找到Android
    Issue 39041
    提到AssetManager的一个问题,回复中5楼bite…@gmail.com说,

    There is a bug in apk de/compression that does not allow using compressed assets which unpack into files larger than 1 mb. This problem is fixed in Android 2.3.

    不知道他是不是Project Member,在7楼,他又说,

    Android smaller than 2.3 DOES NOT GUARANTEE that loading will succeed. This happens more frequently when there are a lot of similar bytes in a row in the asset file, but not necessary. To be sure you have to split the resource file into small files, that’s
    it.

    而Project Member kr…@android.com说,

    Also, do not read files a single byte at a time. Use a large byte buffer.

    不知道这里“a large byte buffer”要求达到多少。我们的字库文件jp.ttf是超过1MB了,确实也只在Android 2.2上遇到问题。而我们的应用又必须支持Android 2.2。

  4. 又折腾一番后我们发现,把这个jp.ttf改名为jp.xmf,在Android 2.2上就可以正常访问了。

  5. 无论文件后缀名是啥,访问方法是一样的,

    InputStream in = getResources().getAssets().open("jp.xmf");

    第3点里提到的“a large byte buffer”建议得到了验证,应用里由于某种原因需要把这个文件读到一个buffer里再写到另一个路径,这个buffer是1KB,如果调整成1MB,jp.ttf就也可以正常访问了。最初,是这样访问的,

    tf = Typeface.createFromAsset(getAssets(), "jp.xmf");

    还是不清楚为什么jp.xmf可以工作,jp.ttf不行?

更新,12月23日。知道了为什么jp.xmf可以工作,jp.ttf不行。这个问题可能是试图访问在打包apk时被压缩的资源文件而产生的,因此解决方法确实是改文件后缀名,改成不会在打包apk时被压缩的后缀名。譬如mp3、jpg,或者我们曾经尝试过的xmf。感谢这个提问CommonsWare的回答。

同时,我们也发现之前“5”中的结论是错误的,对于jp.ttf,在Android 2.2上增大buffer没有解决问题。可能当时验证的小伙伴一时糊涂用错了手机。关于1MB的问题,还可以参考这个提问

Android assets的一个bug的更多相关文章

  1. sqlite在Android上的一个bug:SQLiteCantOpenDatabaseException when nativeExecuteForCursorWindow

    更多内容在这里查看 https://ahangchen.gitbooks.io/windy-afternoon/content/ ::-/com.company.product W/System.er ...

  2. 一个难倒 3年 android开发经验 " 工程师 " 的 "bug"

    一个关于 imageView 设置 scaleType 的问题. 就在刚才 晚上9 点多的时候,我的一个外包伙伴发一个工程代码我,叫我去看下这样一个"bug",说折腾了很久,图片选 ...

  3. [android开发IDE]adt-bundle-windows-x86的一个bug:无法解析.rs文件--------rs_core.rsh file not found

    google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展.可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了.之前导4.0 ...

  4. android app上线后bug的处理

    app上线后,后期维护显得尤为重要,今天给大家分享一下app上线后出现bug后的解决方法 1.继承Application类,重写onCreate方法 import java.io.File; impo ...

  5. 关于Android Assets读取文件为File对象

    关于Android Assets读取文件为File对象的问题,在Assets里面放置文件,在使用的时候,一般是使用AssetManger对象,open方法获取InputStream 然后进行其他操作. ...

  6. android 自己创建一个凝视模板

    android  自己创建一个凝视模板 作为一名程序猿 不仅要有一个写代码的能力,养成一个良好的编写习惯也是非常重要的. 今天给大家具体介绍一下怎样创建凝视模板,给每一个类和方法都自己手动去凝视信息也 ...

  7. androidstudio canary5一个bug

    Android Studio最新开发版一直跟着升级.到Canary5的时候出了一个bug. app build.gradle添加自己编译的aar库,原本一直使用: compile(name:'ijkp ...

  8. Android 系统自动重启Bug(高通平台)

    点击打开链接 最近客户反馈了一个Bug,我们的系统用着用着会自动重启,尤其是在拨号的时候极容易死机或者进入下载模式.根据老大和高通的支持得到了一个解决方案. 在Android系统中,有这么一个文件夹: ...

  9. CSharp程序员学Android开发---3.Android内部元素不填充BUG

    最近公司组织项目组成员开发一个Android项目的Demo,之前没有人有Andoid方面的开发经验,都是开发C#的. 虽说项目要求并不是很高,但是对于没有这方面经验的人来说,第一步是最困难的. 项目历 ...

随机推荐

  1. UITableView加载数据,没有数据,没有网络界面处理

    https://blog.csdn.net/chmod_r_755/article/details/53231461 俗话说的好,傻逼的APP都是相似的,牛逼的APP各有各的牛逼...但是UITabl ...

  2. 架构 规则引擎 quartz

    通向架构师的道路(第五天)之tomcat集群-群猫乱舞-云栖社区-阿里云https://yq.aliyun.com/articles/259343 商业规则引擎和开源规则引擎的测试对比 - qq_39 ...

  3. 【学亮IT手记】jQuery DOM操作-获取内容和属性

    jQuery拥有可操作HTML元素和属性的强大方法. 其中非常重要的部分就是操作DOM的能力. DOM--文档对象模型. <!DOCTYPE html> <html> < ...

  4. PHP二维数组(或任意维数组)转换成一维数组的方法汇总(实用)

    目录 1 array_reduce函数法 2 array_walk_recursive函数法 3 array_map函数法 假设有下面一个二维数组: $user = array( '0' => ...

  5. 【译】Six Open Source Dashboards to Organize Your Data

    作者:Ben Gregory on Jun 29, 2016   译者:carsonzhu 在天文学家看来,我们相信每个组织都可以从数据的正确集中,组织和清理中受益. 我们正在建立一个公司来做到这一点 ...

  6. git分支操作2

    1.创建分支 git branch <分支名>           会自动复制主分支上的代码. 2.查看当前分支 git branch -v 3.切换分支 git checkout < ...

  7. MBG逆向工程报错:generate failed: Exception getting JDBC Driver: com.mysql.jdbc.Driver

    修改pom文件,逆向工程如下: <!-- 逆向工程 --> <plugin> <groupId>org.mybatis.generator</groupId& ...

  8. Redis五大数据类型

    首先说明下,Redis是:单线程+多路IO复用技术!!! string set  >  key  +  zset          list hash 常用的几个命令: >keys * 查 ...

  9. Golang的Json encode/decode以及[]byte和string的转换

    使用了太长时间的python,对于强类型的Golang适应起来稍微有点费力,不过操作一次之后发现,只有这么严格的类型规定,才能让数据尽量减少在传输和解析过程中的错误.我尝试使用Golang创建了一个公 ...

  10. Linux基础学习(10)--Shell基础

    第十章——Shell基础 一.Shell概述 1.Shell是什么: (1)Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来 ...