当前位置:首页>安卓APP>KMP编译魔法一套代码搞定安卓和iOS程序员狂喜

KMP编译魔法一套代码搞定安卓和iOS程序员狂喜

  • 2026-01-20 12:33:28
KMP编译魔法一套代码搞定安卓和iOS程序员狂喜

同一份 Kotlin 代码如何在 Android 和 iOS 上运行?揭秘 KMP 背后的编译器魔法

深入探讨“一次编写,多端部署”在编译器层面究竟发生了什么

作为一名 Android 开发新手,当我第一次听说 Kotlin Multiplatform (KMP) 时,一个问题一直困扰着我:

“完全相同的 Kotlin 代码,怎么可能同时在 Android 和 iOS 上原生运行?”

我的意思是,Android 使用 JVM,iOS 不用。Android 运行 Dalvik 字节码,iOS 运行 ARM 机器码。它们是完全不同的架构。那么这到底是如何实现的呢?

答案不是“魔法”——而是卓越的编译器工程。一旦我理解了编译层面发生的事情,一切都豁然开朗了。

让我为你揭示幕后的真实运作机制。

根本区别:编译 vs 解释

这里有一个关键见解,可以回答我们的问题:

KMP 不会创建一个到处都能运行的通用二进制文件。相反,Kotlin 编译器会为每个平台创建不同的原生二进制文件。

React Native 和 Flutter 使用运行时桥接或虚拟机。KMP 在编译器层面做了根本不同的事情。

这些框架创建了一个在运行时解释你代码的“包装器”。KMP 的做法则截然不同:

  1. 你编写一次 Kotlin 代码(你的业务逻辑、网络请求、数据库操作)
  2. Kotlin 编译器为每个平台生成原生代码
    • Android → Kotlin/JVM 字节码(就是你已经在写的代码!)
    • iOS → 通过 Kotlin/Native 生成的原生 ARM64 机器码
    • JavaScript → 通过 Kotlin/JS 生成的实际 JS 代码
    • 桌面端 → 原生二进制文件

输出不是一个包装器。它是针对每个平台的实际原生代码。

仔细想想。你的 Kotlin 代码变成了真正的原生 iOS 代码,而不是在桥接中运行的 JavaScript。这就是为什么 KMP 应用的性能与完全原生的应用一样好。

🧩 三层架构

KMP 遵循一个清晰的架构模式,分离关注点:

┌───────────────────────────────────────────────┐   平台特定代码 (UI 层)                            Android: Jetpack Compose/XML                   iOS: SwiftUI/UIKit                          └───────────────────────────────────────────────┘┌───────────────────────────────────────────────┐   共享业务逻辑 (Kotlin 共享模块)                  网络请求数据库业务规则                   └───────────────────────────────────────────────┘┌───────────────────────────────────────────────┐   平台 API 适配器 (expect/actual)                 文件系统网络传感器等                     └───────────────────────────────────────────────┘

关键点:

  1. 你编写共享的 Kotlin 代码,放在一个共享模块中。
  2. Kotlin 编译器有多个后端——每个平台一个。
  3. 每个后端将你的代码编译为原生格式
    • Android → JVM 字节码 (.class 文件 → DEX 字节码)
    • iOS → ARM64/x86_64 机器码 (原生二进制文件)
    • JavaScript → JavaScript 源代码
    • 桌面端 → 原生可执行文件 (通过 LLVM)

核心在于: 这些是相同输入产生的不同输出

你的 Kotlin 源代码经过不同的编译流水线,每条流水线都为其目标平台生成真正的原生代码。没有解释,没有桥接,没有性能损失。

让我向你展示每条流水线中具体发生了什么。

🔧 编译过程:实际发生了什么

让我们写一些简单的 Kotlin 代码,并精确追踪它为 Android 和 iOS 编译时发生了什么。

你的共享 Kotlin 代码

// 在 commonMain/kotlin/UserRepository.kt
classUserRepository {
    fun getUser(id: String): User {
        return User(id, "John Doe")
    }
}

data classUser(val id: String, val name: String)

很简单。现在看看当你构建项目时会发生什么。

📱 编译流水线 #1:Android (Kotlin/JVM)

逐步过程

  1. Kotlin 源代码 (UserRepository.kt)
  2. Kotlin/JVM 编译器 (kotlinc)
  3. JVM 字节码 (.class 文件)
  4. D8 编译器 (Android 构建工具)
  5. DEX 字节码 (.dex 文件)
  6. 打包进 APK/AAB
  7. 在 Android 运行时 (ART) 上运行

