乐于分享
好东西不私藏

安卓OTA源码解析(二):把Payload包拆开看看里面到底装了哪些秘密

安卓OTA源码解析(二):把Payload包拆开看看里面到底装了哪些秘密

OTA 包虽然是zip包,但是里面的内容payload.bin才是核心,安卓原生中没有上来就对zip包做整包验签,而是对payload.bin处理过程中做的,payload.bin已经是高度压缩内容,在zip包里采用非压缩态存储,update_engine通过外部传参直接裸读zip包。payload.bin中格式是一套自描述的二进制协议。今天我们把它拆开,看看每个字节都是干嘛的。

先回答一个问题

上一篇聊了 update_engine 的整体架构,ActionProcessor 怎么编排流水线,各个 Action 怎么各司其职。

但有个关键问题我需要深入——DeltaPerformer 到底在写什么?

DownloadAction 从指定位置获取一堆数据,DeltaPerformer 一块块往 inactive slot 里塞。这些数据长什么样?它怎么知道"这块东西该写到哪个分区的哪个位置"?

答案就藏在 OTA Payload 的格式里。

四个字母:CrAU

zip包解开后,你拿一个 OTA payload 文件,打开十六进制编辑器,前四个字节:

43 72 41 55

ASCII 就是 CrAU——Chrome Auto Update 的缩写。

对,Android OTA 的 payload 格式直接沿用了 Chrome 浏览器自动更新的格式。Google 内部很早就搞了这套二进制协议,后来 Android 搞 A/B 更新,直接拿来用了,省得重新造轮子。

这四个字节就是"魔数"。任何解析器拿到数据,先看前四个字节是不是 CrAU,不是就直接报错。

整体布局:五段式

一个 OTA payload 文件,从头到尾长这样:

┌─────────────────────────────────────────────────────────┐ │                    Payload 文件                          │ │                                                          │ │  ┌──────────────────────────────────┐                   │ │  │  Payload Header (固定长度)         │                   │ │  │  ├─ magic: "CrAU" (4 bytes)       │                   │ │  │  ├─ major_version: 2 (8 bytes)    │                   │ │  │  ├─ manifest_size (8 bytes)       │                   │ │  │  ├─ metadata_signature_size (4B)  │                   │ │  │  └─ ...                           │                   │ │  └──────────────────────────────────┘                   │ │                                                          │ │  ┌──────────────────────────────────┐                   │ │  │  Manifest (protobuf 序列化)        │                   │ │  │  ├─ DeltaArchiveManifest          │                   │ │  │  │  ├─ PartitionUpdate[]           │                   │ │  │  │  │  ├─ partition_name           │                   │ │  │  │  │  ├─ operations[]             │                   │ │  │  │  │  └─ ...                      │                   │ │  │  │  └─ ...                         │                   │ │  └──────────────────────────────────┘                   │ │                                                          │ │  ┌──────────────────────────────────┐                   │ │  │  Metadata Signature (可选)         │                   │ │  │  └─ 对 Header+Manifest 的签名      │                   │ │  └──────────────────────────────────┘                   │ │                                                          │ │  ┌──────────────────────────────────┐                   │ │  │  Blob Data (实际数据载荷)           │                   │ │  │  ├─ operation 0 的数据              │                   │ │  │  ├─ operation 1 的数据              │                   │ │  │  ├─ ...                            │                   │ │  │  └─ operation N 的数据              │                   │ │  └──────────────────────────────────┘                   │ │                                                          │ │  ┌──────────────────────────────────┐                   │ │  │  Payload Signature                 │                   │ │  │  └─ 对整个 payload 的签名           │                   │ │  └──────────────────────────────────┘                   │ └─────────────────────────────────────────────────────────┘

五大部分,一段扣一段。下面这张图从字节偏移的角度拆解了每一段的细节:

Header → Manifest → Metadata Signature → Blob Data → Payload Signature,五段。

