React Native 应用程序在 android 模拟器上不断关闭

React Native app keeps closing on android emulator

我正尝试在 android 模拟器 (react-native run-android) 上 运行 一个 React 本机应用程序,但是它一直崩溃并显示错误消息 "MYAPP has stopped"。我试图弄清楚在哪里可以进一步调试它(错误消息、日志等)。我在终端和模拟器本身上都没有看到任何错误消息。因此,除了尝试解决应用程序无法部署的原因之外......人们还可以在哪里进一步调试 android 模拟器上的应用程序部署问题?

旁注: 我从版本 0.31.0 升级到 0.32.0 和 运行 react-native upgrade 命令,这也需要一些文件覆盖(我选择了覆盖所有文件的选项)。我是否应该担心从升级到 0.32.0 的最新更改不起作用或不完整?我可以采取任何步骤来验证是否存在最新更改?

更新: 我创建了一个新的样本react native项目,只是为了看看RN的最新版本是否有问题。它运作良好。然后把index.android.js里的示例代码拿过来在我项目的index.android.js里覆盖,重新运行。尝试将其部署到 Android 模拟器时仍然遇到同样的问题。删除了 node_modules 目录,重新 运行,仍然是同样的问题。我现在认为这与升级过程有关...这非常令人沮丧。

更新 v2: 感谢@GabeSechan 的提示和指导,这是我找到的堆栈跟踪:

09-04 03:24:41.297  5008  5008 E AndroidRuntime: FATAL EXCEPTION: main
09-04 03:24:41.297  5008  5008 E AndroidRuntime: Process: com.helpr, PID: 5008
09-04 03:24:41.297  5008  5008 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.helpr/com.helpr.MainActivity}: java.lang.ClassCastException: android.app.Application cannot be cast to com.facebook.react.ReactApplication
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at android.app.ActivityThread.-wrap12(ActivityThread.java)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:102)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:154)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:6077)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
09-04 03:24:41.297  5008  5008 E AndroidRuntime: Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to com.facebook.react.ReactApplication
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at com.facebook.react.ReactActivity.getUseDeveloperSupport(ReactActivity.java:89)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at com.facebook.react.ReactActivity.onCreate(ReactActivity.java:96)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at android.app.Activity.performCreate(Activity.java:6664)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
09-04 03:24:41.297  5008  5008 E AndroidRuntime:    ... 9 more

经过快速 google 搜索,这似乎是升级 React Native 时存在的问题。我会 post 一个答案,回答我自己的问题。

事实证明,如果您正在升级 React Native,请注意升级过程不一定会更新所有必需的文件(在撰写本文时,升级到 RN 0.32.0)。事实证明这是一个已知问题 (https://github.com/facebook/react-native/issues/8215)。在此问题解决之前,您需要手动更新位于 ./android/app/src/main/AndroidManifest.xml 的 AndroidManifest.xml 文件。我建议创建一个示例 React Native 项目,并使用新创建的 AndroidManifest.xml 从那里 手动 更新现有项目中的项目。此外,无论何时升级,都要在新创建的 RN 项目和您自己的项目之间进行比较,以验证没有其他文件需要更新。

要解决您的问题,请在 android\app\build.gradle 文件中的 dependencies 下添加这两行:

implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'

我有同样的问题,在尝试了很多东西之后,这为我解决了这个问题:

1:将googlePlayServicesVersion=12.0.1添加到gradle.properties(我想这是不必要的)

2:在 android/build.gradle 中添加了以下内容:

 allprojects {
    repositories {
    //start here
    configurations.all {
 resolutionStrategy.eachDependency { DependencyResolveDetails details ->
   def requested = details.requested
       if (requested.group == 'com.google.android.gms') {
          details.useVersion '12.0.1'
       }
       if (requested.group == 'com.google.firebase') {
          details.useVersion '12.0.1'
         }
       }
     }
    //end
     jcenter()
       maven {
         url "https://maven.google.com"
       }
     }
 }

我在 https://github.com/idehub/react-native-google-analytics-bridge/wiki/Solution-for-Android-build-failure-issues

中找到了这个

如果您最近更改了 gradle 配置或 androidmanifest.xml 中的任何内容,例如包名称等。那么您必须清理 gradle 文件:

解决这个问题:

cd android
./gradlew clean

这应该会删除您的旧构建目录并生成一个新目录

我遇到了同样的问题,

TLDR:metro 不会显示您必须使用本机工具(例如 XCode 和 Android Studio 才能看到该错误的所有错误。

如何修复:尝试 运行在 android studio 上安装 react-native 应用程序,步骤如下,

  1. yarn 启动或 npx 启动
  2. 打开 Android Studio 上的 /android 文件夹,然后单击 运行 图标(绿色播放图标)

希望一旦它 运行 你会发现你的错误,单独反应本机地铁不会显示这些错误。

在我的例子中,我在 android/build.gradle 中将 targetSdkVersion 设置为 30,而我尝试执行该应用程序的模拟器的要求低于此版本,将其更改为 28 对我有帮助在建筑应用中。如果您的应用程序可以使用 28 作为构建版本,那么您也可以尝试这种方法。

targetSdkVersion = 30 // Before
targetSdkVersion = 28 // After

免责声明:这只是导致此问题的原因之一,降级到 28 可能并不适合所有人,请在实施此解决方案之前确定这一点。