现象:
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则正常。