Expo React Native应用在安卓上崩溃

10

自从我开始使用Expo编写React Native时,我一直在与Expo应用一起使用iOS物理设备。 我从来没有遇到过任何重大问题。

现在,我想开始在Android上修复任何错误,但是当在我的Android物理设备上运行Expo应用程序时,Expo应用程序在下载捆绑包时崩溃(关闭)。 它不会将任何错误打印到我的控制台中,所以我甚至不知道从哪里开始...

这是我的app.json:

{
  "expo": {
    "name": "PointoUserApp",
    "slug": "PointoUserApp",
    "version": "1.0.0",
    "platforms": [
      "ios",
      "android",
      "web"
    ],
    "orientation": "portrait",
    "icon": "./assets/Images/icon.png",
    "splash": {
      "image": "./assets/Images/splash.png",
      "resizeMode":"contain",
      "backgroundColor": "#ffffff"
    },
    "updates": {
      "fallbackToCacheTimeout": 0
    },
    "assetBundlePatterns": [
      "**/*"
    ],
    "ios": {
      "bundleIdentifier": "com.meretc23.PointoUserApp"
    },
    "android":{
      
    },
    "web": {
      "favicon": "./assets/Images/favicon.png"
    }
  }
}

请注意,在Android下它是空的,因为我不知道需要什么。

以下是我的 package.json 文件。

{
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web",
    "eject": "expo eject"
  },
  "dependencies": {
    "@expo-google-fonts/inter": "^0.1.0",
    "@fortawesome/fontawesome-svg-core": "^1.2.30",
    "@fortawesome/free-brands-svg-icons": "^5.14.0",
    "@fortawesome/free-solid-svg-icons": "^5.14.0",
    "@fortawesome/react-native-fontawesome": "^0.2.5",
    "@ionic/react": "^5.3.1",
    "@react-native-community/art": "^1.2.0",
    "@react-native-community/async-storage": "~1.11.0",
    "@react-native-community/datetimepicker": "2.4.0",
    "@react-native-community/masked-view": "0.1.10",
    "@react-navigation/bottom-tabs": "^5.7.3",
    "@react-navigation/material-top-tabs": "^5.2.16",
    "@react-navigation/native": "^5.7.2",
    "@react-navigation/stack": "^5.8.0",
    "@types/react-native-snap-carousel": "^3.8.2",
    "core-js": "^3.6.5",
    "expo": "^38.0.0",
    "expo-constants": "~9.1.1",
    "expo-font": "~8.2.1",
    "expo-linking": "^1.0.3",
    "expo-localization": "~8.2.1",
    "expo-location": "~8.2.1",
    "expo-permissions": "~9.0.1",
    "expo-status-bar": "^1.0.0",
    "firebase": "^7.21.1",
    "geolib": "^3.3.1",
    "i18n-js": "^3.7.1",
    "react": "16.11.0",
    "react-dom": "16.11.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-38.0.2.tar.gz",
    "react-native-check-box": "^2.1.7",
    "react-native-gesture-handler": "~1.6.0",
    "react-native-localize": "^1.4.1",
    "react-native-map-clustering": "^3.3.9",
    "react-native-map-link": "^2.7.17",
    "react-native-maps": "0.27.1",
    "react-native-modal": "^11.5.6",
    "react-native-picker-select": "^8.0.0",
    "react-native-progress": "^4.1.2",
    "react-native-progress-circle": "^2.1.0",
    "react-native-qrcode-svg": "^6.0.6",
    "react-native-reanimated": "~1.9.0",
    "react-native-restart": "0.0.17",
    "react-native-safe-area-context": "^3.0.7",
    "react-native-screens": "~2.9.0",
    "react-native-snap-carousel": "^4.0.0-beta.5",
    "react-native-svg": "12.1.0",
    "react-native-tab-view": "^2.15.1",
    "react-native-web": "~0.11.7",
    "react-navigation": "^4.4.0",
    "react-navigation-stack": "^2.8.2",
    "react-redux": "^7.2.1",
    "redux": "^4.0.5",
    "redux-thunk": "^2.3.0",
    "yargs-parser": "^18.1.3"
  },
  "devDependencies": {
    "@babel/core": "^7.8.6",
    "babel-preset-expo": "^8.2.3"
  },
  "private": true
}

教训:如果你想在iOS和Android上运行应用程序,在你的应用程序太大以至于不知道问题来自哪里之前,一定要同时监控两者。

感谢您的帮助。

6个回答

6

我现在也遇到了同样的问题。在我的情况下,这是由于 Android 自适应图标配置引起的。如果我使用一个真正的 PNG 路径,应用程序将在捆绑下载时崩溃。如果我在 android 下不包括自适应图标,应用程序也会崩溃。唯一不会崩溃的方法是包括与甚至不存在的文件相关联的自适应图标。这将记录一个错误,Expo 找不到该文件,但实际上应用程序会加载。非常奇怪。尝试将此添加到您的 app.json 文件中。

"android": {
  "adaptiveIcon": {
    "foregroundImage": "./assets/anImageThatDoesNotExist.png",
    "backgroundColor": "#FFFFFF"
   }
 },

