在将 React Native 从 0.71 升级到 0.76 后,打包体积从 40 多 MB 增加到了 80 MB。经过一系列排查和优化,最终找到了解决方案,并将优化过程整理如下。
1. React Native 0.76 体积增大的可能原因
(1) 新架构默认启用
React Native 0.76 默认启用了 New Architecture(新架构),包括:
-
JSI(JavaScript Interface)
-
Fabric(新的 UI 渲染系统)
-
Turbo Modules(优化原生模块交互)
-
Codegen(自动代码生成)
-
Hermes(默认 JavaScript 引擎)
新架构的引入可能导致原生代码增加,从而导致包体积变大。
(2) 旧架构导致 UI 渲染异常
在 gradle.properties
文件中,尝试将:
newArchEnabled=true # 新架构启用
修改为:
newArchEnabled=false # 禁用新架构
打包后 APK 体积恢复到 40 多 MB,但运行时 部分 UI 渲染异常,说明某些 UI 组件依赖了新架构。
(3) 缺少 Proguard 和资源压缩
在 android/app/build.gradle
的 release
配置中,默认没有启用 Proguard(代码混淆) 和 资源压缩(shrinkResources),导致 APK 体积增大。
release {
signingConfig signingConfigs.release
minifyEnabled enableProguardInReleaseBuilds // 代码混淆
shrinkResources true // 资源压缩
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
将 minifyEnabled
和 shrinkResources
设置为 true
后,包体积减少约 6 MB,但效果不明显。
(4) 依赖库升级与精简
升级了以下 第三方依赖库:
-
@react-navigation/bottom-tabs
-
@react-navigation/native
-
@react-navigation/native-stack
-
react-native-safe-area-context
-
react-native-screens
并删除了 不必要的 @react-navigation/stack
,但打包后的体积变化不大。
2. 发现 android:extractNativeLibs
影响 APK 体积
在进一步分析后发现,iOS 的体积没有明显变化,只有 Android 体积增加,说明可能与 Android 配置相关。
在 AndroidManifest.xml
文件中,添加以下配置:
<application
android:extractNativeLibs="true"
>
然后重新打包,APK 体积瞬间从 80 MB 降回 40 多 MB,并且所有功能正常运行。
3. android:extractNativeLibs
的作用
(1) 该属性的含义
android:extractNativeLibs
决定了 APK 安装时 是否解压 lib
目录下的 .so
文件。
选项 | APK 体积 | 加载速度 | 适用场景 |
---|---|---|---|
true (解压 .so 文件) | 较小 | 稍慢 | 适用于 Google Play 和 更广泛的设备兼容性 |
false (不解压 .so 文件) | 较大 | 更快 | 适用于 企业内部 APK 直接安装 |
(2) React Native 0.76 默认值变更
在 React Native 0.76 之前,android:extractNativeLibs
默认是 true
,而 0.76 改为了 false
,导致:
-
.so
文件以 未压缩 形式存放在 APK 内部,导致 APK 体积变大。 -
启动时 直接从 APK 读取
.so
,加快加载速度。
但由于 Google Play 更倾向于优化 APK 体积,所以如果你要发布到 Google Play,建议使用 android:extractNativeLibs="true"
。
4. 结论与优化方案
(1) 主要原因
-
React Native 0.76 启用了新架构,导致原生代码和依赖增多,影响 APK 体积。
-
android:extractNativeLibs
默认为false
,使.so
文件未压缩存储,导致 APK 变大。 -
未启用代码混淆和资源压缩,导致额外的资源占用。
(2) 解决方案
✅ 启用 android:extractNativeLibs="true"
(推荐):
<application
android:extractNativeLibs="true"
>
✅ 开启代码混淆和资源压缩(减少 6M 左右):
release {
minifyEnabled true
shrinkResources true
}
✅ 尽量精简不必要的第三方依赖。
(3) 是否要关闭新架构?
-
如果你的 UI 组件在
newArchEnabled=false
时有问题,建议继续使用 新架构。 -
如果你希望减少包大小,并愿意做适配工作,可以尝试禁用新架构。
5. 总结
在 React Native 0.76 升级后,Android APK 体积变大的核心原因主要是 新架构的启用 和 android:extractNativeLibs
默认为 false
。
最终,通过 手动开启 android:extractNativeLibs="true"
,成功将 APK 体积从 80 MB 降到 40 多 MB,并确保了所有功能正常运行。
如果你的应用需要发布到 Google Play,建议保持 android:extractNativeLibs="true"
,同时开启 Proguard 和资源压缩,优化 APK 体积 🎯。