乐于分享
好东西不私藏

安卓端也来用PP-OCRv6!试试OnnxOCR的Android版

安卓端也来用PP-OCRv6!试试OnnxOCR的Android版

1、写在前面

读过前面文章的小伙伴一定知道我筹划 Android 版本的 OnnxOCR 已经有一段时间了,而且那时候是 PP-OCRv5 刚刚发布。但项目写着写着,v6 就发布了。以我对 Android 版本的定位,它最好能够让用户简单使用,支持多个模型在PC上可以,但是移动终端上还是有些繁琐,所以我最后决定只支持 PP-OCRv6

另外,移动端更在意体积和速度,tiny 模型本来就是为此而生;再把 v5 / v6 两套默认参数、字典和后处理长期并行维护,性价比低了些。C# 桌面端 OnnxOCRSharp 已经把 v6 流水线跑顺了,Android 端直接对齐这一套就挺不错。

前面两篇前奏也不是白写的:

  • 《OnnxOCRAndroid的前奏1》:用官方 MobileNet V2 示例,把 OnnxRuntime Android 的依赖引入、Session、预处理、资源释放摸了一遍
  • 《OpenCV 5 来了》:同样的分类任务换成 OpenCV 5 DNN,同时把官方 Maven 包 org.opencv:opencv:5.0.0 在真机上跑通

推理用 OnnxRuntime、图像处理用 OpenCV——这和 OnnxOCRSharp 的分工一致。今天这篇,就是把两边拼起来,正式开源 OnnxOCRAndroid

Demo 已经支持从相册选图,也支持直接拍照识别。核心引擎拆成了独立的 onnxocr-core 库模块,以后别的 App 也可以本地依赖它。

2、我的成果物

交付物
说明
onnxocr-core
Kotlin OCR 引擎库(AAR),默认 PP-OCRv6 tiny
app
Demo:相册 / 拍照 → 识别 → 画框 → 一键复制
模型资源
det.onnx
 + rec.onnx + 字典,打进 Demo assets
流水线
检测 → 排序 → 透视裁剪 → 批识别 → 置信度过滤

还是采用跟C#端一样的方式,先做出一个能在真机稳定跑通的离线 OCR的MVP,后续继续加能力(方向分类、NNAPI、发布到 Maven 之类),不断完善,不断优化,敏捷开发。

3、核心技术栈

层次
技术
说明
语言
Kotlin 1.9.20
与 Demo / 库统一
推理
onnxruntime-android:1.18.0
官方 Android AAR,CPU + 多线程
图像
org.opencv:opencv:5.0.0
OpenCV 5 官方 Maven,预处理 / 轮廓 / 透视变换
UI
AppCompat + Material
选图、拍照、结果展示
构建
AGP 8.5.0,compileSdk 34
minSdk 24

关键依赖在 onnxocr-core 里:

implementation("com.microsoft.onnxruntime:onnxruntime-android:1.18.0")
api("org.opencv:opencv:5.0.0")

这里有个设计:

  • OnnxRuntime 用 implementation:推理细节封在库里,业务 App 一般碰不到 OrtSession
  • OpenCV 用 api:对外接口是 TextSystem.run(Mat),调用方需要自己持有 Mat、做 bitmapToMat,所以类型必须透传出去

和 C# 端 Microsoft.ML.OnnxRuntime + OpenCvSharp4 是同一思路,只是 Android 的打包方式换成了 Gradle。

4、项目结构

onnxocr-android/
├── app/                         # Demo 应用
│   └── src/main/
│       ├── assets/models/ppocrv6_tiny/
│       │   ├── det/det.onnx
│       │   ├── rec/rec.onnx
│       │   └── ppocrv6_tiny_dict.txt
│       └── java/.../MainActivity.kt
└── onnxocr-core/                # OCR 核心类库
    └── src/main/java/com/linc/onnxocr/
        ├── config/              # OcrOptions(v6 默认参数)
        ├── detection/           # 检测 + DB 后处理
        ├── recognition/         # 识别 + CTC 解码
        ├── imaging/             # 裁剪、排序、嵌套框过滤
        ├── inference/           # OnnxSessionFactory
        ├── model/               # OcrResult / TextLine
        └── pipeline/            # TextSystem 编排

分层尽量对齐 OnnxOCRSharp:算法在 Core,Demo 只负责拿图、展示、复制。模型文件放在 app 的 assets 里——库保持瘦,模型按业务需要自行打包或下载。

5、整体流水线

和桌面端 v6 一样,默认是两阶段(检测 + 识别):

Bitmap / 拍照图
    ↓
decode(最长边≤1600,EXIF 校正)→ Mat
    ↓