2
哇,谢谢。这是一个奇怪的修复。得爱软件。 - Quddus George
这是一个解决方法。我们会尝试查找这种行为的原因。 - Suraj Auwal
本来这是一个不错的小技巧,但它会在构建时引发错误,所以并不可行。 - Vito Medlej

2
我也遇到了同样的问题。在互联网上试图找到解决方案,似乎没有一个答案。所以我安装了Android模拟器(我没有Android设备),并在模拟器上安装了该应用程序。我运行了adb logcat -v threadtime,然后发现了这个错误。
12-07 22:28:43.724  5441  5441 E AndroidRuntime: FATAL EXCEPTION: main
12-07 22:28:43.724  5441  5441 E AndroidRuntime: Process: com.danggrianto.eggies, PID: 5441
12-07 22:28:43.724  5441  5441 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.horcrux.svg.SvgView.setTintColor(SvgView.java:189)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.horcrux.svg.SvgViewManager.setTintColor(SvgViewManager.java:98)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.horcrux.svg.SvgViewManager.setTintColor(SvgViewManager.java:32)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.viewmanagers.RNSVGSvgViewManagerDelegate.setProperty(RNSVGSvgViewManagerDelegate.java:62)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.uimanager.ViewManagerPropertyUpdater.updateProps(ViewManagerPropertyUpdater.java:46)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.uimanager.ViewManager.updateProperties(ViewManager.java:84)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.uimanager.ViewManager.createViewInstance(ViewManager.java:188)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.uimanager.ViewManager.createView(ViewManager.java:115)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.uimanager.NativeViewHierarchyManager.createView(NativeViewHierarchyManager.java:281)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute(UIViewOperationQueue.java:194)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.uimanager.UIViewOperationQueue$1.run(UIViewOperationQueue.java:909)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.uimanager.UIViewOperationQueue.flushPendingBatches(UIViewOperationQueue.java:1026)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.uimanager.UIViewOperationQueue.access$2600(UIViewOperationQueue.java:47)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.doFrameGuarded(UIViewOperationQueue.java:1086)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.uimanager.GuardedFrameCallback.doFrame(GuardedFrameCallback.java:29)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.modules.core.ReactChoreographer$ReactChoreographerDispatcher.doFrame(ReactChoreographer.java:175)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.facebook.react.modules.core.ChoreographerCompat$FrameCallback$1.doFrame(ChoreographerCompat.java:85)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1229)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at android.view.Choreographer.doCallbacks(Choreographer.java:899)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at android.view.Choreographer.doFrame(Choreographer.java:827)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at android.os.Handler.handleCallback(Handler.java:942)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:99)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at android.os.Looper.loopOnce(Looper.java:201)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:288)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:7898)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
12-07 22:28:43.724  5441  5441 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

问题出在com.horcrux.svg.SvgView.setTintColor(SvgView.java:189)

我查看了代码,并将react-native-svg升级到最新版本,这解决了我的问题。


1

我刚刚以非常艰难的方式学到了一点经验!我发现安卓对React Native StyleSheet的差异容忍度较低。如果你的Expo Go应用在安卓上崩溃,而在iOS上运行良好,请检查它崩溃的导航阶段。然后仔细查看你的StyleSheet属性。在我的情况下,这是导致错误的原因:

container: {
    flex: 1,
    backgroundColor: '#3f3939',
    alignItems: 'left' // this made my android app crash but not on ios
  },

所以改成了
container: {
    flex: 1,
    backgroundColor: '#3f3939',
    alignItems: 'center'
  },

它能很好地工作。我认为在学习StyleSheet的早期阶段,我犯了这个错误。


我在Android上遇到了类似的问题,在我的情况下,任何alignItems的值都会导致它崩溃。我只需要删除那个样式就不会崩溃了。非常奇怪。 - cakidnyc

1

我的上一个 Expo 项目甚至没有安卓属性,而我的 iOS 属性仅支持平板电脑。尝试完全删除安卓属性。


还请查看这个链接 - PhantomSpooks
我曾经遇到过应用程序突然崩溃而没有任何警告的情况。有时候是因为我需要重置Metro缓存。几乎每次出现错误时,我都没有注意到。你能否发布你的app.is和你最近正在开发的文件? - PhantomSpooks

0
我遇到了完全相同的问题。将您的foregroundImage更改为不存在的位置可以解决问题,但这不是一个好的解决方案,因为您必须在Play商店构建中使用真实图像。当您使用真实图像时,一些用户会遇到与模拟器上看到的相同的立即崩溃问题。
// Not a good solution
"android": {
  "adaptiveIcon": {
    "foregroundImage": "./assets/adaptive-icon.png", // use for release build
    // "foregroundImage": "./assets/anImageThatDoesNotExist.png", // use for development build
    "backgroundColor": "#FFFFFF"
  },

实际问题是我的启动画面图片太大了(约13MB)。我用一个较小的图片(约750KB)替换它,这解决了看似无关的adaptive-icon.png崩溃。检查所有应用程序图像的大小也不会有什么坏处。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接