Expo - APK 包必须包含预期的嵌入资产

Han*_* Nr 5 android react-native expo

我是 React 新手,我尝试运行我的应用程序,但出现以下错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.bits.bee.bwc, PID: 12601
    java.lang.AssertionError: APK bundle must contain the expected embedded asset asset_c2f3d742a18a28238b7cd34a5d4b7316.png
        at expo.modules.updates.loader.EmbeddedLoader.copyAllAssets(EmbeddedLoader.java:174)
        at expo.modules.updates.loader.EmbeddedLoader.processManifest(EmbeddedLoader.java:137)
        at expo.modules.updates.loader.EmbeddedLoader.loadEmbeddedUpdate(EmbeddedLoader.java:57)
        at expo.modules.updates.UpdatesController.start(UpdatesController.java:286)
        at expo.modules.updates.UpdatesController.initialize(UpdatesController.java:96)
        at com.bits.bee.bwc.MainApplication.onCreate(MainApplication.java:98)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1011)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4552)
        at android.app.ActivityThread.access$1500(ActivityThread.java:147)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5255)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释它是如何工作的,因为我在我的资产文件夹中查找了它,没有类似的名称。我该如何解决这个问题?谢谢

And*_*dru 0

信息

此异常仅在运行调试版本时发生在我身上react-native run-android,而在运行发布版本时并未出现该异常react-native run-android --variant=release

解决方案

检查是否有以下行MainApplication.java,如果存在,则删除该行

import com.facebook.react.BuildConfig;
Run Code Online (Sandbox Code Playgroud)

解释

该行import com.facebook.react.BuildConfig;导致UpdatesController.initialize(this);在调试模式下调用,这是不应该发生的。

更多详情

当你查看 Stacktrace 时,你发布了这一行

at com.bits.bee.bwc.MainApplication.onCreate(MainApplication.java:98)
Run Code Online (Sandbox Code Playgroud)

指着UpdatesController.initialize(this);。包括上面和下面的行,它看起来像这样:

if (!BuildConfig.DEBUG) {
  UpdatesController.initialize(this);
}
Run Code Online (Sandbox Code Playgroud)

这里BuildConfig指向在构建期间创建的BuildConfig包的类(在您的情况下)。com.bits.bee.bwc如果导入,com.facebook.react.BuildConfig它将指向另一个BuildConfig不包含DEBUG您想要的正确值的类。

由于BuildConfig.DEBUGwill then beundefinedfalse,UpdatesController.initialize(this);被调用,尽管它不应该在调试构建期间被调用。因此,由于调试版本不会嵌入资产,因此copyAllAssets最终调用的函数将找不到任何资产,并且我们会收到上述错误。


我最终导入的一些背景com.facebook.react.BuildConfig;

我在发布版本中遇到了问题java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so,并按照此处所述的建议添加了该行/sf/ask/3992542221/#answer-62119615。它没有对发布版本进行更改,我忘记了它。只是后来当我尝试进行调试构建时,我得到了这个错误..我花了很长时间才意识到这个添加的行是问题的原因!

我从调试这个问题中学到了什么:

  1. 不要只是因为你认为它不会造成伤害而添加东西。如果它不能实现特定目的或没有效果,请立即删除更改。否则以后可能会引起奇怪的副作用。
  2. 如果您遇到 Android 构建问题,请使用 Android Studio 而不是 Flipper 进行调试。Flipper 不会向您显示整个 Stacktrace,在 Android Studio 中您可以轻松浏览所有 Java 文件,这最终帮助我理解了这个异常。