You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:09:21