乐于分享
好东西不私藏

单 Activity 架构在大型 App 的落地:Navigation Compose、深链路与多模块导航的真实问题

单 Activity 架构在大型 App 的落地:Navigation Compose、深链路与多模块导航的真实问题

📰 每日要闻

• 亚洲股市普涨,AI 热情盖过伊朗协议不确定性,韩国 KOSPI 创历史新高(Investing.com 中文,2026-06-01)

• 鲍威尔获肯尼迪勇气奖,卸任美联储主席后首次公开发声暗批白宫越界(Investing.com 中文,2026-05-31)

• Anthropic 估值超过 OpenAI,AI 大模型公司估值格局再度生变(少数派派早报,2026-06-01)

• 苹果代工厂开造人形机器人,一场押注未来的产能大迁移(36 氪硬氪观察,2026-05-31)

• AMD 新策略:让用户继续用老款硬件,强调 AI 算力下沉的价值(The Verge,2026-05-30)

最近几年,"单 Activity 架构"在 Android 圈子里几乎成了一个默认共识。官方文档推它,Compose 体系把它推到主舞台,团队一开新项目,第一句话经常就是"咱们这次直接单 Activity 吧"。

但真把它落到一个有六七十个模块、上百个页面、要支持外部深链路、要支持冷启动直达任意页面的大型 App 里,你会发现单 Activity 远不是"把 Activity 换成 Composable"这么简单。它会暴露出一连串小项目里根本不会遇到的问题——ViewModel 范围怎么定、进程被杀后 BackStack 怎么还原、不同模块之间怎么互相导航、外部 deep link 进来到底落在哪个 NavGraph 上、Predictive Back 手势如何与多页面共享元素动画兼容。

这篇文章不讲"什么是单 Activity 架构"——官方文档和入门教程已经写烂了。我想聊的是,把它放进一个真实大型项目时,有哪些坑你必须先想清楚,以及 2026 年这个时间点,Navigation Compose(含 Type-Safe Navigation)的能力边界究竟在哪。

一、为什么大家都开始抛弃多 Activity

先把动机捋清楚。多 Activity 架构不是"过时",而是它在解决一些不存在的问题,同时把另一些问题搞得很复杂。

多 Activity 时代每开一个页面就 startActivity,看起来逻辑清晰,但代价很重:

启动开销:Activity 是系统级组件,要走 ActivityManagerService、Instrumentation、生命周期回调一整套流程,冷启动比 Fragment / Composable 慢一个数量级

共享数据麻烦:跨 Activity 传对象只能 Parcelable / Serializable / 进程内单例,类型安全弱、容易内存泄漏

转场动画受限:早期共享元素动画各种坑,Material Motion 在 Activity 间几乎不可用

BackStack 难管:TaskAffinity、launchMode、FLAG_ACTIVITY_* 组合起来语义复杂,QA 永远能找出新 case

状态恢复成本高:每个 Activity 都要单独处理 onSaveInstanceState,跨 Activity 的状态一致性需要额外协调

单 Activity 架构本质上是把"页面"这个概念从系统组件下沉为应用层概念。整个 App 只有一个 Activity 作为窗口宿主,所有 UI 都在 Composable 或 Fragment 中渲染,导航由应用自己控制。这样系统层只需要管理一个 Activity 的生命周期,应用层完全掌握自己的页面栈。

但这个"完全掌握"是双刃剑——以前系统帮你处理的事,现在你得自己处理,包括状态恢复、进程死亡重建、外部 intent、深链路。

二、Navigation Compose 现在到哪一步了

2026 年这个时间点,Navigation Compose 已经走到了 2.8+ 的版本,最大的变化是 Type-Safe Navigation 全面成熟,开发体验比早期那种 string route 强了一大截。

核心 API 长这样:

@Serializable
data class HomeRoute(val tab: String = "feed")

@Serializable
data class DetailRoute(val itemId: Long, val from: String? = null)

@Composable
fun AppNav() {
    val nav = rememberNavController()
    NavHost(navController = nav, startDestination = HomeRoute()) {
        composable<HomeRoute> { entry ->
            val args = entry.toRoute<HomeRoute>()
            HomeScreen(tab = args.tab, onItemClick = { id ->
                nav.navigate(DetailRoute(itemId = id, from = "home"))
            })
        }
        composable<DetailRoute> { entry ->
            val args = entry.toRoute<DetailRoute>()
            DetailScreen(itemId = args.itemId, from = args.from)
        }
    }
}

