【发布时间】:2021-05-27 15:51:37
【问题描述】:
我的 React Native 应用程序的 Android 版本在独立构建和 Expo 客户端的 navigation.navigate() 上崩溃。这是一个世博会管理项目,仅供参考。
这是我学到的——这些错误只发生在 Android 上,而不会发生在 iOS 上。它们仅在从我的应用程序上的一个非常特定的组件(如下所示)导航时发生,在其他任何地方都不会发生。它与被导航到的屏幕无关,因为删除这些屏幕的整个代码并只是导航到一个简单的<View> </View> 仍然会导致崩溃。此外,上面提到的相同屏幕可以从其他屏幕导航到没有任何问题。这些崩溃发生的原因没有明确的原因,但我的理解是它们是本机崩溃。我在开发中没有收到任何错误,也没有针对这些错误的哨兵报告。我唯一设法获得的是来自我的独立构建的堆栈跟踪。
这是堆栈跟踪:
pid: 0, tid: 0 >>> com.nothing.nothingapp <<<
backtrace:
#00 pc 000000000039fe88 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::GLFunctorDrawable::onDraw(SkCanvas*)+984)
#00 pc 00000000004410f0 /system/lib64/libhwui.so (SkDrawable::draw(SkCanvas*, SkMatrix const*)+88)
#00 pc 000000000070d684 /system/lib64/libhwui.so (SkGpuDevice::drawDrawable(SkDrawable*, SkMatrix const*, SkCanvas*)+300)
#00 pc 00000000003590d0 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::drawContent(SkCanvas*) const+1252)
#00 pc 000000000035a1c4 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::forceDraw(SkCanvas*) const+200)
#00 pc 00000000004410f0 /system/lib64/libhwui.so (SkDrawable::draw(SkCanvas*, SkMatrix const*)+88)
#00 pc 0000000000359124 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::drawContent(SkCanvas*) const+1336)
#00 pc 000000000035a1c4 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::forceDraw(SkCanvas*) const+200)
#00 pc 00000000004410f0 /system/lib64/libhwui.so (SkDrawable::draw(SkCanvas*, SkMatrix const*)+88)
#00 pc 0000000000359124 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::drawContent(SkCanvas*) const+1336)
#00 pc 000000000035a1c4 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::forceDraw(SkCanvas*) const+200)
#00 pc 00000000004410f0 /system/lib64/libhwui.so (SkDrawable::draw(SkCanvas*, SkMatrix const*)+88)
#00 pc 0000000000359124 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::drawContent(SkCanvas*) const+1336)
#00 pc 000000000035a1c4 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::forceDraw(SkCanvas*) const+200)
#00 pc 00000000004410f0 /system/lib64/libhwui.so (SkDrawable::draw(SkCanvas*, SkMatrix const*)+88)
#00 pc 0000000000359124 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::drawContent(SkCanvas*) const+1336)
#00 pc 000000000035a1c4 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::forceDraw(SkCanvas*) const+200)
#00 pc 00000000004410f0 /system/lib64/libhwui.so (SkDrawable::draw(SkCanvas*, SkMatrix const*)+88)
#00 pc 0000000000359124 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::drawContent(SkCanvas*) const+1336)
#00 pc 000000000035a1c4 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::forceDraw(SkCanvas*) const+200)
#00 pc 00000000004410f0 /system/lib64/libhwui.so (SkDrawable::draw(SkCanvas*, SkMatrix const*)+88)
#00 pc 0000000000359124 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::drawContent(SkCanvas*) const+1336)
#00 pc 000000000035a1c4 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::forceDraw(SkCanvas*) const+200)
#00 pc 00000000004410f0 /system/lib64/libhwui.so (SkDrawable::draw(SkCanvas*, SkMatrix const*)+88)
#00 pc 00000000003590fc /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::drawContent(SkCanvas*) const+1296)
#00 pc 000000000035a1c4 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::forceDraw(SkCanvas*) const+200)
#00 pc 00000000004410f0 /system/lib64/libhwui.so (SkDrawable::draw(SkCanvas*, SkMatrix const*)+88)
#00 pc 00000000003590fc /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::drawContent(SkCanvas*) const+1296)
#00 pc 000000000035a1c4 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::RenderNodeDrawable::forceDraw(SkCanvas*) const+200)
#00 pc 00000000003a59a8 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::SkiaPipeline::renderLayersImpl(android::uirenderer::LayerUpdateQueue const&, bool)+688)
#00 pc 00000000003a7110 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::SkiaPipeline::renderFrame(android::uirenderer::LayerUpdateQueue const&, SkRect const&, std::__1::vector<android::sp<android::uirenderer::RenderNode>, std::__1::allocator<android::sp<android::uirenderer::RenderNode> > > const&, bool, android::uirenderer::Rect const&, sk_sp<SkSurface>, SkMatrix const&)+124)
#00 pc 00000000003a45b4 /system/lib64/libhwui.so (android::uirenderer::skiapipeline::SkiaOpenGLPipeline::draw(android::uirenderer::renderthread::Frame const&, SkRect const&, SkRect const&, android::uirenderer::LightGeometry const&, android::uirenderer::LayerUpdateQueue*, android::uirenderer::Rect const&, bool, android::uirenderer::LightInfo const&, std::__1::vector<android::sp<android::uirenderer::RenderNode>, std::__1::allocator<android::sp<android::uirenderer::RenderNode> > > const&, android::uirenderer::FrameInfoVisualizer*)+416)
#00 pc 00000000003ad224 /system/lib64/libhwui.so (android::uirenderer::renderthread::CanvasContext::draw()+1080)
#00 pc 00000000003af460 /system/lib64/libhwui.so (_ZNSt3__110__function6__funcIZN7android10uirenderer12renderthread13DrawFrameTask11postAndWaitEvE3$_0NS_9allocatorIS6_EEFvvEEclEv$c303f2d2360db58ed70a2d0ac7ed911b+524)
#00 pc 000000000039d928 /system/lib64/libhwui.so (android::uirenderer::WorkQueue::process()+208)
#00 pc 00000000003bfb44 /system/lib64/libhwui.so (android::uirenderer::renderthread::RenderThread::threadLoop()+88)
#00 pc 000000000001553c /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+320)
#00 pc 0000000000014db0 /system/lib64/libutils.so (thread_data_t::trampoline(thread_data_t const*)+408)
#00 pc 00000000000b61f4 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64)
#00 pc 0000000000050e24 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)
这是我从中导航的组件:
import React, { useState, useEffect, useContext } from 'react';
import { StyleSheet, Text, View, Image, TouchableOpacity, FlatList, TextInput, Alert } from 'react-native';
import { Button, Overlay } from 'react-native-elements';
import { WebView } from 'react-native-webview';
import { AntDesign, MaterialIcons } from '@expo/vector-icons';
import { useNavigation } from '@react-navigation/native';
import { useIsFocused } from "@react-navigation/native";
import * as Linking from 'expo-linking';
import * as Updates from 'expo-updates';
import Clipboard from 'expo-clipboard';
import pure from 'recompose/pure'
import moment from 'moment';
import HeartButton from './Features/HeartButton';
import StarBar from './Features/StarBar';
import Comment from './NewsfeedComment';
import Reply from './NewsfeedReply';
import LoginModal from '../Login/LoginModal'
import Modal from 'react-native-modal';
import { NewsfeedContext } from '../../App';
import { HeartsContext } from '../../App';
import { CommentsContext } from '../../App';
import { NotificationsContext } from '../../App';
import { ProfileDataContext } from '../../App';
import { ProfileContext } from '../../App';
import { UserProfileContext } from '../../App';
import { UserProfileDataContext } from '../../App';
import { MovieLikesContext } from '../../App';
const Posts = (props) => {
// Initializes Navigator
const navigation = useNavigation();
if (props.data.active == true) {
return (
<>
{props.data.feedTypeDesc == "recommendation" && props.data.recommendation.active == true ?
<View>
{/* Code for the component, everything is working fine */}
</View>
: null}
{/* List Modal */}
<View>
<Modal
isVisible={showList}
onBackdropPress={() => setShowList(false)}
onModalHide={() => { if (newSwitch == true) { toggleCreateListModal() } }}>
<View style={{ flex: 0.5, backgroundColor: '#fff' }}>
<Text style={{ textAlign: 'center', marginTop: 10, fontSize: 18 }}>Add to my list</Text>
<FlatList
style={styles.innerScroll}
data={[...props.listData, { addGroup: true }]}
style={{ marginLeft: 40, marginTop: 10 }}
renderItem={({ item }) => {
if (item.addGroup) {
return (
<View style={{ marginRight: 8, marginVertical: 4 }}>
<TouchableOpacity onPress={() => switchModal()}>
<View style={styles.newbox}>
<Text style={styles.newname}>New List</Text>
</View>
</TouchableOpacity>
</View>);
}
return (
<View style={{ marginRight: 8, marginVertical: 4 }}>
<TouchableOpacity onPress={() => addList(item)}>
<View style={styles.box}>
<Text style={styles.name}>{item.name ? item.name : 'Name'}</Text>
</View>
</TouchableOpacity>
</View>
)
}}
keyExtractor={(item) => `item-${item.id}`}
numColumns={3}
/>
</View>
</Modal>
</View>
{/* Create List Modal */}
<View>
<Modal
isVisible={showCreate}
onBackdropPress={() => setShowCreate(false)}>
<View style={{ flex: 0.32, backgroundColor: '#fff', borderRadius: 10 }}>
<Text style={{ textAlign: 'center', marginTop: 20 }}>Create a new list</Text>
<View style={{ marginTop: 40, marginLeft: 30, width: '80%', backgroundColor: '#f0f0f0', borderRadius: 4 }}>
<TextInput
placeholder="Da..."
placeholderTextColor="#6b6b6bfd"
autoCapitalize='none'
value={name}
onChangeText={(newValue) => setName(newValue)}
style={{ padding: 3, fontSize: 16, color: '#000' }} />
</View>
<View style={{ flexDirection: 'row', justifyContent: 'space-around', marginTop: 40 }}>
<TouchableOpacity>
<Text>
Cancel
</Text>
</TouchableOpacity>
<TouchableOpacity onPress={createList}>
<Text>
Create
</Text>
</TouchableOpacity>
</View>
</View>
</Modal>
</View>
{/* Edit Post Modal */}
<View>
<Modal
isVisible={showMain}
onBackdropPress={() => setShowMain(false)}>
<View style={{ flex: 0.32, backgroundColor: '#fff', borderRadius: 10 }}>
<Text style={{ textAlign: 'center' }}>Options</Text>
<TouchableOpacity onPress={() => Linking.openURL('http://www.facebook.com/sharer/sharer.php?u=https://panodime.com/watch/sharing/' + props.data.id)}>
<Text style={{ textAlign: 'left' }}>Share post to Facebook</Text>
</TouchableOpacity>
<TouchableOpacity onPress={() => Linking.openURL('http://www.twitter.com/intent/tweet?text=https://panodime.com/watch/sharing/' + props.data.id)}>
<Text style={{ textAlign: 'left' }}>Share post to Twitter</Text>
</TouchableOpacity>
<TouchableOpacity onPress={() => { Clipboard.setString("https://panodime.com/watch/sharing/" + props.data.id); Alert.alert("Success!", "Link has been copied") }}>
<Text>Share this post elsewhere: <Text selectable={true}>https://panodime.com/watch/sharing/{props.data.id}</Text></Text>
</TouchableOpacity>
{loggedIn ?
<>
{props.profileData.login == props.data.user ?
<>
<TouchableOpacity onPress={() => navigation.navigate("EditRecommendation", { props: props })}>
<Text style={{ textAlign: 'left' }}>Edit Post</Text>
</TouchableOpacity>
<TouchableOpacity onPress={() => deleteReccomendation()}>
<Text style={{ textAlign: 'left' }}>Delete Post</Text>
</TouchableOpacity>
</>
: null}
</>
: null
}
</View>
</Modal>
</View>
{/* Login Gate */}
<View>
<Modal
isVisible={showLogin}
onBackdropPress={() => setShowLogin(false)}>
<View style={{ flex: 0.95, backgroundColor: '#fff' }}>
<Button
buttonStyle={{ width: 40, height: 40, padding: 0, backgroundColor: '#fff', borderRadius: 10 }}
icon={{ name: 'close', color: '#000', size: 20 }}
onPress={() => setShowLogin(false)}
/>
<LoginModal />
</View>
</Modal>
</View>
</>
);
} else {
return null
}
}
export default pure(Posts);
这是被导航到的屏幕:
function Movie({ route, navigation }) {
const authContext = React.useContext(AuthContext);
const { props } = route.params;
return (
<View style={{ flex: 1, backgroundColor: '#fff' }}>
<MovieScreen props={props} token={authContext.authState.token} status={authContext.authState.status} />
</View>
);
}
这是我的 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": {
"@material-ui/core": "^4.11.0",
"@react-native-async-storage/async-storage": "^1.13.2",
"@react-native-community/clipboard": "^1.5.1",
"@react-native-community/masked-view": "0.1.10",
"@react-navigation/bottom-tabs": "^5.9.2",
"@react-navigation/compat": "^5.3.0",
"@react-navigation/native": "^5.8.0",
"@react-navigation/stack": "^5.10.0",
"@reduxjs/toolkit": "^1.5.0",
"@sentry/browser": "^6.0.2",
"@sentry/react-native": "^2.1.1",
"@sentry/tracing": "^6.0.2",
"expo": "^40.0.1",
"expo-activity-feed": "^0.9.1",
"expo-app-loading": "^1.0.1",
"expo-av": "~8.7.0",
"expo-clipboard": "~1.0.1",
"expo-constants": "~9.3.3",
"expo-facebook": "~9.1.0",
"expo-google-app-auth": "^8.1.3",
"expo-google-sign-in": "~8.4.0",
"expo-image-picker": "~9.2.0",
"expo-linear-gradient": "~8.4.0",
"expo-notifications": "~0.8.2",
"expo-splash-screen": "~0.8.1",
"expo-status-bar": "~1.0.3",
"expo-updates": "~0.4.1",
"install": "^0.13.0",
"moment": "^2.29.1",
"native-base": "^2.13.14",
"npm": "^6.14.11",
"react": "16.13.1",
"react-dom": "16.13.1",
"react-native": "https://github.com/expo/react-native/archive/sdk-40.0.1.tar.gz",
"react-native-anchor-carousel": "^3.1.2",
"react-native-animatable": "^1.3.3",
"react-native-elements": "^3.0.0-alpha.1",
"react-native-gesture-handler": "~1.8.0",
"react-native-modal": "^11.5.6",
"react-native-reanimated": "~1.13.0",
"react-native-restart": "0.0.17",
"react-native-safe-area-context": "3.1.9",
"react-native-screens": "~2.15.2",
"react-native-skeleton-content": "^1.0.20",
"react-native-star-rating": "^1.1.0",
"react-native-swipe-modal-up-down": "^1.0.9",
"react-native-swiper": "^1.6.0",
"react-native-swiper-flatlist": "^2.0.4",
"react-native-vector-icons": "^7.1.0",
"react-native-video": "^5.1.1",
"react-native-vimeo": "^0.3.0",
"react-native-web": "~0.13.12",
"react-native-webview": "11.0.0",
"react-native-webview-bridge": "^0.40.1",
"react-navigation": "^1.6.1",
"react-redux": "^7.2.2",
"recompose": "^0.30.0",
"redux": "^4.0.5",
"sentry-expo": "^3.0.4"
},
"devDependencies": {
"@babel/core": "~7.9.0",
"redux-devtools": "^3.7.0"
},
"private": true
}
【问题讨论】:
标签: android react-native expo react-native-android react-navigation