Android assets的一個bug
由於要顯示一些奇奇怪怪的日文字元,我們在應用裡放了一個字型檔檔案,譬如叫做jp.ttf
,放在assets
目錄下打包。
開發、除錯一切正常。可是突然發現,在Android 2.2的裝置上,文字無法顯示。折騰一番後發現了一些故事,也產生了更多疑問。
放在
assets
目錄下的資原始檔不會被對映到R.java
,訪問需要AssetManager
類。不同於res/raw
,res/raw
中的資原始檔會被對映到R.java
,訪問時使用資源ID。能搜尋到很多網頁(但內容幾乎相同)指出
AssetManager
有個bug,不能處理單個超過1MB的檔案。但沒有說明Android版本。從我們對這個字型檔的使用來看,Android 2.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。又折騰一番後我們發現,把這個
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時被壓縮的字尾名。譬如mp3、jpg,或者我們曾經嘗試過的xmf。感謝這個提問裡CommonsWare的回答。
同時,我們也發現之前“5”中的結論是錯誤的,對於jp.ttf
,在Android 2.2上增大buffer沒有解決問題。可能當時驗證的小夥伴一時糊塗用錯了手機。關於1MB的問題,還可以參考這個提問。
相關文章
- 一個bug引發的Android分割槽儲存的思考Android
- oracle的一個bugOracle
- TestHome 的一個 Bug
- Snakeyaml的一個bugYAML
- 一個奇怪的 Bug
- [BUG反饋]AdminController類的一個小bugController
- 發現Mapstruct的一個bugStruct
- 一個排序引發的BUG排序
- Android中讀取assets目錄下的檔案詳細介紹Android
- 10g sqlplus的一個bugSQL
- SpringBoot讀取yml的一個bugSpring Boot
- onethink安裝時的一個bug
- 一個與CONNECT BY相關的BUG
- 遭遇ORA-07445 的一個BUG
- webpack4.0各個擊破(3)—— Assets篇Web
- 找到Intel手冊裡的一個bugIntel
- NDK clang編譯器的一個bug編譯
- 發現 ORM 方法 MorphToMany 的一個 BugORM
- java log4j 的一個bugJava
- 碰到一個latch free相關的BUG
- 一個價值8.7億刀的bug
- 一個bug造就的經典遊戲....遊戲
- 一個系統BUG引發的血案 -- FKDownloader
- 我好像發現了一個Go的Bug?Go
- 這不會又是一個Go的BUG吧?Go
- iOS layoutMargins 的坑:一個活久見的 bugiOS
- 我們被一個 kong 的效能 bug 折騰了一個通宵
- [Android多媒體技術] 播放Raw/Assets音視訊方法總結Android
- 記錄一個前端bug的解決過程前端
- 一個由public關鍵字引發的bug
- 一個bug肝一週...忍不住提了issue
- Android疑難bug統計Android
- Android 自定義Toast及BUGAndroidAST
- 遇到ASM的兩個BUGASM
- 記php-fpm重啟導致的一個bugPHP
- 從一個跨二十年的glibc bug說起
- 發現了一個關於 gin 1.3.0 框架的 bug框架
- [BUG反饋]兩個關於釋出文章的BUG
- 踩到一個關於分散式鎖的非比尋常的BUG!分散式