前言
打包体积是我们开发应用最终不得不面对的问题,比如对于大多数前端er熟悉的web端产物的体积优化:静态图片压缩,CDN引入部分依赖,分包策略...等等,就是基本规则之一是:产物大小会影响应用的运行加载,这在web端尤其重要。而app相比于web端这一点不是非常突出,因为用户要将app安装到设备上,一次安装一劳永逸。但是事实上我们日常安装,使用一个应用时也会有一些吐槽:就这么点功能就这么大的体积,应用后续运行还会需要更多空间,尤其是有同类应用可以选择时,大家肯定会想用多快好省的,应用在没有实际体验时就可能因为安装包劝退了一部分用户。而我使用expo创建的RN项目在开发过程中也是隐隐觉得一个问题:总共30多个页面,apk产物居然将近200M!如何优化呢?我也做出了一些探索,也确实看到了切实的效果:
优化前后apk体积大小对比:
优化前apk体积为191M,优化后体积为70M!
影响因素
对于有原生开发经验的其实都知道apk产物大的一个重要原因(咱们忽略静态资源和一些依赖库的问题,因为对于不同应用来说它有不确定性)就是应用想要运行在什么平台设备,不同时期设备应该选择什么Android CPU内核的架构打包!也就是当前android端产物的四个CPU架构选择:
| Android CPU架构 | ||
|---|---|---|
| armeabi-v7a | 32 位 ARM 架构 老旧 Android 设备(2015 年前) | |
| arm64-v8a | 64 位 ARM 架构主流设备(2015 年后几乎所有手机) | |
| x86 | 32 位 Intel 架构 旧款 Android 模拟器/平板 | |
| x86_64 | 64 位 Intel 架构 新款模拟器/部分平板/Chromebook |
以上列一个简单表格,这四种架构在android原生文件中是可以指定的,值通常是数组,表示我们想要适配哪些架构,进而会影响我们的打包产物,而expo云打包的默认配置是打包时四种架构都包含在内,以至于产物体积巨大! 对于这个问题,我询问AI,它们告诉我去修改原生文件,如果你具备本地打包的环境,能力这没有问题,简单直接,由于我用的windows电脑,之所以使用expo就是想要规避RN繁杂的开发环境搭建,而且windows端本地打包不如iOS端电脑打包环境容易搭建,而expo打包前,尤其是构建生产apk时他会重新生成原生目录,因此你修改了原生代码但是执行构建命令,重新生成的文件中就不包含你自定义的内容了!
关于不同CPU架构的配置对打包体积的影响:
- 设以上四种架构都选择,产物体积为100%
- arm64-v8a + x86_64时产物体积约为60%
- arm64-v8a 约为40%
而恰巧我们大部分时候只需要arm64-v8a!从以上图片计算,我只选择了arm64-v8a打包体积大约下降了63%
修改方法
对于这个问题,我们知道应该修改配置文件,但是我们又不能直接修改原生文件,因为重新生成后又覆盖了,这其实也是expo诟病的主要因素之一:使用expo意味着你能操作的空间受限。而且!而且expo54版本之前除了本地构建之外,无解! 我的项目在创建时expo版本是53,目前使用的是54,现在已经有了55版本,55版本我简单升级测试了,依赖使用方面有很多变动,而且发现了一些不太好处理的问题,而且expo55对应一些依赖文档中提供的一些方法在依赖库中并不存在! 具体什么鬼我也不清楚,暂时还是使用54版本。那具体是什么修改方法呢?答案就在expo的一个重要依赖库上:expo-build-properties
顾名思义:它就是expo的构建属性,配置控制构建时的行为!上面也说了54版本之前无解,但是54版本后它新增了一个重要属性:buildArchs 构建架构,值为string[],它就是我们配置上述的四个值的地方!也是源自最近一位掘友说想看看我的RN应用跑起来啥样,我就发了191M的网盘链接,他说体积这么大,我说我是expo云打包,没法控制原生文件,而且也知道默认打包就是包含上述四种架构,实际不需要如上这么多架构,而且我还控制不了,但是这又勾起了我控制打包产物体积的欲望:是不是我忽略了什么配置项,是不是有配置项可以解决这个问题,是不是文档我没有翻到位!
配置方式
啰里吧嗦说了很多,看的朋友肯定也不关心这些,但是通过以上希望大家对一些暂时不能解决的问题多留一点记忆,因为未来没准啥时候就有了解决方案!下面说配置方式:找到项目中的app.json或者app.config.json,然后就是配置expo-build-properties插件:
"plugins": [
[
"expo-build-properties",
{
"android": {
"minSdkVersion": 26,
"compileSdkVersion": 35,
"targetSdkVersion": 35,
"buildArchs": [
"arm64-v8a"
]
}
}
]
]
在android的buildArchs数组中添加你想要兼容的CPU架构,我只选择了一种,产物体积下降了63%!除此之外还有一些其他关于打包体积的配置项:
- enableBundleCompression属性 默认值是false,启用 JavaScript Bundle 压缩功能。开启这个功能后,APK 的大小会变小,但应用启动速度可能会变慢。
- enableMinifyInReleaseBuilds属性,在发布版本中启用 R8 以混淆 Java 代码并缩小应用大小。
- enablePngCrunchInReleaseBuild属性 true,在发布版本中启用 crunchPngs 以优化 PNG 文件。这个属性默认是启用的,但“可能会膨胀已经压缩的 PNG 文件”,所以如果你自己做 PNG 优化,可能需要禁用它。
其余呢就不是重点了,想要具体了解,大家去翻一翻文档吧!核心就是buildArchs影响产物体积。另外也是因为这位掘友告诉我可以去找网上的CMS采集接口来访问一些网站的视频资源,简单说就是可以调用他们的视频接口在自己的应用中看视频:
在此非常感谢这位掘友 : 终极负能量plus 我不知道怎么@他,在他的指导下完成了看剧的小功能,这个功能也没什么可说的,有了接口就是知道接口怎么调,有哪些参数,会返回什么数据,什么结构,怎么渲染。这里还有一个小问题:对于新版android如果接口是http而不是https,android的安全策略是不允许访问的,而我应用中的视频地址就是http明文的!具体什么原因大家都懂。那么能不能开启生产环境访问http地址呢?答案当然是可以的!配置方法非常简单:在上面的插件配置的android下增加: "usesCleartextTraffic": true
结尾
以上介绍了一些expo-build-properties的配置属性,有些属性在expo 53版本是没有的,就是说随着版本更新,增加了新的配置项,如果不是特别关注非常容易忽略。最后附上 [项目地址](expo rn: expo创建的react native的音乐播放器应用,专注视频转歌和本地歌曲播放) README文档中有apk的网盘地址,欢迎安装体验,star,交流学习!