React Native调试APK正常,Release APK启动崩溃(expo-updates清单异常)
Release APK启动崩溃,提示Could not read embedded manifest (app.manifest)
调试APK安装到安卓设备运行正常,但Release APK启动前崩溃,Logcat报错如下:
2022-07-25 09:45:00.639 5004-5004/? E/EmbeddedManifest: Could not read embedded manifest java.io.FileNotFoundException: app.manifest at android.content.res.AssetManager.nativeOpenAsset(Native Method) at android.content.res.AssetManager.open(AssetManager.java:744) at android.content.res.AssetManager.open(AssetManager.java:721) at expo.modules.updates.manifest.EmbeddedManifest.get(EmbeddedManifest.kt:22) at expo.modules.updates.loader.LoaderTask.launchFallbackUpdateFromDisk(LoaderTask.kt:238) at expo.modules.updates.loader.LoaderTask.start(LoaderTask.kt:99) at expo.modules.updates.UpdatesController.start(UpdatesController.kt:290) at expo.modules.updates.UpdatesController$Companion.initialize(UpdatesController.kt:464) at expo.modules.updates.UpdatesController.initialize(Unknown Source:2) at <LOCATION>.MainApplication.onCreate(MainApplication.java:88) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1155) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5906) at android.app.ActivityThread.access$1100(ActivityThread.java:200) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1660) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6762) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 2022-07-25 09:45:00.641 5004-5004/? E/AndroidRuntime: FATAL EXCEPTION: main Process: <LOCATION>, PID: 5004 java.lang.AssertionError: The embedded manifest is invalid or could not be read. Make sure you have configured expo-updates correctly in android/app/build.gradle. app.manifest at expo.modules.updates.manifest.EmbeddedManifest.get(EmbeddedManifest.kt:31) at expo.modules.updates.loader.LoaderTask.launchFallbackUpdateFromDisk(LoaderTask.kt:238) at expo.modules.updates.loader.LoaderTask.start(LoaderTask.kt:99) at expo.modules.updates.UpdatesController.start(UpdatesController.kt:290) at expo.modules.updates.UpdatesController$Companion.initialize(UpdatesController.kt:464) at expo.modules.updates.UpdatesController.initialize(Unknown Source:2) at <LOCATION>.MainApplication.onCreate(MainApplication.java:88) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1155) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5906) at android.app.ActivityThread.access$1100(ActivityThread.java:200) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1660) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6762) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
AndroidManifest.xml配置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="<LOCATION>" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:remove="android:maxSdkVersion"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <uses-permission android:name="android.permission.CALL_PHONE"/> <uses-feature android:name="android.hardware.camera" android:required="true"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/> <uses-feature android:name="android.hardware.microphone" android:required="true"/> <application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:theme="@style/AppTheme" tools:replace="android:allowBackup"> <meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL" android:value="https://exp.host/<LOCATION>"/> <meta-data android:name="expo.modules.updates.EXPO_SDK_VERSION" android:value="45.0.0"/> <meta-data android:name="expo.modules.updates.ENABLED" android:value="true"/> <meta-data android:name="expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH" android:value="ALWAYS"/> <meta-data android:name="expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS" android:value="0"/> <meta-data android:name="expo.modules.updates.EXPO_RELEASE_CHANNEL" android:value="prod"/> <activity android:name=".MainActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.App.SplashScreen" android:showOnLockScreen="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> </intent-filter> </activity> <activity android:name="com.ahmedadeltito.photoeditor.PhotoEditorActivity"/> <activity android:name="com.yalantis.ucrop.UCropActivity"/> <activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/> <service android:name="io.wazo.callkeep.VoiceConnectionService" android:label="Wazo" android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE" android:exported="false"> <intent-filter> <action android:name="android.telecom.ConnectionService"/> </intent-filter> </service> <service android:name="io.wazo.callkeep.RNCallKeepBackgroundMessagingService"/> </application> </manifest>
Release包编译无报错,仅启动崩溃,求解决方法。
解决方案
检查expo-updates在build.gradle中的配置
确保android/app/build.gradle中正确配置expo-updates插件与参数,添加或确认以下代码:apply plugin: 'com.android.application' apply plugin: 'expo-updates' android { defaultConfig { manifestPlaceholders = [ expoUpdatesEnabled: true, expoSdkVersion: "45.0.0", expoUpdateUrl: "https://exp.host/<LOCATION>", expoReleaseChannel: "prod" ] } } dependencies { implementation 'expo-modules-core:+' implementation 'expo-updates:+' }生成并嵌入正确的manifest文件
执行命令生成对应发布渠道的manifest文件,确保文件被打包进APK:expo export --platform android --release-channel prod执行后检查
android/app/src/main/assets目录下是否存在app.manifest和app.bundle文件。禁用资源压缩(针对R8/ProGuard)
如果开启了代码混淆,避免压缩manifest文件,在android/app/build.gradle中添加白名单:android { buildTypes { release { aaptOptions { noCompress 'app.manifest', 'app.bundle' } } } }清理缓存后重新编译
执行以下命令彻底清理编译缓存,再重新构建Release包:./gradlew clean ./gradlew assembleRelease匹配expo-updates与SDK版本
执行命令安装与SDK 45.0.0兼容的expo-updates版本:expo install expo-updates
内容的提问来源于stack exchange,提问作者Filip
相关产品推荐
相关产品推荐