字节码的样子

编译后,如果你反编译 Android 字节码,你会看到类似这样的内容:

// 反编译的 JVM 字节码 (简化版)
public final classUserRepository {
    public final User getUser(String id) {
        return new User(id, "John Doe");
    }
}

public final classUser {
    private final String id;
    private final String name;

    public User(String id, String name) {
        this.id =id;
        this.name = name;
    }
    //... getters
}

这就是你的 Android 应用一直运行的代码! KMP 只是复用你已经拥有的编译流水线。

🍎 编译流水线 #2:iOS (Kotlin/Native)

逐步过程

  1. 相同的 Kotlin 源代码 (UserRepository.kt)
  2. Kotlin/Native 编译器 (使用 LLVM)
  3. ARM64 机器码 (原生二进制文件)
  4. 打包为 .framework
  5. Swift/Objective-C 可以直接导入和使用
  6. 直接在 iOS 硬件上运行——没有虚拟机!

这是关键见解:Kotlin 编译器不会创建一个通用二进制文件。它会创建针对每个目标平台优化的平台特定原生代码。

💡 expect/actual 模式

但是平台特定的功能怎么办?当相机或文件系统在每个平台上的工作方式不同时,你如何访问它们?

答案是:expect/actual 声明。

公共代码 (你需要什么)

// 在 commonMain - 共享代码
expect classPlatformLogger {
    fun log(message: String)
}

// 你的共享代码现在可以使用它classAuthService {
    private val logger = PlatformLogger()

    fun login(email: String) {
        logger.log("User logging in:  $email")
        //... 其余的登录逻辑
    }
}

平台实现 (每个平台如何实现)

// 在 androidMain
actual classPlatformLogger {
    actual fun log(message: String) {
        android.util.Log.d("MyApp", message)
    }
}

// 在 iosMain
actual classPlatformLogger {
    actual fun log(message: String) {
        NSLog("MyApp", message)
    }
}

编译时, 每个平台获得其自己的 PlatformLogger 实现。共享代码调用 log(),但实际执行的是平台特定的代码。

🤝 互操作性:iOS 如何调用你的 Kotlin 代码

编译后,你得到一个 .framework 包。但是 Swift 需要调用你的 Kotlin 代码。这是如何工作的?

Kotlin/Native 编译器生成 Objective-C 头文件

对于我们的 UserRepository 例子,编译器会自动生成:

// 自动生成的头文件 (UserRepository.h)
@interface SharedUserRepository : NSObject
- (instancetype)init;
- (SharedUser *)getUserWithId:(NSString *)id;
@end@interface SharedUser : NSObject
@property (readonly) NSString *id;
@property (readonly) NSString *name;
- (instancetype)initWithId:(NSString *)id name:(NSString *)name;
@end

在 Swift 中使用

Swift 现在可以自然地使用你的 Kotlin 代码:

importShared// 你的 KMP 模块

let repository = UserRepository()
let user = repository.getUser(id: "123")
print("User name: \(user.name)")

这里发生了什么?

  1. Swift 调用 Objective-C 互操作层
  2. Objective-C 桥接到你的 Kotlin/Native 代码
  3. 你的 Kotlin 代码作为原生 ARM64 机器码运行
  4. 结果通过互操作层传回
  5. Swift 接收到原生的 Objective-C/Swift 对象

互操作层具有接近零的开销——它只是函数调用转发,没有序列化或消息传递。

追踪一个函数在两个平台上的执行

让我们追踪一个真实的函数通过两个编译流水线,看看其中的差异:

共享的 Kotlin 代码

// 在 commonMain
classCalculator {
    fun add(a: Int, b: Int): Int {
        return a + b
    }
}

Android 编译后 (JVM 字节码)

// 反编译的 JVM 字节码
public final classCalculator {
    public final int add(int a, int b) {
        return a + b;
    }
}

当它在 Android 上运行时:

JVM 栈:
1.'a' 压入栈
2.'b' 压入栈
3. 执行 IADD 指令 (整数加法)
4. 从栈返回结果

iOS 编译后 (ARM64 汇编)

; ARM64 汇编 (简化版)
_Calculator_add:
    add w0, w0, w1    ; w0 = w0 + w1 (32 位加法)
    ret               ; 结果返回到 w0

