尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Android开机logo制作:从内核initlogo.rle到bootanimation.zip的完整配置与验证

Android开机logo制作:从内核initlogo.rle到bootanimation.zip的完整配置与验证 1. 开机logo到底分几段先把链路拆清楚Android 设备的开机画面并不是一张图从头显示到尾而是由多个阶段接力完成的。你在真机上看到的“第一屏、第二屏、第三屏”背后其实是不同的组件在各自的时间窗口里往 framebuffer 上画东西。搞清楚这条链路是后面所有配置和排障的前提。按启动顺序大致可以拆成四段第一段是 bootloader 阶段的 splash跑在 LKLittle Kernel或 U-Boot 里通常是一张静态图显示时间最短但出现最早。第二段是内核阶段的 logo也就是经典的 Linux 小企鹅由内核的logo.c和fb_find_logo()负责加载Android 1.5 之后很多方案已经把它关掉了。第三段是 init 阶段的initlogo.rle由init.c里的load_565rle_image()读取成功就显示图片失败就退回文本模式打印“A N D R O I D”。第四段才是大家最熟悉的bootanimation.zip由bootanimation可执行文件在 SurfaceFlinger 就绪后拉起播放帧动画直到系统启动完成。这篇聚焦的是其中最容易混淆、也最常被问到的两段内核阶段的initlogo.rle和用户态的bootanimation.zip。前者是 565 格式的 RLE 压缩位图后者是一个带desc.txt的 zip 包。两者格式完全不同制作工具也不同但经常被新手混为一谈。适合谁看正在做 Android 设备定制、平板/盒子/车机 ROM 裁剪、或者单纯想把开机画面换成自己品牌图的开发者。下面每一步都给出可复制的命令和配置刷入后怎么验证也一并说清楚。2. 动手前先备好 TaoToken 的模型与 Key开机 logo 制作本身是本地工具链的活但过程中你会频繁遇到几个需要查文档、查报错、查参数含义的场景比如rgb2565的输入格式到底要 RGB888 还是 RGB565、desc.txt里 fps 和 pause 的语义、内核logo.c里nologo参数怎么传。这些零碎问题如果每次都去翻源码效率很低。我的做法是开一个模型对话窗口专门用来问这类细节。TaoToken 的模型对话入口可以直接用地址是https://taotoken.net/api对话页在 deep link 里对应模型对话。你可以在里面贴一段desc.txt问它每一列的含义或者贴一段编译报错问可能的原因比纯搜索快很多。如果你是要长期做 ROM 定制、经常要写脚本批量生成不同分辨率的initlogo.rle那更适合用 Coding Plan把生成脚本、校验脚本、打包脚本都沉淀下来。入口在 deep link 的 coding-plan。拿 Key 的步骤很简单进 console 页面在 API Keys 里创建一个新 key复制出来保存好。接入文档在 doc 页面里面有各语言的最小调用示例。注意 key 只在创建时完整显示一次丢了就重新建一个。提示把 key 放到环境变量里别硬编码进脚本。比如export TAOTOKEN_API_KEY你的key脚本里读环境变量避免提交到 git 时泄露。这一步不是必须的但实测下来能省不少查文档的时间尤其是desc.txt这种字段含义不直观的配置。3. 内核阶段 initlogo.rle 的生成与配置initlogo.rle的本质是一张 565 格式RGB565每像素 2 字节的位图经过 RLE 行程编码压缩。init 进程在启动早期读它直接写 framebuffer。所以它的分辨率必须和屏幕一致格式必须是 565否则要么花屏要么直接加载失败退回文本模式。3.1 从 PNG 到 RAW 再到 RLE假设你有一张logo.png目标分辨率 1080x1920。第一步转成 RGB888 的 raw# 用 ImageMagick 转成裸 RGB 数据注意 -depth 8 保证每通道 8 位 convert logo.png -resize 1080x1920! -depth 8 rgb:initlogo.raw这里-resize 1080x1920!的感叹号是强制拉伸不加的话 ImageMagick 会保持宽高比导致尺寸不对。转出来的initlogo.raw大小应该是1080 * 1920 * 3 6220800字节可以用ls -l核对一下对不上说明格式或尺寸有问题。第二步用 Android 源码里的rgb2565工具把 RGB888 转成 RLE 压缩的 565# rgb2565 在 Android 源码的 development/tools 或 system/core 下先编译出来 rgb2565 -rle initlogo.raw initlogo.rle-rle参数是关键不加的话输出的是未压缩的 565 数据init 读的时候会按 RLE 解析导致花屏。生成的initlogo.rle大小通常远小于原始数据因为 RLE 对大片同色区域压缩率很高。3.2 放进系统镜像initlogo.rle最终要出现在根目录/initlogo.rle。在 AOSP 里通常放在device/vendor/board/下然后在device.mk里用PRODUCT_COPY_FILES拷进去PRODUCT_COPY_FILES \ device/vendor/board/initlogo.rle:root/initlogo.rle如果你只是临时验证也可以编译完后用adb root adb remount然后adb push initlogo.rle /重启看效果。但注意 remount 在 userdebug 版本上才可用user 版本推不进去。3.3 内核 logo 要不要关如果你只想显示自己的initlogo.rle不想看到小企鹅需要在内核配置里关掉 bootup logo。进内核目录make menuconfig路径是Device Drivers - Graphics support - Bootup logo把Standard 224-color Linux logo取消勾选。或者在 defconfig 里直接改CONFIG_LOGOn。关掉之后内核阶段就不画图了framebuffer 保持黑屏直到 init 加载initlogo.rle。注意有些方案内核 logo 和 initlogo 会叠加显示表现为先企鹅后你的图。如果发现企鹅一闪而过就是没关内核 logo。4. bootanimation.zip 的目录骨架与 desc.txtbootanimation.zip是用户态动画由bootanimation进程解析。它的结构比 initlogo 复杂一点但规则很固定一个desc.txt加若干part目录。4.1 目录骨架bootanimation.zip ├── desc.txt ├── part0/ │ ├── 0001.png │ ├── 0002.png │ └── ... └── part1/ ├── 0001.png └── ...part0、part1是帧序列目录里面的 PNG 按文件名排序播放。命名建议用四位数字补零比如0001.png避免10.png排在2.png前面这种字典序问题。4.2 desc.txt 逐字段解释desc.txt是纯文本第一行是全局参数后面每行描述一个 part1080 1920 30 p 1 0 part0 p 0 0 part1第一行三个数字宽度、高度、帧率fps。宽度高度必须和屏幕分辨率一致fps 是每秒播放多少帧30 表示 30fps。后面每行格式是p 循环次数 暂停帧数 目录名。p是固定标识。第一个数字是循环次数1表示播放一遍0表示无限循环直到系统启动完成。第二个数字是暂停帧数0表示不暂停10表示播完这个 part 后停 10 帧的时间。第三个是目录名。上面例子的含义是part0播放 1 遍part1无限循环。这是最常见的“开机动画播一遍然后循环等待”的结构。4.3 打包的坑打包时有个经典坑zip 必须用存储模式store不能用压缩模式deflate否则 bootanimation 解析会失败。命令是# 必须在 bootanimation.zip 所在目录执行保证 desc.txt 在 zip 根目录 zip -0 -r ../bootanimation.zip desc.txt part0 part1-0就是 store 模式。另外desc.txt和 part 目录必须在 zip 的根不能多套一层文件夹。可以用unzip -l bootanimation.zip检查结构确认第一层就是desc.txt。4.4 放进系统bootanimation.zip的标准位置是/system/media/bootanimation.zip。在device.mk里PRODUCT_COPY_FILES \ device/vendor/board/bootanimation.zip:system/media/bootanimation.zip临时验证可以adb push bootanimation.zip /system/media/然后adb shell setprop ctl.start bootanim直接看效果不用重启。5. 刷入后的验证串口日志与画面双确认配置完不验证等于没做。开机 logo 的问题往往表现为“黑屏”“花屏”“卡在某一屏”需要结合串口日志和实际画面判断卡在哪一段。5.1 用串口日志定位阶段接上串口波特率通常是 115200。启动时重点看这几条内核阶段看fb_find_logo相关输出如果关了 logo 这里不会有绘制动作。init 阶段看load_565rle_image的返回成功的话不会打印“A N D R O I D”文本如果看到文本模式输出说明initlogo.rle加载失败回去检查格式和路径。bootanimation 阶段看BootAnimation的启动日志正常会看到服务被拉起。# 也可以从 adb 侧看 bootanim 服务状态 adb shell getprop | grep bootanim adb shell getprop init.svc.bootaniminit.svc.bootanim显示running说明动画在播stopped说明已结束或没起来。5.2 画面验证的观察点重启后按时间顺序观察如果第一屏是你的 splash 或黑屏第二屏直接出现你的initlogo.rle图第三屏开始播bootanimation.zip说明链路全通。如果第二屏出现“A N D R O I D”文本就是 initlogo 没生效。如果第三屏黑屏但系统能起来多半是 bootanimation.zip 打包格式不对或 desc.txt 解析失败。5.3 单独调试 bootanimation不想反复重启的话可以手动跑adb shell bootanimation它会一直播动画不停止方便你确认帧序列和 desc.txt 是否正确。按 CtrlC 退出。这个命令在调试阶段非常省时间。6. 常见报错排查清单initlogo.rle 加载失败退回文本模式最常见原因是格式不对。确认rgb2565加了-rle确认 raw 是 RGB888 且尺寸和屏幕一致。用file initlogo.rle看不出格式只能靠生成流程保证。bootanimation 黑屏先查 zip 是不是 store 模式unzip -v bootanimation.zip看压缩方法列是不是Stored。再查desc.txt第一行分辨率是否和屏幕一致不一致会直接不显示。动画只播一帧就停检查 part 目录里的 PNG 命名如果只有一张图或者命名排序乱了看起来就像卡住。另外确认desc.txt里循环次数写的是0还是1。花屏、颜色错乱initlogo 花屏基本是 565 格式问题比如误用了 RGB888 数据。bootanimation 花屏通常是 PNG 带了 alpha 但设备不支持或者分辨率不匹配。改了不生效确认文件真的进了镜像adb shell ls -l /initlogo.rle和/system/media/bootanimation.zip看时间戳。有时候是编译缓存没清make installclean后重编。内核 logo 关不掉检查 defconfig 里是不是有多个CONFIG_LOGO相关项有些方案在arch/arm64/configs/下有多个 defconfig改错了文件。遇到拿不准的报错可以把串口日志片段贴到模型对话里问比盲猜快。接入文档在 doc 页面有完整的调用说明API Keys 在 console 页面管理。长期做定制的话用 Coding Plan 把生成和校验脚本固化下来下次换分辨率直接跑脚本就行。
返回列表