expo-router + expo-sqlite构建Android应用后APK启动空白白屏(无数据库错误)
expo-router + expo-sqlite构建Android应用后APK启动空白白屏(无数据库错误)
嘿,我之前也踩过expo-router加sqlite打包后白屏的坑,dev模式正常但生产APK白屏,而且还没数据库报错的提示,确实挺头疼的。给你几个我亲测有效的排查和解决方向:
一、先检查数据库初始化的时机和异步处理
dev模式下JS引擎的容错性更高,同步执行的初始化可能侥幸跑通,但生产环境必须严格处理异步流程:
- 别在组件渲染前同步执行数据库操作,比如直接在路由组件里写
const db = SQLite.openDatabase('xxx.db')然后立刻执行SQL,这会导致组件还没准备好就卡住,直接白屏。 - 把数据库初始化放在
useEffect里,用loading状态包裹路由内容,确保数据库准备好再渲染页面。举个例子:
// app/_layout.tsx import { useEffect, useState, View, Text } from 'react'; import * as SQLite from 'expo-sqlite'; import { Stack } from 'expo-router'; export default function RootLayout() { const [isDbReady, setIsDbReady] = useState(false); const [initError, setInitError] = useState<string | null>(null); useEffect(() => { async function setupDatabase() { try { const db = SQLite.openDatabase('my-app-db.db'); // 用Promise包裹transaction,确保异步流程完成 await new Promise((resolve, reject) => { db.transaction(tx => { tx.executeSql( 'CREATE TABLE IF NOT EXISTS user (id INTEGER PRIMARY KEY, name TEXT)', [], () => resolve(null), (_, err) => { reject(new Error(err.message)); return true; // 标记错误已处理 } ); }); }); setIsDbReady(true); } catch (err) { setInitError(`初始化数据库失败:${(err as Error).message}`); console.error('DB init error:', err); } } setupDatabase(); }, []); // 加载状态:避免直接白屏,给用户反馈 if (!isDbReady && !initError) { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>正在初始化应用...</Text> </View> ); } // 错误状态:显示具体错误,方便排查 if (initError) { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 20 }}> <Text style={{ color: 'red' }}>{initError}</Text> </View> ); } return <Stack />; }
二、排查expo-router的生产环境兼容性
- 核对你的expo SDK和expo-router版本是否匹配,比如expo 50对应expo-router ~3.4.0,版本不兼容很容易导致路由渲染失败白屏。可以在
package.json里确认依赖版本。 - 检查app目录下的路由文件命名,生产环境对大小写、文件名规则更严格,比如dev里
home.tsx和Home.tsx都能识别,但生产环境可能找不到路由。 - 看看
_layout.tsx里有没有dev专属的逻辑,比如仅在__DEV__模式下才有的调试组件,生产环境没做判断导致报错。
三、调整eas build的打包配置
- 尝试关闭代码压缩测试,有时候minify会误删expo-sqlite的必要模块。修改
eas.json:
{ "build": { "production": { "android": { "minifyEnabled": false, "gradleCommand": ":app:assembleRelease" } } } }
- 重新跑
eas build --profile production --platform android,仔细看打包日志的warning和error,哪怕没有数据库错误,可能还有其他隐藏的模块缺失、权限问题。
四、用开发版APK抓错误日志
最直接的方法是构建开发版APK:
eas build --profile development --platform android
安装到模拟器后,运行expo start --dev-client连接应用,打开调试面板看console.error,就能精准定位白屏的原因,比瞎猜高效多了。
备注:内容来源于stack exchange,提问作者KAI10102
相关产品推荐
相关产品推荐

