Unity子包加载资源卡顿

2019-03-28  本文已影响0人  Cylee1989

现象:
Unity游戏母包加载资源启动速度正常,但是经过apktool工具重新生成的子包启动速度变慢变卡顿。

原因:
经过对比两个apk包体,发现打出来的子包比母包要小大概几十兆左右。
再对比apktool.yml文件中doNotCompress参数,发现assets下的资源很多都被二次压缩了。

解决方案:

echo "----------------------------------"
echo "第1步: 反编译APK原始包..."

apkpath="apk包的路径"
targetProject="反编译apk的存放目录"
apktool d $apkpath -o $targetProject

echo "----------------------------------"
echo "第2步: 处理需要替换的资源..."
echo "编译java文件、资源文件等..."

echo "----------------------------------"
echo "第3步: 重新编译apk..."

# 未签名的apk包
unsignedapk="unsigned.apk" 
apktool b $targetProject -o $unsignedapk

echo "----------------------------------"
echo "第4步: 处理资源被二次压缩问题..."

# 将unsignedapk包解压缩到unZipDir目录中
unZipDir="unZipDir"
if [[ -d "$unZipDir" ]]; then
    rm -rf $unZipDir
fi
unzip -d $unZipDir $unsignedapk

# 删除unsignedapk包
rm -rf $unsignedapk

# 将资源全部压缩成unsignedapk包,但unZipDir目录仍需保留
cd $unZipDir
zip ../$unsignedapk -r --no-dir-entries *

# 查看母包有哪些文件是没有被压缩的,通过Stored标识可以判断
storedFiles=`unzip -v $apkpath | grep "Stored" | grep "assets/" | awk '{print $8}'`

# 将storedFiles文件以无压缩格式重新压缩进unsignedapk包
zip ../$unsignedapk -r --no-dir-entries -0 $storedFiles

# 将unZipDir目录删除
cd ..
rm -rf $unZipDir

echo "----------------------------------"
echo "第5步: Java签名..."

keystore="test.keystore"
storepass="123456"
keyalias="test"
aliaspass="123456"

unalignapkname="unalign.apk"
jarsigner  -sigfile CERT -digestalg SHA1 -sigalg MD5withRSA -keystore $keystore  -storepass $storepass -keypass $aliaspass -signedjar $unalignapkname  $unsignedapk $keyalias
rm $unsignedapk

echo "----------------------------------"
echo "第6步: 字节对齐..."

alignapkname="align.apk"
zipalign 4 $unalignapkname $alignapkname
rm $unalignapkname

echo "----------------------------------"

正常结果:
unzip -v align.apk
通过unzip命令查看文件Method状态显示Stored则正常。

上一篇 下一篇

猜你喜欢

热点阅读