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刀闷,也即可以不經壓縮打到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ù)量
這里有必要解答一個疑問翘单,經常會遇到StreamingAssets下文件數(shù)量遠小于255,但打包還是會報錯蹦渣,這是為什么呢哄芜?其實是Resources目錄下資源太多,所以生成的.resource文件數(shù)量較多導致的柬唯,這種情況下好的解決方案就是將Resources下一些資源打成bundle來使用忠烛,減少.resource文件的數(shù)量
三,aaptOptions.noCompress配置技巧
aapt官方文檔以及網上查到的一些資料都說aaptOptions.noCompress配置的是不壓縮資源文件的后綴名,但是使用后綴名來配置有一定的局限性,比如有些文件后綴名相同馍迄,但是如果只想將其中幾個文件(而不是全部)配成不壓縮倔既,再比如有的文件沒有后綴名怎么辦?
經過實踐發(fā)現(xiàn)aaptOptions.noCompress機制并不是檢查文件后綴名,而是判斷文件路徑是否以某個字符串結尾,另外一個需要注意的地方是,在做string.EndWith判斷之前會將文件路徑全部轉換為小寫胯陋,所以aaptOptions.noCompress中的配置項也必須全為小寫