乐于分享
好东西不私藏

RK 开机LOGO&视频配置与源码解析

RK 开机LOGO&视频配置与源码解析

需求

替换 想要切换的logo,以及启动音频。

  • 音乐需求: 在每一个文件夹部门添加 audio.wav音频文件
  • 使用视频作为启动LOGO
maotai

配置开机LOGO

display_subsystem: display-subsystem {		compatible = "rockchip,display-subsystem";		ports = <&vop_out>, <&vopl_out>;		route {			route_dsi: route-dsi {				status = "disabled";				logo,uboot = "logo.bmp";				logo,kernel = "logo_kernel.bmp";				logo,mode = "center";				charge_logo,mode = "center";				connect = <&vp1_out_dsi>;			};			route_edp: route-edp {				status = "disabled";				logo,uboot = "logo.bmp";				logo,kernel = "logo_kernel.bmp";				logo,mode = "center";				charge_logo,mode = "center";				connect = <&vp1_out_edp>;			};			route_hdmi: route-hdmi {				status = "disabled";				logo,uboot = "logo.bmp";				logo,kernel = "logo_kernel.bmp";				logo,mode = "center";				charge_logo,mode = "center";				connect = <&vp0_out_hdmi>;			};			route_dp0: route-dp0 {				status = "disabled";				logo,uboot = "logo.bmp";				logo,kernel = "logo_kernel.bmp";				logo,mode = "center";				charge_logo,mode = "center";				connect = <&vp0_out_dp0>;			};			route_rgb: route-rgb {				status = "disabled";				logo,uboot = "logo.bmp";				logo,kernel = "logo_kernel.bmp";				logo,mode = "center";				charge_logo,mode = "center";				connect = <&vp2_out_rgb>;			};		};	};
  • 再对应的设备数中,开启对应的设备数开关。
&route_dsi {	status = "okay";};//配置dsi显示开机logo&route_dsi {	status = "okay";	connect = <&vp1_out_dsi>;};//edp&route_edp {	status = "okay";	connect = <&vp0_out_edp>;};//hdmi&route_hdmi {	status = "okay";	connect = <&vp0_out_hdmi>;};

开机静态图片图片

  • 更换kernel 下对应的文件,将文件转换为bmp文件格式。
  • 再 rk-3576.dtsi 中
  • rockchip 平台区分 Ubootkernel 两个阶段显示LOGO,
    • logo.bmp 为 Uboot 阶段
    • logo_kernel.bmp 为Kernel阶段。
    • 图片格式需要与原本的LOGO图片格式移植,bmp,bit位深。

开机动态图片

源码位置:开机与关闭 存放目录:  device/rockchip/common/bootshutdown/bootanimation.zip 

  • 在 common的目录也存在 device/rockchip/common/bootanimation.zip 分析优先级,此为 android

Android支持 bootanimation.mp4 以及 bootanimation.zip 两种文件格式的开机动画。

已知问题:mp4格式开机动画,系统第一次上电启动会显示开机动画。

两种文件同时存在播放 mp4 优先级 比 zip高。具体优先级 见

  • frameworks/base/cmds/bootanimation/BootAnimation.cpp

打开配置

(SDK)$ vim device/rockchip/common/BoardConfig.mk-BOOT_SHUTDOWN_ANIMATION_RINGING ?= false+BOOT_SHUTDOWN_ANIMATION_RINGING ?= true

动画拷贝实现

(SDK)$ cat device/rockchip/common/bootshutdown/bootshutdown.mkCUR_PATH := device/rockchip/common/bootshutdownHAVE_BOOT_ANIMATION := $(shell test -f $(CUR_PATH)/bootanimation.zip && echo yes)HAVE_SHUTDOWN_ANIMATION := $(shell test -f $(CUR_PATH)/shutdownanimation.zip && echo yes)ifeq ($(HAVE_BOOT_ANIMATION), yes)PRODUCT_COPY_FILES += $(CUR_PATH)/bootanimation.zip:$(TARGET_COPY_OUT_SYSTEM)/media/bootanimation.zipendififeq ($(HAVE_SHUTDOWN_ANIMATION), yes)PRODUCT_COPY_FILES += $(CUR_PATH)/shutdownanimation.zip:$(TARGET_COPY_OUT_SYSTEM)/media/shutdownanimation.zipendif
  • bootanimation.zip
  • 官方解释:详见源码位置:frameworks/base/cmds/bootanimation/FORMAT.md