TextSystem.run()
    ├─ RGBA/GRAY → BGR
    ├─ TextDetector(det.onnx)→ DbPostProcess
    ├─ BoxSorter(从上到下、从左到右)
    ├─ ImageCropper(透视裁剪;竖排高/宽≥1.5 则转 90°)
    ├─ TextRecognizer(rec.onnx,按宽度比批推理)→ CTC
    └─ dropScore 过滤
    ↓
OcrResult(文本 + 置信度 + 四边形框 + 总耗时)

对外真正要记住的类就两个:OcrOptions 和 TextSystem

6、让我们跑通 Demo

6.1 环境

  • Android Studio Hedgehog(2023.1.1)或更新
  • Kotlin 1.9.20 / AGP 8.5.0
  • 真机

源码地址见文末。打开工程根目录即可。

6.2 同步、编译、安装

  1. Android Studio → Open → 选择 onnxocr-android/
  2. 等待 Gradle Sync(首次会拉 onnxruntime-android 和 opencv:5.0.0
  3. 连接手机,开启 USB 调试,Run app

避坑(国内网络):Gradle 包装器下载慢的话,可以把 gradle-wrapper.properties 的 distributionUrl 换成国内镜像,例如腾讯云:

distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.5-bin.zip

6.3 首次启动复制模型到手机

Demo 首次启动会在后台:

  1. OpenCVLoader.initLocal() 初始化 OpenCV 5
  2. 把 assets 里的三个模型文件拷到 filesDir
  3. OcrOptions.createDefault(context) 指向这些绝对路径
  4. 创建 TextSystem

有个小细节:app 模块给 .onnx 关了压缩——

androidResources {
    noCompress += "onnx"
}

这样 AssetManager.openFd 能拿到准确长度,拷贝时才能判断「本地缓存是否过期」。模型升级后,体积对不上就会自动重拷。

6.4 开始识别吧

  1. 点「选择图片」→ 从相册选择 或 拍照
  2. 预览出现后点「开始识别」
  3. 左侧叠加红色检测框,右侧看置信度和文本
  4. 「复制全部」把结果丢进剪贴板

拍照走系统相机 + FileProvider,照片落在缓存目录,再走和相册同一套解码:最长边控制到 1600、读 EXIF 旋转。

7、核心代码

7.1 默认配置:对齐 pp-ocrv6

OcrOptions :主体参数对齐 OnnxOCRSharp 的 ApplyPpOcrV6Defaults,但长边软限制在手机上改成了 960(桌面 C# 默认是 4000):

dataclassOcrOptions(
val detModelPath: String,
val recModelPath: String,
val dictPath: String,
// PP-OCRv6: short side >= 736 (limit_type=min).
// Soft max-side cap for mobile (desktop C# uses 4000).
val detLimitSideLen: Int = 736,
val detLimitType: String = "min",
val detMaxSideLimit: Int = 960,
val detDbThresh: Float = 0.2f,
val detDbBoxThresh: Float = 0.4f,
val detDbUnclipRatio: Float = 1.4f,
val detDbMaxCandidates: Int = 3000,
val dropScore: Float = 0.5f,
val recBatchNum: Int = 6,
val recImageShape: String = "3, 48, 320",
val numThreads: Int = 4
)
参数
Android 默认
说明
detLimitTypemin
短边拉到目标长度
detLimitSideLen
736
PP-OCRv6 短边规则
detMaxSideLimit960
移动端软封顶,控内存
detDbThresh
0.2
概率图阈值
detDbBoxThresh
0.4
框分数阈值
detDbUnclipRatio
1.4
框膨胀
recImageShape3, 48, 320
识别高度固定 48
numThreads
4
ORT intra-op 线程数

createDefault(context) 只负责拼 filesDir 路径,算法参数全吃默认值——够大多数 Demo / 嵌入场景了。

7.2 TextSystem:编排器

funrun(image: Mat): OcrResult {
val bgr = toBgr(image)   // Utils.bitmapToMat 出来是 RGBA
try {
val boxes = detector.detect(bgr)
if (boxes.isEmpty()) return OcrResult(/* empty */)

val sortedBoxes = BoxSorter.sort(boxes)
val crops = sortedBoxes.map { ImageCropper.crop(bgr, it, options.detBoxType) }
try {
val recResults = recognizer.recognize(crops)
// score >= dropScore 才进结果
return OcrResult(lines = lines, elapsed = ...)
        } finally {
            crops.forEach { it.release() }
        }
    } finally {
if (bgr !== image) bgr.release()
    }
}

几点和桌面端一致、也和前奏里强调过的资源习惯一致:

  • 通道先转成 BGR,再喂检测——C# 端读图也是 BGR,不能随便改成 RGB,否则和训练预处理对不上
  • 裁剪出来的 Mat 必须 release(),OpenCV 不走 Java GC
  • TextSystem 实现 AutoCloseable,页面销毁时记得 close()

7.3 调用方只要这几行

val options = OcrOptions.createDefault(context)
val textSystem = TextSystem(context, options)

val mat = Mat()
Utils.bitmapToMat(bitmap, mat)
val result = textSystem.run(mat)

for (line in result.lines) {
    println("${line.text}${line.score}")
}

mat.release()
textSystem.close()

自定义模型时,把三个绝对路径传进 OcrOptions 即可,不必走 assets 拷贝。

7.4 Demo 侧的后台初始化

privatefuninitOpenCvAndOcr() {
    Thread {
val loaded = try {
            OpenCVLoader.initLocal()
        } catch (_: NoSuchMethodError) {
            OpenCVLoader.initDebug()
        }
// ...
        copyModelsIfNeeded()
val options = OcrOptions.createDefault(this)
        textSystem = TextSystem(this, options)
        runOnUiThread { tvStats.text = "OCR 引擎已就绪 (PP-OCRv6 tiny)" }
    }.start()
}

OpenCV 5 推荐 initLocal(),不再依赖当年的 OpenCV Manager。识别本身也扔到后台线程,避免卡 UI——手机端这点比桌面更敏感。

8、踩过的坑(尤其是 OpenCV 5)

8.1 boxPoints 写法不对,会「检测全空」

这是 Android 移植里最坑、也最值得单独写一节的地方。

一开始按桌面端的直觉,用 Geometry.boxPoints 再 MatOfPoint2f.toArray() 取四个角点。在 OpenCV 5 上会出现一种很阴间的现象:推理有输出、轮廓也找到了,但最终框数永远是 0

原因在 DbPostProcess

boxPoints 写出的是 4×2 的 CV_32FC1 Mat;再当成 MatOfPoint2f 去 toArray()total() 会变成 8,凭空多出四个 (0,0) 点,框分数被打穿,等于没检测到。

正确姿势是直接用 RotatedRect.points()

privatefunrotatedRectPoints(rect: RotatedRect): Array<Point> {
val pts = arrayOf(Point(), Point(), Point(), Point())
    rect.points(pts)
return pts
}

如果你也在 Android / OpenCV 5 上搬 DB 后处理,建议先拿一张简单中文图验证「至少能出框」,再做参数调优。

8.2 轮廓只用 EXTERNAL

findContours 用了 RETR_EXTERNAL,避免孔洞轮廓在手机端碎成多余小框。桌面端可以更宽松,移动端我更偏向少而稳。

8.3 Unclip 做了简化

C# 端优先走 Clipper 多边形膨胀,Android 这边用了更轻的几何扩展。效果在常见文档/菜单/截图场景够用;极端弯曲文本以后再加强也不迟。

9、来看看效果

不同机型差异会很大,我本地真机上的使用请看视频:

评论区给出你的意见,用陆光的话说,就是“追番,拜托啦!”。

10、开源地址

# 源码(Gitee)
https://gitee.com/lincyang/onnxocr-android

# 上游 C# 版
https://github.com/lincyang/OnnxOCRSharp

# 网盘下载APK
公众号聊天输入:onnxocr-android

工程打开即可编译;模型已随 Demo assets 提供。如果想直接下载APK,就对公众号发关键字"onnxocr-android"获取链接,直接安装即可。

欢迎关注公众号「程序员Linc」获取更多技术文章和项目更新!

参考

  1. onnxocr-android 源码:https://gitee.com/lincyang/onnxocr-android
  2. OnnxOCRSharp:https://github.com/lincyang/OnnxOCRSharp
  3. OnnxOCR:https://github.com/jingsongliujing/OnnxOCR
  4. PP-OCRv6 魔塔集合:https://www.modelscope.cn/collections/PaddlePaddle/PP-OCRv6
  5. ONNX Runtime Android:https://onnxruntime.ai/docs/tutorials/mobile/deploy-android.html
  6. OpenCV 5 Android Maven:org.opencv:opencv:5.0.0
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-22 14:31:55 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/870356.html
  2. 运行时间 : 0.180172s [ 吞吐率:5.55req/s ] 内存消耗:5,162.93kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=d221ec90542f3b092eb7588f33c0276b
  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.000593s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000877s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000340s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000241s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000484s ]
  6. SELECT * FROM `set` [ RunTime:0.000208s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000547s ]
  8. SELECT * FROM `article` WHERE `id` = 870356 LIMIT 1 [ RunTime:0.005099s ]
  9. UPDATE `article` SET `lasttime` = 1784701915 WHERE `id` = 870356 [ RunTime:0.025786s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000338s ]
  11. SELECT * FROM `article` WHERE `id` < 870356 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.020122s ]
  12. SELECT * FROM `article` WHERE `id` > 870356 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000761s ]
  13. SELECT * FROM `article` WHERE `id` < 870356 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.006919s ]
  14. SELECT * FROM `article` WHERE `id` < 870356 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001402s ]
  15. SELECT * FROM `article` WHERE `id` < 870356 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.007717s ]
0.181794s