React Native打包APK后Google Sign-in功能崩溃如何排查
生产APK崩溃日志查看方法
- 安卓设备连接电脑,开启USB调试,打开终端执行
adb logcat *:E过滤错误级别的日志,应用崩溃时即可捕获对应的完整崩溃栈信息 - 可以集成轻量的本地崩溃日志收集逻辑,崩溃时把日志写入本地存储,下次应用启动可以读取日志内容排查问题
- 如果是Expo构建的APK,可以在构建时添加
--dev参数打测试包,保留console日志输出,连接adb后就能看到普通打印的报错信息
现有代码问题定位
目前代码中可直接定位的问题如下,其中大部分都会直接引发应用崩溃:
- 属性拼写错误:
Platform.os写法错误,正确属性为Platform.OS(首字母大写),此处会导致取值为undefined,GoogleSignIn初始化时clientId传值异常,触发原生层崩溃,这是最可能的闪退原因 - useEffect无依赖数组:当前useEffect没有传入依赖数组,会导致
initAsync和checklogin无限重复调用,多次触发GoogleSignIn初始化,引发不可预期的原生异常 - 静默登录无异常捕获:
signInSilentlyAsync调用没有添加try catch捕获异常,一旦静默登录失败抛出未处理的异步异常,会直接导致应用崩溃 - 错误对象直接赋值给字符串状态:
setalertmebad(error)直接把错误对象赋值给字符串类型的状态,渲染时如果直接展示该状态,会触发类型异常报错 - 依赖库已废弃:
expo-google-sign-in库早已停止维护,不支持新版Expo SDK和安卓12+系统,如果你的项目SDK版本高于43,使用该库必然会出现兼容问题导致崩溃
修复参考代码
// 1. 修改useEffect,添加空依赖数组仅执行一次 useEffect(() => { initAsync(); checklogin(); }, []); // 2. 修正Platform.OS拼写,添加getUserDetails异常捕获 const initAsync = async () => { try { await GoogleSignIn.initAsync({ // 修正首字母大写 clientId: Platform.OS === "android" ? androidClientId : iosClientId, }); getUserDetails(); } catch (e) { console.log(e); } }; const getUserDetails = async () => { try { const user = await GoogleSignIn.signInSilentlyAsync(); } catch (e) { console.log('静默登录失败', e); } }; // 3. 错误转成字符串再赋值给状态 catch (error) { setalertmebad(error.message || JSON.stringify(error)); setalertmegood(""); }
如果修复后仍存在崩溃问题,建议替换为目前官方推荐的@react-native-google-signin/google-signin库,适配性更稳定。
内容的提问来源于stack exchange,提问作者orenzo foods
相关产品推荐
相关产品推荐