The system selects a boot animation zipfile from the following locations, in order:

/system/media/bootanimation.zip/oem/media/bootanimation.zip

zipfile layout

The bootanimation.zip archive file includes:

desc.txt - a text filepart0  \part1   \  directories full of PNG frames...     /partN  /

desc.txt format

desc.txt 格式

The first line defines the general parameters of the animation: 第一行定义动画的通用参数:

WIDTH HEIGHT FPS [PROGRESS] 

  • WIDTH: animation width (pixels)
  • WIDTH: 动画宽度(像素)
  • HEIGHT: animation height (pixels)
  • HEIGHT: 动画高度(像素)
  • FPS: frames per second, e.g. 60
  • FPS: 每秒帧数,例如 60
  • PROGRESS: whether to show a progress percentage on the last part
  • PROGRESS: 是否在最后一部分显示进度百分比
    • The percentage will be displayed with an x-coordinate of 'c', and a
    • 百分比将以 x 坐标 'c' 显示, y-coordinate set to 1/3 of the animation height. y 坐标设置为动画高度的 1/3。

Next, provide an optional line for dynamic coloring attributes, should dynamic coloring be used. 接下来,如果使用动态着色,提供可选的动态着色属性行。 See the dyanmic coloring section for format details. Skip if you don't use dynamic coloring. 有关格式详情,请参阅动态着色部分。如果不使用动态着色,则跳过。

It is followed by a number of rows of the form: 随后是若干行,格式如下:

