因为要显示一些奇奇怪怪的日文字符,咱们在应用里放了一个字库文件,譬如叫作jp.ttf
,放在assets
目录下打包。java
开发、调试一切正常。但是忽然发现,在Android 2.2的设备上,文字没法显示。折腾一番后发现了一些故事,也产生了更多疑问。android
放在assets
目录下的资源文件不会被映射到R.java
,访问须要AssetManager
类。不一样于res/raw
,res/raw
中的资源文件会被映射到R.java
,访问时使用资源ID。app
能搜索到不少网页(但内容几乎相同)指出AssetManager
有个bug,不能处理单个超过1MB的文件。但没有说明Android版本。从咱们对这个字库的使用来看,Android 2.3以上没有问题。google
找到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.code
不知道他是否是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说,get
Also, do not read files a single byte at a time. Use a large byte buffer.input
不知道这里“a large byte buffer”要求达到多少。咱们的字库文件jp.ttf
是超过1MB了,确实也只在Android 2.2上遇到问题。而咱们的应用又必须支持Android 2.2。
又折腾一番后咱们发现,把这个jp.ttf
更名为jp.xmf
,在Android 2.2上就能够正常访问了。
不管文件后缀名是啥,访问方法是同样的,
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时被压缩的后缀名。譬如mp三、jpg,或者咱们曾经尝试过的xmf。感谢这个提问里CommonsWare的回答。
同时,咱们也发现以前“5”中的结论是错误的,对于jp.ttf
,在Android 2.2上增大buffer没有解决问题。可能当时验证的小伙伴一时糊涂用错了手机。关于1MB的问题,还能够参考这个提问。