对比早期那种 "detail/{id}?from={from}" 字符串路由,Type-Safe 的好处是:

• 编译期就能发现参数缺失或类型错配

• IDE 能补全、能跳转、能重构

• 复杂参数(嵌套对象、可空字段)不再需要自己手撸 NavType

• 默认值、序列化规则统一由 kotlinx.serialization 接管

但 Type-Safe 不解决业务上的难题。它只是把"传参"这件事做漂亮了,真正麻烦的几个问题——多模块、深链路、进程死亡——还是要架构层自己想办法。

三、第一个真问题:多模块怎么互相导航

大型项目通常按业务拆模块——feature_home、feature_detail、feature_profile、feature_pay…… 这些模块在 Gradle 层是平级的,互相不依赖。这时候问题来了:feature_home 要跳到 feature_detail 的某个页面,怎么跳?

如果你直接在 feature_home 里 import DetailRoute,那 feature_home 就强耦合了 feature_detail,模块拆分等于白拆。

常见的解法有三种思路:

Route 抽到独立模块:建一个 navigation_api 模块,里面只放 Route data class,所有 feature 模块都依赖它。这是最简单的,但当 Route 数量多了,这个模块会变得很臃肿,而且任何 Route 改动都会触发全量编译

每个 feature 提供自己的 NavGraph 扩展函数:feature_detail 暴露一个 NavGraphBuilder.detailGraph(),但 Route 还是要外露给调用方。问题没本质变化

用接口 + 依赖注入解耦:feature_home 通过一个 DetailNavigator 接口跳转,由 app 模块负责把 NavController 注入进来

第三种是目前比较推崇的做法,配合 Hilt / Koin 注入很自然:

// :navigation-api 模块
interface DetailNavigator {
    fun openDetail(itemId: Long, from: String? = null)
}

// :feature-home 里
class HomeViewModel @Inject constructor(
    private val detailNav: DetailNavigator
) : ViewModel() {
    fun onItemClicked(id: Long) {
        detailNav.openDetail(id, from = "home")
    }
}

// :app 模块里把 NavController 与 Navigator 绑定
@Composable
fun AppRoot() {
    val nav = rememberNavController()
    val detailNav = remember(nav) {
        object : DetailNavigator {
            override fun openDetail(itemId: Long, from: String?) {
                nav.navigate(DetailRoute(itemId, from))
            }
        }
    }
    CompositionLocalProvider(LocalDetailNavigator provides detailNav) {
        AppNav(nav)
    }
}

这种方式的代价是:你要为每个跨模块跳转写接口,模块多了接口数量也多。但好处是 feature 模块对"导航"这件事完全不感知,未来要把页面换成 WebView、换成动态化模块、换成 Compose Multiplatform,调用方不用改一行代码。

选哪种取决于团队规模和模块数量。10 个以下模块直接 Route 抽公共模块就行;20 个以上模块,接口 + DI 的代价才回得了本。

四、第二个真问题:进程被杀,BackStack 怎么还原

这是单 Activity 架构最容易被低估的问题。多 Activity 时代,Activity 栈是系统管的,进程被杀重建后系统会帮你按之前的 task 重新拉起 Activity。单 Activity 之后,整个页面栈都在 NavController 内部,进程一死,全没了。

Navigation Compose 默认会保存 BackStack 到 SavedStateHandle,看起来很美好——直到你试着杀进程再回来。常见的问题有:

ViewModel 状态丢了:BackStack 还原了,但 ViewModel 是新建的,里面的网络数据、用户输入全清零

Composable 状态丢了:rememberSaveable 能救一部分,但只针对可序列化的状态。复杂业务状态(比如一个本地图片选择器选了哪些文件)不重写不行

跳板页问题:用户在登录页停留时进程死掉,重启后落回登录页,但用户原本要去的页面不见了

这几件事的核心是:你必须明确区分哪些状态属于"页面瞬时",哪些属于"会话持续",哪些属于"持久化"。

实操上的几条经验:

• 网络请求结果的缓存放 Repository / DataStore,不要只放在 ViewModel 里。这样进程重建后能从持久层快速恢复

• 表单输入用 SavedStateHandle 显式保存,不要依赖 rememberSaveable。SavedStateHandle 由 ViewModel 持有,跟着 NavBackStackEntry 走,恢复粒度更可控

• "原本要去哪"这种意图状态要序列化保存。比如"未登录用户点击收藏,登录后回到收藏页",应该把目标 Route 存进 SavedStateHandle,登录成功后恢复