当它在 iOS 上运行时:

ARM64 寄存器:
1. 参数 'a' 在寄存器 w0 中
2. 参数 'b' 在寄存器 w1 中
3. 执行 ADD 指令 (直接 CPU 操作)
4. 结果保留在 w0 中 (返回寄存器)

注意区别:

  • Android:使用基于栈的 JVM 指令
  • iOS:使用基于寄存器的 ARM 指令

两者都是各自平台的原生代码——没有解释发生!

🧠 内存管理:平台间的差异

编译器层面的另一个关键区别是内存管理方式。

Android (JVM 垃圾回收)

// 你的代码
val user = User("123", "John")
//...// user 超出作用域

发生了什么:

  1. 对象在 JVM 堆上分配
  2. GC 跟踪引用
  3. 当没有引用存在时,GC 标记为待回收
  4. GC 定期运行以释放内存

iOS (自动引用计数)

相同的 Kotlin 代码编译为:

  1. 对象在原生堆上分配
  2. 引用计数器 = 1
  3. 当传递/存储时:计数器++
  4. 当引用丢弃时:计数器--
  5. 当计数器 = 0 时:立即释放

编译器生成不同的内存管理代码!

对于我们的 User 对象,iOS 编译包含:

// 生成的原生代码伪代码
User* user = User_create("123", "John"); // ref_count =1
retain(user);                             // ref_count =2//... 使用 user ...
release(user);                            // ref_count =1
release(user);                            // ref_count =0 释放

你编写相同的 Kotlin 代码,但编译器为每个平台以不同的方式处理内存。

❌ 常见误解澄清

一个常见问题:“如果相同的代码在不同的平台上运行,那不就意味着在运行时发生了一些翻译吗?”

不!原因如下:

React Native/Flutter (运行时桥接): 你的代码 → JavaScript → 桥接 → 原生 API (在运行时解释,有序列化开销)

KMP (编译时转换): 你的代码 → 平台特定的原生代码 (没有运行时翻译,直接执行)

项目结构

myapp/├── commonMain/kotlin/└── Calculator.kt
  ├── androidMain/kotlin/└── MainActivity.kt
  └── iosMain/kotlin/└── iOS.kt

构建输出

运行 ./gradlew build 后:

build/├── android/└── classes/└── Calculator.classJVM 字节码
  └── ios/└── MyApp.framework/├── MyApp               ARM64 二进制文件 (原生机器码)
          ├── Headers/└── MyApp.h        Objective-C 互操作头文件
          └── Info.plist

KMP 不是:

  • ❌ 运行时桥接 (如 React Native)
  • ❌ 虚拟机 (如桌面端的 Java)
  • ❌ 解释器
  • ❌ WebView 包装器

KMP 是:

  • ✅ 一个具有多个后端的编译器
  • ✅ 每个后端为其平台生成原生代码
  • 零运行时开销——没有解释
  • 编译时代码转换,而非运行时翻译

心智模型:

你的 Kotlin 源代码
                           ┌──────────────┼──────────────┐
       JVM 后端     原生后端       JS 后端
            
     JVM 字节码     ARM64 代码    JavaScript
            
      Android ART      iOS CPU       浏览器

相同的源代码 → 不同的编译路径 → 不同的原生输出。

这就是为什么它的性能像原生代码:它本来就是原生代码!

🎯 结论

Kotlin Multiplatform 的魔力其实不是魔法——而是卓越的编译器工程

通过使用多个后端,每个后端都生成真正的原生代码,KMP 让你鱼与熊掌兼得:

  • ✅ 代码共享 (一次编写)
  • ✅ 原生性能 (无开销)
  • ✅ 平台特定优化 (为每个目标量身定制)

当有人问你 “相同的 Kotlin 代码如何在 Android 和 iOS 上运行?” 时,你现在可以解释:

“它并没有。相同的 Kotlin 源代码被编译成针对每个平台的不同原生代码。在 Android 上,它变成 JVM 字节码。在 iOS 上,它通过 LLVM 变成 ARM64 机器码。编译器在构建时完成所有繁重的工作,因此运行时开销为零。”

这才是真正的答案。这也是 KMP 如此强大的原因。

原文链接https://proandroiddev.com/how-does-the-same-kotlin-code-run-on-both-android-and-ios-the-compiler-magic-behind-kmp-b4450f87f7a8

最新文章

随机文章

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