React Native升级Target API至34后API34模拟器启动崩溃求助
Target API 34升级后应用在API34模拟器闪退,API33设备正常运行
问题描述
- 项目Target API从33升级至34,构建过程成功
- Visual Studio/Xcode模拟器运行无报错,但应用启动后闪退
- Pixel 6 Pro API33设备可正常打开应用,同一项目在Pixel 6 Pro API34设备上无法启动
- Logcat报错指向广播接收器未指定导出属性,以及DevSupportManager初始化失败
相关配置
buildscript配置
buildscript { ext { buildToolsVersion = "34.0.0" minSdkVersion = 21 compileSdkVersion = 34 targetSdkVersion = 34 ndkVersion = "21.4.7075529" // Any of the following will work // googlePlayServicesVersion = "17.0.0" playServicesVersion = "18.0.0" // playServicesLocationVersion = "17.0.0" } }
Gradle版本
distributionUrl=https://services.gradle.org/distributions/gradle-7.2-all.zip
React Native依赖调整
将implementation "com.facebook.react:react-native:+"修改为:
dependencies { // ...其他依赖项 implementation "com.facebook.react:react-native:0.67.2" }
AndroidManifest.xml权限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.VIBRATE"/>
开发环境
- Android Studio版本:Flamingo 2022.2.1 Patch 1
Logcat错误日志
07-11 09:48:21.855 6868 6868 E AndroidRuntime: Process: com.testreactnative, PID: 6868 07-11 09:48:21.855 6868 6868 E AndroidRuntime: java.lang.RuntimeException: Unable to create application com.testreactnative.MainApplication: java.lang.RuntimeException: Requested enabled DevSupportManager, but BridgeDevSupportManager class was not found or could not be created 07-11 09:48:21.855 6868 6868 E AndroidRuntime: at com.testreactnative.MainApplication.onCreate(MainApplication.java:55) 07-11 09:48:21.855 6868 6868 E AndroidRuntime: Caused by: java.lang.SecurityException: com.testreactnative: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts 07-11 09:48:21.874 561 2080 W ActivityTaskManager: Force finishing activity com.testreactnative/.MainActivity
解决方案
1. 给静态注册的广播接收器添加导出属性
Android 14(API34)要求所有非系统专属的广播接收器必须指定android:exported属性,检查AndroidManifest.xml中的所有<receiver>标签,补充该属性:
<!-- 根据接收器是否需要接收外部应用广播选择true/false --> <receiver android:name=".YourReceiverClass" android:exported="true"> <!-- 或false --> <intent-filter> <!-- 你的Intent过滤规则 --> </intent-filter> </receiver>
2. 适配React Native版本的API34兼容性
React Native 0.67.2对API34的支持存在缺陷,可通过以下方式修复:
- 升级RN版本:优先升级到0.71+版本,这些版本已完整适配Android 14;若无法大版本升级,至少升级到0.67.x的最新补丁版(如0.67.5),修复部分API34兼容问题。
- 调整DevSupportManager配置:在
MainApplication.java中修改开发支持开关逻辑,避免API34下初始化失败:@Override public boolean getUseDeveloperSupport() { // 仅在Debug模式且API低于34时开启开发支持 return BuildConfig.DEBUG && Build.VERSION.SDK_INT < 34; }
3. 修复动态注册的广播接收器
若代码中存在通过registerReceiver动态注册的广播,需在API34环境下添加RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED标志:
IntentFilter filter = new IntentFilter("com.your.app.action"); // 根据需求选择导出或不导出 registerReceiver(yourReceiverInstance, filter, Context.RECEIVER_EXPORTED);
内容的提问来源于stack exchange,提问作者Kıvanç ARSLAN
相关产品推荐
相关产品推荐

