Unity3D使用gradle打Android包遇到的aaptOptions.noCompress越界問題及解決方案

Unity3D使用gradle方式打Android包,如果StreamingAssets下文件較多,會打包失敗,錯誤如下:

? java.lang.ArrayIndexOutOfBoundsException: 1866

?? at org.codehaus.groovy.classgen.asm.CallSiteWriter.getCreateArraySignature(CallSiteWriter.java:58)

原因是aaptOptions.noCompress數(shù)組越界,對此問題的詳細描述參考博文:

Unity導出Gradle工程或者apk包,StreamAssets目錄文件超過255無法導出的問題 ... ... ... - liqing19850102的專欄 - CSDN博客

aaptOptions.noCompress數(shù)組的最大容量為255,也即可以不經(jīng)壓縮打到apk包里的資源文件數(shù)不能超過255個。

原文中提供的解決方案是,把Unity默認的配置中的 **STREAMING_ASSETS** (含義為StreamingAssets文件夾下所有資源都不壓縮)去掉,改為只針對某些類型的資源不壓縮,比如.bundle

這里我想在原文基礎上拓展三點,來深化對這一問題的認識。

一,為什么要配置aaptOptions.noCompress

簡單來說,可以提升資源加載效率,因為加載壓縮過的資源需要一個解壓過程

那么哪些資源需要配置到aaptOptions.noCompress呢?

我們來看一下Unity的默認配置,

aaptOptions { noCompress'.unity3d','.ress','.resource','.obb'**STREAMING_ASSETS** }

.resource是Resources目錄下資源編譯后生成的文件

**STREAMING_ASSETS** 代表StreamingAssets文件夾下的文件

可見動態(tài)加載的資源一般要配置到aaptOptions.noCompress里,以提升加載效率

二,當使用默認配置超出最大容量255時怎么辦

兩種思路

a,將一些小的使用不頻繁的文件從列表中移出

b,將多個文件合并為一個(比如打成bundle)來減少列表中文件數(shù)量

這里有必要解答一個疑問,經(jīng)常會遇到StreamingAssets下文件數(shù)量遠小于255,但打包還是會報錯,這是為什么呢?其實是Resources目錄下資源太多,所以生成的.resource文件數(shù)量較多導致的,這種情況下好的解決方案就是將Resources下一些資源打成bundle來使用,減少.resource文件的數(shù)量

三,aaptOptions.noCompress配置技巧

aapt官方文檔以及網(wǎng)上查到的一些資料都說aaptOptions.noCompress配置的是不壓縮資源文件的后綴名,但是使用后綴名來配置有一定的局限性,比如有些文件后綴名相同,但是如果只想將其中幾個文件(而不是全部)配成不壓縮,再比如有的文件沒有后綴名怎么辦?

經(jīng)過實踐發(fā)現(xiàn)aaptOptions.noCompress機制并不是檢查文件后綴名,而是判斷文件路徑是否以某個字符串結(jié)尾,另外一個需要注意的地方是,在做string.EndWith判斷之前會將文件路徑全部轉(zhuǎn)換為小寫,所以aaptOptions.noCompress中的配置項也必須全為小寫

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容