AndroidX迁移(含React Native升级)后应用体积增大问题咨询
Hey there, let's unpack why your app's size went up after the migration—even without touching any feature code. This is a common scenario when jumping between major RN versions and enabling new runtimes like Hermes, so let's break down the likely causes and how to address them:
Key Reasons for Dex File Growth
React Native 0.63's AndroidX & Dependency Updates
Jumping from 0.59.8 to 0.63 means you're moving from old Android Support Libraries to full AndroidX integration. RN 0.63 ships with built-in AndroidX support, which replaces legacy support libraries with newer (and sometimes larger) AndroidX equivalents. Additionally, the RN core itself adds more classes and dependencies in newer versions to support better Android compatibility and features.Hermes Runtime Overhead
While Hermes is designed to reduce overall app size long-term by optimizing JS bytecode, enabling it adds the Hermes runtime library to your dex files. This is new code that wasn't present with the old JSC (JavaScriptCore) runtime, so it will immediately increase dex size. The good news is that Hermes' bytecode compilation (enabled in release builds) will shrink the JS-related payloads, which often offsets this runtime overhead in the final distributed APK/AAB.Unintended Gradle Dependency Bloat
During the migration, you might have added new dependencies or left old ones lingering. For example, some indirect dependencies from the old RN version might not have been properly excluded, or new RN modules might pull in optional AndroidX libraries you don't actually need. These extra dependencies get compiled into your dex files, adding unnecessary bulk.
Steps to Diagnose & Optimize
Dig Into Dex File Details
You mentioned using bundle inspect tools—take this a step further with Android Studio's APK Analyzer (go toBuild > Analyze APK/AAB). It lets you compare old and new dex files side-by-side, showing exactly which classes/packages are taking up extra space. You can also use thedexdumpcommand-line tool to parse dex contents if you prefer terminal workflows.Trim Unnecessary Dependencies
In your app-levelbuild.gradle, useexcludeclauses to strip out unused indirect dependencies. For example, if a RN library pulls in an AndroidX library you don't need, add something like:implementation('com.facebook.react:react-native:0.63.4') { exclude group: 'androidx.some_unused_library' }Enable Full Release Optimizations
Make sure your release build config includes these flags inbuild.gradleto shrink unused code and resources:android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' enableHermes true // Ensure this is set for release } } }RN 0.63 works smoothly with R8 (the default minifier), so this will strip out dead code from both RN core and your dependencies.
AAB vs. Raw APK Context
Remember that AAB files are designed for Google Play's app serving optimization—they contain all architecture variants, so the raw AAB size will be larger than a single-architecture APK. When users download your app via Google Play, they get a trimmed APK tailored to their device, which should be smaller than the old JSC-based APK once Hermes optimizations are applied.
内容的提问来源于stack exchange,提问作者Deepanshu

