React Native应用升级targetSdkVersion至31后崩溃,如何解决?
修复targetSdkVersion 31导致的React Native 0.62.2应用崩溃问题
1. 升级Gradle相关依赖版本
当前gradle(4.10.1)和gradle plugin(3.3.1)版本过低,无法兼容targetSdk31,需同步升级:
- 将gradle plugin升级至4.2.2(适配targetSdk31的最低兼容版本之一)
- 将gradle版本升级至6.7.1(与4.2.2版本plugin匹配)
- 把buildToolVersion升级至31.0.0,与compileSdkVersion 31保持一致
修改项目根目录build.gradle:
buildscript { dependencies { classpath 'com.android.tools.build:gradle:4.2.2' } }
修改gradle/wrapper/gradle-wrapper.properties:
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
修改app模块build.gradle:
buildToolsVersion "31.0.0"
2. 修复Android 12启动兼容性问题
Android 12强制要求所有带Intent过滤的Activity必须声明android:exported属性,RN 0.62.2默认配置缺失该属性会导致启动崩溃:
打开AndroidManifest.xml,为主Activity及其他含Intent过滤的Activity添加该属性(主Activity带LAUNCHER过滤器时设为true):
<activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
3. 适配第三方RN模块
部分第三方模块未适配targetSdk31,会因权限、API变更引发崩溃:
- 排查所有依赖模块,升级至支持Android 12的版本(如
react-native-firebase、react-native-camera等均有适配版本) - 若模块无更新,可临时在
AndroidManifest.xml中添加兼容配置(如给模块内未声明android:exported的Service/Receiver补充该属性)
4. 修复RN核心代码兼容性
RN 0.62.2核心代码存在Android 12不兼容点,需手动调整:
- 针对Android 12限制的反射调用,修改RN初始化相关代码,或使用社区提供的适配补丁
- 在
MainApplication.java中调整RN初始化逻辑,规避Android 12限制的特性
5. 适配Android 12新增权限
Android 12新增BLUETOOTH_SCAN、BLUETOOTH_ADVERTISE等权限,若应用涉及蓝牙等相关功能,需在AndroidManifest.xml中添加对应权限,并在代码中完成动态申请。
内容的提问来源于stack exchange,提问作者justinNg
相关产品推荐
相关产品推荐