• 测试方法很简单:开发者选项打开"不保留活动",再加一个 ADB 命令 adb shell am kill 包名,每个关键页面都试一遍

五、第三个真问题:深链路与外部 Intent

单 Activity 架构下,所有外部入口都集中到 MainActivity 一个点,听起来很优雅,实际写起来一堆细节。

典型的外部入口包括:浏览器深链路(http/https)、自定义 scheme(myapp://)、推送通知点击、Widget 点击、AppShortcut、其他 App 通过 Intent 跳过来。每个入口都要正确路由到对应页面,并且要考虑当前 BackStack 状态。

几个具体场景:

App 已经在前台,深链路从外部进来:MainActivity 收到 onNewIntent,需要把 BackStack 切换到目标页面,但要不要清除中间页?这是产品决定,不是技术决定。常见做法是从 Intent 里读取一个标志位,决定是 push 还是 replace

App 完全没启动,冷启动直接进深链路:MainActivity 在 onCreate 时拿到 Intent,但此时 NavController 还没初始化。要么用 LaunchedEffect 等 NavController 准备好再 navigate,要么把 deep link 解析下沉到 Compose 层用 LocalActivityResultRegistryOwner 之类的方式监听

用户从深链路落到详情页,按返回键应该回到哪:这是产品体验题。常见策略是构造"虚拟 BackStack"——比如详情页背后补一个 Home,让用户按返回不会直接退出 App

Navigation Compose 提供了 deepLink DSL,但它只能解决"URL 解析成 Route"这一小段,上面三个场景都需要架构层补逻辑。

composable<DetailRoute>(
    deepLinks = listOf(
        navDeepLink<DetailRoute>(
            basePath = "https://app.example.com/detail"
        )
    )
) { entry ->
    val args = entry.toRoute<DetailRoute>()
    DetailScreen(args.itemId)
}

// MainActivity
override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    deepLinkChannel.tryEmit(intent)
}

@Composable
fun AppNav(nav: NavHostController) {
    LaunchedEffect(Unit) {
        deepLinkChannel.collect { intent ->
            if (shouldClearBackStack(intent)) {
                nav.popBackStack(HomeRoute(), inclusive = false)
            }
            nav.handleDeepLink(intent)
        }
    }
}

关键是:把 Intent 当成事件流而不是 Activity 状态。MainActivity 只负责把 Intent 转发给 Compose 层,由 Compose 层根据当前 BackStack 决定怎么响应。这样测试起来也容易。

六、第四个真问题:ViewModel 范围怎么定

多 Activity 时代 ViewModel 范围比较直观——绑 Activity 或者绑 Fragment。单 Activity 之后选项变多了:

• 绑 Activity:所有页面共享,跟全局单例几乎没区别

• 绑 NavBackStackEntry:跟着具体页面走,离开页面就销毁

• 绑某个 Nested NavGraph:在一组相关页面间共享,比如下单流程里的几个步骤

• 绑全局 Hilt SingletonComponent:跨页面长期存在

大部分场景用 NavBackStackEntry 范围就够了,但下单流程、表单分步、引导流这种"几个页面共享一份草稿状态"的场景,需要 Nested NavGraph 范围。

@Serializable
object CheckoutGraph

navigation<CheckoutGraph>(startDestination = AddressRoute) {
    composable<AddressRoute> { entry ->
        val parentEntry = remember(entry) {
            navController.getBackStackEntry(CheckoutGraph)
        }
        val checkoutVm: CheckoutViewModel = hiltViewModel(parentEntry)
        AddressScreen(checkoutVm)
    }
    composable<PaymentRoute> { entry ->
        val parentEntry = remember(entry) {
            navController.getBackStackEntry(CheckoutGraph)
        }
        val checkoutVm: CheckoutViewModel = hiltViewModel(parentEntry)
        PaymentScreen(checkoutVm)
    }
}

这里有个容易踩的坑:remember(entry) 不能省。如果直接 val parentEntry = navController.getBackStackEntry(CheckoutGraph),每次重组都会去查一次,性能下降不说,还容易拿到不一致的 Entry。

七、第五个真问题:转场动画与 Predictive Back

Compose 的 AnimatedContent + sharedElement 让转场动画终于变成了一行代码的事,但如果你要做出"看起来像系统级"的体验,还是要花心思。Android 14+ 引入的 Predictive Back(预测式返回手势)让这件事更复杂——用户拖到一半时,你的页面要正确"预览"返回目标。

