Unity Android下Streaming Assets特殊姿勢

ps. 豆知識大家可以了解一下=w=

這兩天在群里看到有人問過這個問題,也有朋友小窗問我:Unity中導出Gradle工程然後打包出來的apk會載入AssetBundle慢很多。

於是聯想到了之前遇到的一個有意思的現象:我們的出包流程是在打包出來apk之後,利用apktool解包再進行加密和資源處理再打回去。但我發現這個步驟導致apk大小變化很多(有時變大有時變小,毫無規律),非常奇怪;但是解壓出來的內容確實又是一樣的。後來我仔細比對之後終於找到玄機:Streaming Assets下的東西默認是不壓縮的

用Bandizip打開可以看到,Unity打出來的apk里StreamingAssets下東西是Store的。後來我搜到了論壇上的一個解釋Why the asset bundle slow in StreamingAssets on android device?

StreamingAssets are packaged into APK with -0 flag for AAPT tool (or -0 -Z for fastzip). Meaning that correspondent segment in APK is uncompressed. APK is a zip container which consists of blocks of potentially different compression types. You can use e.g. APK Analyzer to check what』s compressed and what』s not.

然後使用apktool這個工具的時候它有一個bug:apktool拆包的時候其實會記錄哪些文件是Store哪些是Deflate,然後在打包回去的時候讀取之;但是非常不幸的是這個功能對於沒有後綴名的文件無效。之前我們的AssetBundle全都是沒有後綴名的,因此導致我拆包+壓回去之後所有資源都變成了Deflate。解決辦法也非常簡單:加一個bundle的後綴名即可。由於這個情況發現的比較早,所以我無意間就避開了Android下載入Asset Bundle很慢的情況…

ps. 針對朋友的那個情況,他後來找到了ASSET BUNDLES PERFORMANCE DROP WHEN USING CUSTOM BUILD SYSTEM FOR UNITY PROJECT ON ANDROID,裡面的解決方案非常簡單。當然思路也是一樣的,加一個後綴名然後保證在打包apk的時候不要壓縮這部分資源即可。

android {n ...n aaptOptions {n noCompress bundle // or whatever extension you usen }n}n

推薦閱讀:

談談Android的內存管理機制
Android App Shortcuts

TAG:Unity游戏引擎 | Android |