前言
本篇文章主要讲解对于Unity Android平台也就是APK包体的优化经验,使用哪些工具能够更加便利的定位资源重灾区。本篇讲解的方法中对于Unity资源使用的AssetBundle的方式,如果使用addressable或其他资源管理方式,我还不是很清楚是否适用,没有去验证过。
工具选择
工欲善其事,必先利其器。对于优化包体这项工作,我们需要选择各种工具搭配使用才能准确定位资源重灾区并选择合适的方式进行优化。下面先讲讲我们需要用到的各种工具。
AndroidStudio
AndroidStudio自带APK分析器,我们使用AndroidStudio也主要用到他的APK分析器来分析包体结构以及对比我们的优化效果
只需要将APK拖入AndroidStudio就能够分析APK结构信息
优化完成后我们还能通过对比两个APK来比较优化效果
关于更多APK分析器的内容可以查看开发文档
AssetStudio
我们可以使用AssetStudio对资源包进行解包,这里的资源包包括AssetBundle包以及Unity Resources文件打的包(assets/bin/Data/)目录下的资源。
- 如果项目使用了资源加密,在优化的时候需要暂时先取消,优化后再开启资源加密
- 由于AssetStudio只支持Windows版本,如果你使用Mac,可以使用Parallels Desktop虚拟机安装或者尝试使用命令行版本UnityPy
只需要加载文件夹就可以解析所有资源,这个工具多数用来反编译爬取资源(这样不可取:),用来辅助优化包体大小也很有用。选择Export->Asset list to XML->All Assets导出所有资源信息的xml格式。
通过这个表我们可以知道这个名字、大小、被哪些资源引用、类型信息。这样我们就可以通过自定义解析代码来分析优化。
Unity工程Editor工具
上面的工具可以让我们知道哪些资源为占用高的资源,确定了之后,我们是能够删除这些资源还是进行资源优化就需要使用到各种Unity Editor内创建的工具了。
资源引用查找工具
https://github.com/blueberryzzz/ReferenceFinder
下载上面这个工具,我们可以通过查找资源的依赖关系,对于哪些没有被使用的模型、贴图、材质球就可以直接删除,方便快捷。
资源引用丢失查找工具
为了防止我们错删误删资源,我们还需要一个安全检查机制,使用一个引用丢失查找工具就很好的帮我们检查。这部分可以去网上找找其他博主附有代码文章,还是有很多分享的,内容大差不差,我这里就不浪费篇幅把代码贴出来了。
AssetBundle Browser
这是一款Unity提供的插件工具,非常强大的工具
Unity Asset Bundle Browser tool | Package Manager UI website
可以很方便的查看资源被打到哪些AB包,并且是否存在多个包引用同一个资源导致的资源重复引入问题
但是由于这个工具用起来很消耗CPU性能,确实有点卡卡的,较为简单的可以直接使用 ReferenceFinder就能解决。
优化思路
从优化方向来看有下面几个方向
- 删除APK中没有用到的资源
- 重新分配重复打包资源
- 优化资源打包参数(TextMeshPro的纹理导出尺寸、图集压缩等级....)
其中重复打包资源这个是不易察觉,并且也可能是导致包体莫名其妙变很大的根本原因,这个问题不光导致包体增大,同时也会导致内存翻倍,优化优先级很高并且回报率也很高。
1.删除APK中没用到的资源
注意这里说的是APK中没用到的资源,意味着已经被打入APK包体内,但是实际上游戏是用不到的资源,如果去找工程没用到的资源,可能会非常多,这些资源如果没有被场景(需要被Build的场景)、AB包、Resources目录下引用就不会被打入最终的APK去。
要删除这些资源可以通过ReferenceFinder查找哪些资源没有被引用,然后删除即可。
2.重新分配重复打包资源
这部分资源的占比如果没有很好的管理,或者在日常开发中严格按照开发流程来做(主要是美术),就很容易出问题。
通过使用AssetBundle Browser工具辅助重新分配出问题的资源。
对于Resources目录下的资源就需要小心处理
警惕Resources资源
在优化包体的时候,注意到assets/bin/Data/这个目录很大,但是由于项目所用到的资源都是AB管理的,理应不这么大,通过AssetStudio查看发现里面包含了字体文件以及项目中用到的TextMeshPro生成的字符资源,最终发现是由于TMP_Settings这个设置文件资源引起的问题,由于这个资源会被TMP插件自动放到Resources目录下,Unity打包就会打进去
如果这里设置了项目中的TMP_Font Asset,恰好这个资源原本已经打了AB包,那此时就会在assets/bin/Data目录下多存在一份全套的字体资源🙃