Navigation Compose 在 2.8+ 已经原生支持 Predictive Back,但你需要做几件事:

• 关闭老的 OnBackPressedCallback 自定义拦截,统一用 NavController 的能力

• 给所有 composable 设置合理的 enterTransition / exitTransition / popExitTransition

• Shared Element 在跨 NavBackStackEntry 之间用 SharedTransitionLayout,注意 key 不要重复

• 测试时一定要在真机上拖动手势查看效果,模拟器上 Predictive Back 行为不一致

转场动画有一个反直觉的事:动画时长越短,用户感知的"流畅"越强。很多团队喜欢用 400ms 的缓动,看起来"高级",但实际用起来会觉得 App 很慢。建议主线导航 200ms 左右,模态弹层 150ms,长按或确认类操作可以稍长。

八、单 Activity 不是银弹:什么时候要保留多 Activity

说了这么多优点,要给单 Activity 浇点冷水。下面这几种场景,多 Activity 反而是更合理的选择:

独立的"轻量入口":比如分享面板、扫一扫、悬浮窗后落地的小页面,这些页面通常需要独立的 task affinity,进出要干净,多 Activity 更合适

跨进程的页面:比如把视频播放放到独立进程隔离崩溃,单 Activity 做不到

需要不同主题/启动模式的入口:比如透明 Activity、Dialog 主题、singleTask 等

大型 App 的子产品:比如某个收银台、某个 H5 容器,团队边界清晰、复用性差,单独一个 Activity 容器反而方便

合理的姿势是"主航道单 Activity,特殊场景多 Activity",不要为了"纯粹"把所有东西都塞进一个 Activity。

九、迁移路径建议

如果你手上是一个老项目要迁单 Activity,不要尝试一次到位。常见的渐进路径:

• 第一步:把所有 startActivity 调用收敛到一个 Navigator 接口,原实现仍然是 startActivity。这一步不改架构,只是把"导航"这件事从分散的代码里收上来

• 第二步:选一个相对独立的业务流程(比如个人中心),改造成单 Activity 内的 Navigation Compose,验证模板

• 第三步:逐步把高频流程迁过来,每迁一个流程同步把 deep link、推送、shortcut 跑通

• 第四步:剩下的边角页面(设置、关于、调试入口)保留多 Activity,没必要硬迁

整个过程可能跨 3-6 个版本,期间会出现"两套架构并存"的混乱期。这是正常的,关键是 Navigator 接口在两套架构上都能工作,业务代码不用改。

写在最后

单 Activity 架构火了几年,从早期 Fragment + Navigation 到今天的 Navigation Compose + Type-Safe Routes,工具链比当年好太多了。但工具链好不等于架构问题就消失了——多模块解耦、状态恢复、深链路、ViewModel 范围、转场动画、Predictive Back,这些事情每一件都需要架构层显式想清楚。

这些问题没有标准答案,每个团队的选择会随着 App 规模、团队习惯、产品形态变化。但如果你正在评估要不要走单 Activity,至少先把上面这几个问题在自家场景里推一遍,再决定是否动手。

下一篇将继续 WebView 深度探索系列——讲 WebView 性能优化与稳定性治理,包括预热、复用池、内存治理与崩溃防护。

如果觉得有帮助,欢迎点赞、转发、关注,下次更新不迷路。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-06 13:09:09 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/719702.html
  2. 运行时间 : 0.161855s [ 吞吐率:6.18req/s ] 内存消耗:4,742.96kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=d9f003567a16899564c1a758a2053697
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001015s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001682s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000747s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000645s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001300s ]
  6. SELECT * FROM `set` [ RunTime:0.000575s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001686s ]
  8. SELECT * FROM `article` WHERE `id` = 719702 LIMIT 1 [ RunTime:0.003417s ]
  9. UPDATE `article` SET `lasttime` = 1780722549 WHERE `id` = 719702 [ RunTime:0.005109s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000674s ]
  11. SELECT * FROM `article` WHERE `id` < 719702 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.002848s ]
  12. SELECT * FROM `article` WHERE `id` > 719702 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001118s ]
  13. SELECT * FROM `article` WHERE `id` < 719702 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002288s ]
  14. SELECT * FROM `article` WHERE `id` < 719702 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002488s ]
  15. SELECT * FROM `article` WHERE `id` < 719702 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004841s ]
0.165823s