You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:48:08