它们之间有严格的顺序依赖——你得先解析 Header 才能知道 Manifest 有多大,得解析 Manifest 才能知道 Blob Data 怎么用。一层扣一层。

Header:24 字节的开门钥匙

Header 是固定长度的,很直接。源码在 payload_metadata.h

cpp

constexpr size_t kDeltaVersionSize = 8; constexpr size_t kDeltaManifestSize = 8; constexpr size_t kDeltaMetadataSigSize = 4; constexpr size_t kDeltaPayloadHeaderSize =      kDeltaVersionSize + kDeltaManifestSize + kDeltaMetadataSigSize; // = 8 + 8 + 4 = 20 bytes(不含 magic)

完整的 Header 结构:

偏移量    大小       字段名                说明 ────────────────────────────────────────────────────── 0x00     4 bytes   magic                 "CrAU" (0x43724155) 0x04     8 bytes   major_version         主版本号,目前固定为 2 0x0C     8 bytes   manifest_size         Manifest 部分的字节数 0x14     4 bytes   metadata_signature_size  元数据签名的字节数 ────────────────────────────────────────────────────── 总共: 24 bytes

ParsePayloadHeader() 的核心逻辑:

cpp

ErrorCode PayloadMetadata::ParsePayloadHeader(     const brillo::Blob& payload,      PayloadMetadataValues* values) {      if (payload.size() < kDeltaMagic.size() + kDeltaPayloadHeaderSize)     return ErrorCode::kDownloadInvalidMetadataMagicString;    // 校验魔数   if (!std::equal(kDeltaMagic.begin(), kDeltaMagic.end(),                    payload.begin()))     return ErrorCode::kDownloadInvalidMetadataMagicString;    uint64_t major_version;   memcpy(&major_version, payload.data() + kDeltaMagic.size(),           sizeof(major_version));   if (major_version != kDeltaVersionMajor)     return ErrorCode::kUnsupportedMajorPayloadVersion;    uint64_t manifest_size;   memcpy(&manifest_size,           payload.data() + kDeltaMagic.size() + kDeltaVersionSize,           sizeof(manifest_size));    uint32_t metadata_sig_size;   memcpy(&metadata_sig_size,           payload.data() + kDeltaMagic.size() + kDeltaVersionSize +           kDeltaManifestSize,           sizeof(metadata_sig_size));    values->manifest_size = manifest_size;   values->metadata_signature_size = metadata_sig_size;   return ErrorCode::kSuccess; }

有个细节:major_version 和 manifest_size 是小端序存储的。x86/ARM 原生字节序,直接 memcpy 就行,不用 ntohl 那套。

Header 解析完,就知道两件事:Manifest 有多大,签名从哪开始。

Manifest:施工图纸

Manifest 是整个 Payload 最核心的部分——一段 protobuf 序列化的二进制数据,描述"要把哪些分区改成什么样"。

proto 定义在 update_metadata.proto,这个文件是 update_engine 的灵魂。

DeltaArchiveManifest

protobuf

message DeltaArchiveManifest {   repeated PartitionUpdate partitions = 2;   optional uint64 max_timestamp = 14;   optional uint64 minor_version = 12;   optional DynamicPartitionMetadata dynamic_partition_metadata = 17;   optional uint64 security_patch_level = 18; }

partitions 是核心中的核心——一个数组,每个元素描述一个分区的更新。

PartitionUpdate

protobuf

message PartitionUpdate {   required string partition_name = 1;   // system, vendor, boot...   optional bool run_postinstall = 4;   optional string postinstall_path = 5;   optional uint64 new_partition_info = 8;   optional uint64 old_partition_info = 9;   repeated InstallOperation operations = 10;  // 操作列表   optional EstimateCowSize estimate_cow_size = 19;  // VABC 相关 }

operations 是真正的干活部分——每个元素就是一个"手术操作",告诉 DeltaPerformer "把这块数据写到哪"。

InstallOperation:12 种手术刀

protobuf

message InstallOperation {   required Type type = 1;   repeated Extent dst_extents = 2;   // 写到哪   optional uint64 data_offset = 3;   // Blob Data 中的偏移   optional uint64 data_length = 4;   repeated Extent src_extents = 5;   // 从哪读(增量更新)   optional uint64 src_length = 6;       optional bytes data_sha256_hash = 8;      enum Type {     REPLACE = 0;          // 直接替换     REPLACE_BZ = 1;       // bzip2 压缩     REPLACE_XZ = 2;       // xz 压缩     MOVE = 3;             // 已废弃     BSDIFF = 4;           // 二进制差分     SOURCE_COPY = 5;      // 相同块直接复制     SOURCE_BSDIFF = 6;    // 源二进制差分     ZERO = 10;            // 清零     DISCARD = 11;         // TRIM/UNMAP     PUFFDIFF = 12;        // puffin 差分(ELF)     LZ4DIFF_BSDIFF = 13;     LZ4DIFF_PUFFDIFF = 14;     ZUCCHINI = 15;        // Chrome 差分   } }

12 种操作类型,各有各的用处:

操作类型           全量/增量    数据来源          适用场景 ──────────────────────────────────────────────────────────── REPLACE          全量        Blob 中的原始数据   小分区、完全不同的块 REPLACE_BZ       全量        bzip2 压缩数据     压缩率高但解压慢 REPLACE_XZ       全量        xz 压缩数据        压缩率最高 SOURCE_COPY      增量        无(直接复制)      新旧完全相同的块 SOURCE_BSDIFF    增量        Blob 中的差分数据   大部分文件修改 PUFFDIFF         增量        puffin 差分数据    ELF 文件优化 LZ4DIFF_BSDIFF   增量        LZ4+bsdiff 差分   压缩分区的差分 LZ4DIFF_PUFFDIFF 增量        LZ4+puffdiff      压缩分区的 ELF ZERO             -           无(清零操作)       需要置零的区域 DISCARD          -           无(TRIM 操作)      SSD/UFS 优化 ZUCCHINI         增量        Chrome 差分数据    Android 13+

增量更新时,SOURCE_COPY 占比通常最高——新旧版本大部分数据是一样的,直接复制就行,连 Blob Data 都不用。这也是为什么增量包比全量包小那么多。

Extent:块级地址

protobuf

message Extent {   optional uint64 start_block = 1;   optional uint64 num_blocks = 2; }

Extent 就是"从第几块开始,连续几块"。分区被切成固定大小的块(通常 4KB),Extent 用块号定位。为什么不用字节偏移?因为块设备本身按块操作,文件系统 I/O 单位也是块,直接用块号省一次转换。

数据结构关系总览

看完各个结构,把它们串起来。从 Payload 二进制文件到最终的块级执行,数据是这样流转的:

DeltaArchiveManifest 包含多个 PartitionUpdate,每个分区包含多个 InstallOperation,每个操作通过 Extent 定址,通过 data_offset 引用 Blob Data

简单说:一个 Manifest → 多个分区 → 多个操作 → 多个块地址 + 数据引用

下面这张图更详细地展示了 protobuf 消息的字段层次:

两层签名:为什么要分两层

OTA Payload 有两层签名:

第一层:Metadata Signature ├─ 签名对象:Header + Manifest ├─ 位置:紧接在 Manifest 之后 └─ 作用:防止 Manifest 被篡改  第二层:Payload Signature ├─ 签名对象:Header + Manifest + Blob Data ├─ 位置:文件末尾 └─ 作用:防止 Blob Data 被篡改

为什么要分两层?

OTA 包动不动几百 MB 甚至几 GB,下载到一半断了很常见。断点续传时,已下载的部分需要校验——但如果签名只在文件末尾,你得下完整个包才能验证。

有了 Metadata Signature,下载一开始就能验证 Manifest。Manifest 里有每个 operation 的数据 SHA256,所以每写一块都能单独校验。

这就是"边下边验"。

验证流程:

1. 读 Header → 解析 metadata_signature_size 2. 读 Manifest(manifest_size 字节) 3. 读 Metadata Signature(metadata_signature_size 字节) 4. 公钥验证签名 → 失败就中止 5. 解析 Manifest → 拿到每个 operation 的信息 6. 下载 Blob Data → 每块数据用 SHA256 校验 7. 下载完 → 验证 Payload Signature

源码在 payload_verifier.cc

cpp

ErrorCode PayloadVerifier::VerifyPayload(     const brillo::Blob& payload,     const brillo::Blob& metadata_signature,     const brillo::Blob& payload_signature) {      brillo::Blob metadata(       payload.begin(),       payload.begin() + kDeltaMagic.size() +        kDeltaPayloadHeaderSize + manifest_size);    if (!VerifySignature(metadata, metadata_signature))     return ErrorCode::kDownloadMetadataSignatureMismatch;    if (!payload_signature.empty()) {     if (!VerifySignature(payload, payload_signature))       return ErrorCode::kDownloadPayloadSignatureMismatch;   }    return ErrorCode::kSuccess; }

为什么用 protobuf 而不是 JSON

Google 选 protobuf,理由很实际:

1.体积小——二进制编码,比 JSON 小 3-10 倍。OTA 包动辄几百 MB,Manifest 本身得尽量小。

2.解析快——不需要字符串解析,直接内存映射。

3.向前兼容——新增字段老版本解析器直接忽略,不会崩。Android 10 加的动态分区信息,老设备照样能解析。

4.schema 严格——`.proto` 文件就是文档,不会有字段名拼错这种低级错误。

代价是可读性差。你不能 cat 一个 payload 文件就看懂 Manifest,得用工具:

bash

dd if=payload.bin bs=1 skip=24 count=<manifest_size> 2>/dev/null | \   protoc --decode=DeltaArchiveManifest update_metadata.proto

小结

Payload 格式看起来就是"Header + protobuf",但每个设计选择都有它的道理:

• 两层签名——Metadata Signature 让断点续传时能提前验证,不用等下完整个包

• 操作抽象——12 种操作类型覆盖全量、增量、清零所有场景

• 块级寻址——Extent 用块号不用字节偏移,和底层 I/O 对齐

• protobuf 选型——二进制编码、向前兼容、schema 严格

每个选择都对应着 OTA 场景下的真实约束。

下一篇聊 ActionProcessor——这条流水线到底怎么运转的,为什么能支持暂停、恢复、取消,为什么一个 Action 失败不会拖垮整个系统。

*源码基于 AOSP system/update_engine,proto 定义在 update_metadata.proto。*

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-07 09:19:08 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/721566.html
  2. 运行时间 : 0.247693s [ 吞吐率:4.04req/s ] 内存消耗:4,694.21kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=2ede83bec981f57a6d1c707067d381ff
  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.001141s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001399s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003842s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000718s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001357s ]
  6. SELECT * FROM `set` [ RunTime:0.001896s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001532s ]
  8. SELECT * FROM `article` WHERE `id` = 721566 LIMIT 1 [ RunTime:0.002491s ]
  9. UPDATE `article` SET `lasttime` = 1780795148 WHERE `id` = 721566 [ RunTime:0.008828s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.001954s ]
  11. SELECT * FROM `article` WHERE `id` < 721566 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001240s ]
  12. SELECT * FROM `article` WHERE `id` > 721566 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002425s ]
  13. SELECT * FROM `article` WHERE `id` < 721566 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.013089s ]
  14. SELECT * FROM `article` WHERE `id` < 721566 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.022843s ]
  15. SELECT * FROM `article` WHERE `id` < 721566 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002303s ]
0.251802s