TYPE COUNT PAUSE PATH [FADE [#RGBHEX [CLOCK1 [CLOCK2]]]] 

  • TYPE: a single char indicating what type of animation segment this is:
  • TYPE: 单个字符,表示此动画段的类型:
    • p -- this part will play unless interrupted by the end of the boot
    • p -- 除非被开机过程结束所打断,否则会播放该部分
    • c -- this part will play to completion, no matter what
    • c -- 无论发生什么情况,都会完整播放至结束
    • f -- same as p but in addition the specified number of frames is being faded out while
    • f -- 与 p 类似,但额外会在被打断时对指定的帧数进行淡出,同时 continue playing. Only the first interrupted f part is faded out, other subsequent f继续播放。只有第一个被打断的 f 部分会被淡出,后续的 fparts are skipped 部分会被跳过
  • COUNT: how many times to play the animation, or 0 to loop forever until boot is complete
  • COUNT: 动画播放次数,或设为 0 表示循环播放直到开机完成
  • PAUSE: number of FRAMES to delay after this part ends
  • PAUSE: 该部分结束后延迟的帧数
  • PATH: directory in which to find the frames for this part (e.g. part0)
  • PATH: 查找该部分帧图片的目录路径(例如 part0
  • FADE:(ONLY FOR f TYPE) number of frames to fade out when interrupted where 0 means
  • FADE:(仅用于 f 类型) 打断时淡出的帧数,0 表示immediately which makes f ... 0 behave like p and doesn't count it as a fading _立即_,这使得 f ... 0 的行为与 p 相同,且不将其计为淡出 part 部分
  • RGBHEX:(OPTIONAL) a background color, specified as #RRGGBB
  • RGBHEX:(可选) 背景颜色,格式为 #RRGGBB
  • CLOCK1, CLOCK2:(OPTIONAL) the coordinates at which to draw the current time (for watches):
  • CLOCK1, CLOCK2:(可选) 绘制当前时间的坐标(适用于手表):
    • c -- will centre the text
    • c -- 将文本居中显示
    • n -- will position the text n pixels from the start; left edge for x-axis, bottom edge
    • n -- 将文本定位在距起始位置 n 像素处;x 轴为左边缘,y 轴为底部边缘 for y-axis
    • -n -- will position the text n pixels from the end; right edge for x-axis, top edge
    • -n -- 将文本定位在距末端位置 n 像素处;x 轴为右边缘,y 轴为顶部边缘 for y-axis
    • Examples:
    • 示例:
    • -24 or c -24 will position the text 24 pixels from the top of the screen,
    • -24 或 c -24 将文本定位于距屏幕顶部 24 像素处, centred horizontally 水平居中
    • 16 c will position the text 16 pixels from the left of the screen, centred
    • 16 c 将文本定位于距屏幕左侧 16 像素处, vertically 垂直居中
    • -32 32 will position the text such that the bottom right corner is 32 pixels above
    • -32 32 将文本定位于右下角距边缘上方 32 像素、 and 32 pixels left of the edges of the screen 左侧 32 像素的位置
    • If only CLOCK1 is provided it is the y-coordinate of the clock and the x-coordinate
    • 如果只提供 CLOCK1,则它是时钟的 y 坐标,x 坐标默认为 cdefaults to c(居中)
    • If both CLOCK1 and CLOCK2 are provided then CLOCK1 is the x-coordinate and CLOCK2 is
    • 如果同时提供 CLOCK1 和 CLOCK2,则 CLOCK1 为 x 坐标,CLOCK2 为 y 坐标 the y-coodinate
    • Values can be either a positive integer, a negative integer, or c
    • 值可以是正整数、负整数或 c

There is also a special TYPE, $SYSTEM, that loads /system/media/bootanimation.zip还有一种特殊的 TYPE,即 $SYSTEM,它会加载 /system/media/bootanimation.zipand plays that. 并播放其中的动画。

clock_font.png

时钟字体图片

The file used to draw the time on top of the boot animation. The font format is as follows: 用于在开机动画上绘制时间的文件。字体格式如下:

  • The file specifies glyphs for the ascii characters 32-127 (0x20-0x7F), both regular weight and
  • 该文件定义了 ASCII 字符 32-127(0x20-0x7F)的字形,包括常规字重和 bold weight. 粗体字重。
  • The image is divided into a grid of characters
  • 图片被划分为字符网格
  • There are 16 columns and 6 rows
  • 共有 16 列和 6 行
  • Each row is divided in half: regular weight glyphs on the top half, bold glyphs on the bottom
  • 每行被分为两半:上半部分为常规字形,下半部分为粗体字形
  • For a NxM image each character glyph will be N/16 pixels wide and M/(12*2) pixels high
  • 对于 N×M 的图片,每个字符字形的宽度为 N/16 像素,高度为 M/(12*2) 像素

progress_font.png

进度字体图片

The file used to draw the boot progress in percentage on top of the boot animation. The font format 用于在开机动画上绘制开机进度百分比的文件。字体格式 follows the same specification as the one described for clock_font.png. 与上述 clock_font.png 的规格相同。

loading and playing frames

加载和播放帧

Each part is scanned and loaded directly from the zip archive. Within a part directory, every file 每个部分都直接从 zip 压缩包中扫描和加载。在每个部分的目录中,除以下文件外 (except trim.txt and audio.wav; see next sections) is expected to be a PNG file that represents (trim.txt 和 audio.wav;见后续章节),所有其他文件都应为 PNG 格式,代表该部分中的一帧 one frame in that part (at the specified resolution). For this reason it is important that frames be (以指定分辨率)。因此,帧文件必须按顺序命名 named sequentially (e.g. part000.pngpart001.png, ...) and added to the zip archive in that (例如 part000.pngpart001.png 等),并按此顺序添加到 zip 压缩包中。 order.

trim.txt

裁剪配置文件

To save on memory, textures may be trimmed by their background color.  trim.txt sequentially lists 为了节省内存,纹理可以按背景颜色进行裁剪。trim.txt 按顺序列出 the trim output for each frame in its directory, so the frames may be properly positioned. 其目录中每一帧的裁剪输出结果,以便正确定位各帧位置。 Output should be of the form: WxH+X+Y. Example: 输出格式应为:WxH+X+Y。示例:

713x165+388+914     708x152+388+912     707x139+388+911     649x92+388+910

If the file is not present, each frame is assumed to be the same size as the animation. 如果该文件不存在,则假定每帧的大小与动画相同。

audio.wav

音频文件

Each part may optionally play a wav sample when it starts. To enable this, add a file 每个部分开始时可选择播放一个 wav 音频片段。要启用此功能,请在相应目录中添加一个名为 with the name audio.wav in the part directory.audio.wav 的文件。

exiting

退出机制

The system will end the boot animation (first completing any incomplete or even entirely unplayed 系统将在开机完成时结束开机动画(首先完成所有未完成或甚至完全未播放的 parts that are of type c) when the system is finished booting. (This is accomplished by setting 类型为 c 的部分)。(这是通过将系统属性 service.bootanim.exit 设置为非零字符串来实现的。) the system property service.bootanim.exit to a nonzero string.)

protips

实用技巧

PNG compression

PNG 压缩

Use zopflipng if you have it, otherwise pngcrush will do. e.g.: 如果有 zopflipng 就用它,否则使用 pngcrush。例如:

for fn in *.png ; do    zopflipng -m ${fn}s ${fn}s.new && mv -f ${fn}s.new ${fn}    #or: pngcrush -q ....done

Some animations benefit from being reduced to 256 colors: 某些动画可以通过降低到 256 色来减小体积:

pngquant --force --ext .png *.png#alternatively: mogrify -colors 256 anim-tmp/*/*.png

creating the ZIP archive

创建 ZIP 压缩包

cd <path-to-pieces>zip -0qry -i \*.txt \*.png \*.wav @ ../bootanimation.zip *.txt part*

Note that the ZIP archive is not actually compressed! The PNG files are already as compressed 请注意,ZIP 压缩包实际上并未进行压缩!PNG 文件已经尽可能压缩了, as they can reasonably get, and there is unlikely to be any redundancy between files. 文件之间不太可能存在冗余数据。

Dynamic coloring

动态着色

Dynamic coloring is a render mode that draws the boot animation using a color transition. 动态着色是一种使用颜色渐变来绘制开机动画的渲染模式。 In this mode, instead of directly rendering the PNG images, it treats the R, G, B, A channels 在这种模式下,它不会直接渲染 PNG 图片,而是将输入图片的 R、G、B、A 通道 of input images as area masks of dynamic colors, which interpolates between start and end colors 作为动态颜色的区域蒙版,根据动画进度在起始色和结束色之间进行插值过渡。 based on animation progression.

To enable it, add the following line as the second line of desc.txt: 要启用此功能,请将以下行作为 desc.txt 的第二行:

dynamic_colors PATH #RGBHEX0 #RGBHEX1 #RGBHEX2 #RGBHEX3

  • PATH: file path of the part to apply dynamic color transition to.
  • PATH: 应用动态颜色渐变的部分的文件路径。 Any part before this part will be rendered in the start colors. 此部分之前的所有部分将使用起始颜色渲染。 Any part after will be rendered in the end colors. 此部分之后的所有部分将使用结束颜色渲染。
  • RGBHEX1: the first start color (masked by the R channel), specified as #RRGGBB.
  • RGBHEX1: 第一种起始颜色(由 R 通道遮罩控制),格式为 #RRGGBB
  • RGBHEX2: the second start color (masked by the G channel), specified as #RRGGBB.
  • RGBHEX2: 第二种起始颜色(由 G 通道遮罩控制),格式为 #RRGGBB
  • RGBHEX3: the thrid start color (masked by the B channel), specified as #RRGGBB.
  • RGBHEX3: 第三种起始颜色(由 B 通道遮罩控制),格式为 #RRGGBB
  • RGBHEX4: the forth start color (masked by the A channel), specified as #RRGGBB.
  • RGBHEX4: 第四种起始颜色(由 A 通道遮罩控制),格式为 #RRGGBB

The end colors will be read from the following system properties: 结束颜色将从以下系统属性读取:

  • persist.bootanim.color1
  • persist.bootanim.color2
  • persist.bootanim.color3
  • persist.bootanim.color4

When missing, the end colors will default to the start colors, effectively producing no color 如果缺少这些属性,结束颜色将默认为起始颜色,实际上不产生颜色渐变效果。 transition.

Prepare your PNG images so that the R, G, B, A channels indicates the areas to draw color1, 准备你的 PNG 图片,使 R、G、B、A 通道分别指示绘制 color1、color2、color3 和 color4 的区域。 color2, color3 and color4 respectively.

  • part0文件夹: 动画拆分的图片,格式为png
  • desc.txt 文件
  • 第一行
    • 1024 600 表示展示出来的动画宽度和高度,最好和设备尺寸相同。通过wm size可以获取
    • 1 表示每秒播放1帧图片,(最好不要超过30 )
  • 第二行
    • p : 固定p 开头,播放直到 开机完成
    • COUNT 1 : 播放次数,0代表无线循环直到开机结束
    • PAUSE 0 part 结束后暂停帧数
    • PATH part0 路径
    • 最后一行需为空行
1024 600 1p 0 0 part0
part文件

开机视频

在 device/rockchip/rk3576/BoardConfig.mk 中添加视频宏

开启配置BOOT_VIDEO_ENABLE ?= true关闭配置:BOOT_VIDEO_ENABLE ?= false

视频放置位置

  • 将准备好的开机视频素材 bootanimation.ts 放置到 device/rockchip/common/bootvideo/bootanimation.ts

默认代码中按文件名称识别 bootanimation.ts ,其它格式可直接重命名为 bootanimation.ts即可,不需要转格式。

  • 编译成功后会将开机视频素材 bootanimation.ts 拷贝到 system分区的 media目录下。
  • 视频要求:
    • 理论上只要box上媒体中心本地应用能够正常播放的视频都可以作为开机视频有效素材
    • 对于性能较低的CPU,使用低画质视频素材。

开机视频控制

  • persist.sys.bootvideo.enable : 控制开机视频功能使能
    • true : 开启开机视频
    • false: 关闭 开机视频
  • persist.sys.bootvideo.showtime : 控制开机视频功能使能属性
    • -2 : 默认值,表示自动读取视频本身时间来作为播放视频的时间长度,保证视频播完
    • -1 : 表示不设置时间,系统通知结束就马上结束播放
    • 其它 int 值:表示具体要播放的时间,单位 ,如果为 20秒,播放完之后,会停留在视频画面最后一帧。
  • persist.sys.bootvideo.vol : 设置开机视频音量属性
    • 参数 1-100,表示音量大小,最大音量为 100 刻度
  • Debug属性:延迟开机视频播放属性: persist.sys.bootvideo.delaytime
    • 参数大于等于0即可,表示延迟时间,单位 秒,如 5,为延迟 5s
    • device/rockchip/common/bootvideo/bootvideo.mk
CUR_PATH := device/rockchip/common/bootvideoHAVE_BOOT_VIDEO := $(shell test -f $(CUR_PATH)/bootanimation.ts && echo yes)ifeq ($(HAVE_BOOT_VIDEO), yes)PRODUCT_COPY_FILES += $(CUR_PATH)/bootanimation.ts:product/media/bootanimation.tsendifPRODUCT_PROPERTY_OVERRIDES += \        persist.sys.bootvideo.enable=true \        persist.sys.bootvideo.showtime=-2

问题

配置动态启动logo 并没有生效

  • 查看文件是否存在   – 文件存在
POS:/system/media # lsbootanimation.zip
  • 分辨率配置问题? 分辨率问题,换成合适的尺寸 即可。

源码解析

  • 在Android的启动流程中init会启动 bootanim。
android启动流程
  • frameworks/base/cmds/bootanimation 实现开机/关机动画的完整实现模块
  • bootanimation_main.cpp : main函数
  • BootAnimation: 负责动态效果
  • audioplay : 负责 音频的播放。
视频LOGO启动处理流程

何时启动

  • frameworks/native/services/surfaceflinger/surfaceflinger.rc
service surfaceflinger /system/bin/surfaceflinger    class core animation    user system    group graphics drmrpc readproc    capabilities SYS_NICE    onrestart restart --only-if-running zygote    task_profiles HighPerformance
  • frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp#main()
执行初始化
  • frameworks[1]/native[2]/services[3]/surfaceflinger[4]/SurfaceFlinger.cpp[5] 手动调用 bootanim 启动
// 在 SurfaceFlinger 初始化之后 调用下方函数voidSurfaceFlinger::init()FTL_FAKE_GUARD(kMainThreadContext)// During boot, offload `initBootProperties` to another thread. `property_set` depends on// `property_service`, which may be delayed by slow operations like `mount_all --late` in// the `init` process. See b/34499826 and b/63844978.voidSurfaceFlinger::initBootProperties(){    property_set("service.sf.present_timestamp", mHasReliablePresentFences ? "1" : "0");if (base::GetBoolProperty("debug.sf.boot_animation"s, true) &&        (base::GetIntProperty("debug.sf.nobootanimation"s, 0) == 0)) {// Reset and (if needed) start BootAnimation.        property_set("service.bootanim.exit""0");        property_set("service.bootanim.progress""0");// 通知init进程去启动名为 bootanim 的系统服务。        property_set("ctl.start""bootanim");     }

在Android 的属性系统中,以ctl. 开头的属性是具有特殊功能,被称为控制属性。它们是专门用来管理init.rc 文件中定义的服务的生命周期

  • ctl.start: 请求启动
  • ctl.stop:请求关闭

从使用体验来看  ChatGPT 还是很强的,本来想让它生成相关过程,选中了图片,就生成了如下。

请求过程

bootanim.rc

  • 默认是关闭的,通过 外部调用 会启动。
service bootanim /system/bin/bootanimation    class core animation    user graphics    group graphics audio    disabled    oneshot    ioprio rt 0    task_profiles MaxPerformance

bootanimation_main.cpp

#define LOG_TAG "BootAnimation"#include<stdint.h>#include<inttypes.h>#include<binder/IPCThreadState.h>#include<binder/ProcessState.h>#include<binder/IServiceManager.h>#include<cutils/properties.h>#include<sys/resource.h>#include<utils/Log.h>#include<utils/SystemClock.h>#include"BootAnimation.h"#include"BootAnimationUtil.h"#include"audioplay.h"usingnamespace android;intmain(){// 设置进程优先级    setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);// 判断系统是否 跳过开机画面bool noBootAnimation = bootAnimationDisabled();    ALOGI_IF(noBootAnimation,  "boot animation disabled");if (!noBootAnimation) {sp<ProcessState> proc(ProcessState::self());        ProcessState::self()->startThreadPool(); //启动Binder线程池// create the boot animation object (may take up to 200ms for 2MB zip)// 创建SurfaceComposerClient,判断是否关机动画,触发onFirstRef,// 预加载动画 preloadAnimation// loadAnimation() : 加载zip并解析desc.txt // sp<T>强智能指针,其在初始化时会触发onFirstRef方法调用。        sp<BootAnimation> boot = new BootAnimation(audioplay::createAnimationCallbacks());// 轮询等待SurfaceFlinger服务就绪        waitForSurfaceFlinger();// 启动线程 调用readyToRun() 进入 threadLoop()        boot->run("BootAnimation", PRIORITY_DISPLAY);        ALOGV("Boot animation set up. Joining pool.");// 主线程进入 Binder循环。        IPCThreadState::self()->joinThreadPool();    }return0;}

BootAnimationUtil

  • 判断是否允许 播放 声音: playSoundsAllowed 通过 系统配置信息。
  • bootAnimationDisabled
  • waitForSurfaceFlinger

audioplay

  • create: 初始化播放wav音频的引擎
  • playClip :
  • setPlaying :

BootAnimation

bootanimation文件
  • onFirstRef()
voidBootAnimation::onFirstRef(){status_t err = mSession->linkToComposerDeath(this);    SLOGE_IF(err, "linkToComposerDeath failed (%s) ", strerror(-err));if (err == NO_ERROR) {// Load the animation content -- this can be slow (eg 200ms)// called before waitForSurfaceFlinger() in main() to avoid wait        ALOGD("%sAnimationPreloadTiming start time: %" PRId64 "ms",                mShuttingDown ? "Shutdown" : "Boot", elapsedRealtime());// 预准备阶段,        preloadAnimation();        ALOGD("%sAnimationPreloadStopTiming start time: %" PRId64 "ms",                mShuttingDown ? "Shutdown" : "Boot", elapsedRealtime());    }}boolBootAnimation::preloadAnimation(){// 找 BootAnimation文件    findBootAnimationFile();if (!mZipFileName.isEmpty()) {        mAnimation = loadAnimation(mZipFileName);return (mAnimation != nullptr);    }returnfalse;}
查找文件
boolBootAnimation::findBootAnimationFileInternal(conststd::vector<std::string> &files){for (conststd::string& f : files) {if (access(f.c_str(), R_OK) == 0) {            mZipFileName = f.c_str();returntrue;        }    }returnfalse;}

threadLoop主循环线程

  • video() 视频播放核心。
boolBootAnimation::threadLoop(){bool result;    initShaders();//add for boot video function    mStartbootanimaTime = 0;    mBootVideoTime = -1;// 如果没有 bootanimation文件,用android logo默认文件if (mVideoAnimation) {        result = video(); // 调用 playAnimation 遍历所有 part    } else {// We have no bootanimation file, so we use the stock android logo// animation. if (mZipFileName.isEmpty()) {            ALOGD("No animation file");            result = android(); //加载两张Android的图片无限循环        } else {            result = movie();        }    } ......return result;}boolBootAnimation::movie(){if (mAnimation == nullptr) {        mAnimation = loadAnimation(mZipFileName);    }//opengl    ...    playAnimation(*mAnimation);    ...    releaseAnimation(mAnimation);returnfalse;}

playAnimation

  • frameworks[6]/base[7]/cmds[8]/bootanimation[9]/BootAnimation.cpp[10]
boolBootAnimation::playAnimation(const Animation& animation){constsize_t pcount = animation.parts.size();    ...for (size_t i=0 ; i<pcount ; i++) {const Animation::Part& part(animation.parts[i]);constsize_t fcount = part.frames.size();// process the part not only while the count allows but also if already fadingfor (int r=0 ; !part.count || r<part.count || fadedFramesCount > 0 ; r++) {if (shouldStopPlayingPart(part, fadedFramesCount, lastDisplayedProgress)) break;   ......             mCallbacks->playPart(i, part, r);   ......for (size_t j=0 ; j<fcount ; j++) {                processDisplayEvents();                ......// 重点:检查是否到了该退出的时候                checkExit();            }           ...        }    }

##checkExit()

voidBootAnimation::checkExit(){    ATRACE_CALL();// Allow SurfaceFlinger to gracefully request shutdownchar value[PROPERTY_VALUE_MAX];    property_get(EXIT_PROP_NAME, value, "0");int exitnow = atoi(value);if (exitnow) {        requestExit();    }}

何时结束

  • frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp#bootFinished()
启动完毕

参考资料

  • Android adb开机动画bootanimation.zip替换以及logo修改[11]

  •  Android_Logo_Bootanimation[12]

  • bootanimation手机开源库[13]

  • Rockchip_Introduction_Android_Boot_Video_CN.pdf

参考资料
[1] 

frameworks: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/?hl=zh-cn

[2] 

native: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/native/?hl=zh-cn

[3] 

services: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/native/services/?hl=zh-cn

[4] 

surfaceflinger: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/native/services/surfaceflinger/?hl=zh-cn

[5] 

SurfaceFlinger.cpp: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp?hl=zh-cn

[6] 

frameworks: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/?hl=zh-cn

[7] 

base: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/?hl=zh-cn

[8] 

cmds: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/cmds/?hl=zh-cn

[9] 

bootanimation: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/cmds/bootanimation/?hl=zh-cn

[10] 

BootAnimation.cpp: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/cmds/bootanimation/BootAnimation.cpp?hl=zh-cn

[11] 

Android adb开机动画bootanimation.zip替换以及logo修改: https://blog.csdn.net/baidu_28502503/article/details/126122830

[12] 

Android_Logo_Bootanimation: https://gitee.com/tanzhtanzh/kickpi-book/blob/master/common/zh/android/Android_Logo_Bootanimation.md

[13] 

bootanimation手机开源库: https://github.com/tntapple219/Android-Boot-Animation-Collection

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-13 22:00:32 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/620493.html
  2. 运行时间 : 0.204054s [ 吞吐率:4.90req/s ] 内存消耗:4,717.99kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=745d842d0944f9064ae506847baa7f54
  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.000959s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001367s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.001462s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.007209s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001519s ]
  6. SELECT * FROM `set` [ RunTime:0.000529s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001485s ]
  8. SELECT * FROM `article` WHERE `id` = 620493 LIMIT 1 [ RunTime:0.001803s ]
  9. UPDATE `article` SET `lasttime` = 1778680832 WHERE `id` = 620493 [ RunTime:0.041871s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.005139s ]
  11. SELECT * FROM `article` WHERE `id` < 620493 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001319s ]
  12. SELECT * FROM `article` WHERE `id` > 620493 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.012759s ]
  13. SELECT * FROM `article` WHERE `id` < 620493 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.004025s ]
  14. SELECT * FROM `article` WHERE `id` < 620493 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.007900s ]
  15. SELECT * FROM `article` WHERE `id` < 620493 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.003111s ]
0.210169s