Android 开机流程中的图片与动画解析

在 Android 开源项目(AOSP 13)中,开机流程涉及多个阶段的画面显示,包括 bootloader 阶段、内核阶段、系统初始化阶段和开机动画阶段。以下是对 core/res/assets/images/android-logo-shine.pngvendor/sprd/release/boot_logo_resource/bmp_fileBootAnimation.zip 在开机流程中的作用、关系及显示顺序的详细解析。

1. 开机流程中的显示阶段

Android 设备的开机流程通常包括以下阶段的画面显示:

  1. U-Boot/LK(Little Kernel)阶段:设备启动时的第一个画面,由 bootloader(如 U-Boot 或 LK)加载,显示硬件相关的 logo(如设备制造商的品牌 logo)。
  2. Kernel 阶段:Linux 内核加载后显示的画面,通常是内核 logo(如 Tux 小企鹅或自定义的 kernel logo)。
  3. Android 初始化阶段 :Android 系统初始化(init 进程启动后)时显示的静态画面,通常是 "A N D R O I D" 文字或自定义的静态 logo(如 initlogo.rle)。
  4. Android 开机动画阶段 :Android 图形系统(SurfaceFlinger)启动后,显示动态的开机动画,通常由 BootAnimation.zip 提供,或回退到默认的文字动画。

2. 图片与动画文件的作用

(1) core/res/assets/images/android-logo-shine.png

  • 路径frameworks/base/core/res/assets/images/android-logo-shine.png

  • 作用 :此文件是 Android 系统初始化阶段(initlogo)或开机动画阶段(默认动画)的背景纹理图片,通常与 android-logo-mask.png 配合使用,形成 "A N D R O I D" 文字的动态闪光效果。

    • android-logo-mask.png 是一个镂空蒙版图片,文字部分透明。
    • android-logo-shine.png 是一个背景纹理图片,通过在蒙版后滚动显示,形成动态效果。
  • 显示阶段 :在 Android 初始化阶段 (第3阶段)或 开机动画阶段 (第4阶段)使用,由 BootAnimation 类(位于 frameworks/base/cmds/bootanimation/BootAnimation.cpp)加载。

  • 相关代码

    复制代码
    bool BootAnimation::android() {
        initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png");
        initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png");
    }
  • 显示时机 :当图形系统(SurfaceFlinger)启动时显示,通常作为默认开机动画(当 BootAnimation.zip 不可用时)。

(2) vendor/sprd/release/boot_logo_resource/bmp_file

  • 路径vendor/sprd/release/boot_logo_resource/bmp_file
  • 作用 :此目录中的 bmp_file(通常为 BMP 格式图片)由 Spreadtrum(展讯)平台提供,用于 U-Boot/LK 阶段Kernel 阶段 的开机 logo 显示,通常是设备制造商的品牌 logo。
    • 这些图片通常被打包到 logo.bin 文件中,存储在 vendor_boot 分区或 boot 分区,由 LK 或内核解析并显示。
  • 显示阶段 :在 U-Boot/LK 阶段 (第1阶段)或 Kernel 阶段 (第2阶段)显示,具体取决于设备配置(如 BOOT_LOGO 设置)。
  • 相关配置
    • vendor/sprd 目录下的配置文件(如 ProjectConfig.mk)中,可指定 BOOT_LOGO 的分辨率(如 wuxga),指向对应的 BMP 文件:

      复制代码
      BOOT_LOGO := wuxga
    • 编译后,bmp_file 被打包到 logo.bin,由 bootloader 或内核加载。

(3) BootAnimation.zip

  • 路径 :通常位于 /system/media/bootanimation.zip/vendor/overlay/bootanimation.zip
  • 作用BootAnimation.zip 是一个包含动画帧(PNG 图片)和描述文件(desc.txt)的压缩包,用于在 Android 开机动画阶段 (第4阶段)播放动态开机动画。由 bootanimation 服务(frameworks/base/cmds/bootanimation)加载和渲染。
  • 执行流程
    1. init 进程根据 init.rc 脚本启动 bootanimation 服务。
    2. 服务加载 BootAnimation.zip,根据 desc.txt 配置播放 PNG 图片。
    3. 动画播放直到系统启动完成(Zygote 进程加载完成,SystemUI 启动),由 SystemServer 发出停止信号。
  • 与默认动画的关系 :如果 BootAnimation.zip 存在,它会优先于默认的 android-logo-shine.pngandroid-logo-mask.png 动画显示;否则,系统回退到默认的文字闪光动画。

3. 图片与动画的关系和显示顺序

  • 关系
    • android-logo-shine.png 是 AOSP 框架层的资源,用于系统初始化或默认开机动画,显示动态文字效果。
    • vendor/sprd/release/boot_logo_resource/bmp_file 是 Spreadtrum 平台特定的资源,用于更早的 bootloader 或内核阶段,显示静态品牌 logo。
    • BootAnimation.zip 是厂商或系统自定义的动态开机动画,优先级高于默认动画。
    • 这些资源分属不同开机阶段,功能上无直接依赖,但共同构成了开机过程中的视觉体验。
  • 显示顺序
    1. U-Boot/LK 阶段 (第1阶段):显示 vendor/sprd/release/boot_logo_resource/bmp_file 中的 BMP 图片(如品牌 logo)。
    2. Kernel 阶段 (第2阶段):可能继续显示 bmp_file(如配置为 kernel logo),或显示内核默认 logo(如 logo_linux_clut224.ppm)。
    3. Android 初始化阶段 (第3阶段):显示 initlogo.rle(如果存在)或简单的 "A N D R O I D" 文字。
    4. Android 开机动画阶段 (第4阶段):优先播放 BootAnimation.zip 中的动态动画;若无,则显示 android-logo-shine.pngandroid-logo-mask.png 的默认动画。

4. 注意事项

  • 设备差异 :具体图片和动画的显示可能因设备厂商(例如 Spreadtrum 平台)或 AOSP 配置而异。例如,BOOT_LOGO 配置会影响 BMP 文件的选择。
  • 自定义修改
    • 修改 bmp_file 时,需确保图片为 24 位无压缩 BMP 格式,分辨率与设备匹配,并更新 logo.bin
    • 修改 BootAnimation.zip 时,需确保 PNG 图片格式正确,desc.txt 配置准确。
    • 修改默认动画时,需更新 android-logo-shine.pngandroid-logo-mask.png,并确保源码时间戳更新以触发重新编译。
  • 调试方法 :可通过 adb logcat 查看 bootanimation 服务的日志,或检查 init.rcBootAnimation.cpp 的行为。

5. 总结

  • vendor/sprd/release/boot_logo_resource/bmp_file:用于 U-Boot/LK 或 Kernel 阶段,显示静态品牌 logo。
  • core/res/assets/images/android-logo-shine.png:用于 Android 初始化或默认开机动画,显示文字闪光效果。
  • BootAnimation.zip:用于 Android 开机动画阶段,优先显示动态动画。
  • 显示顺序bmp_file(第1或第2阶段) → android-logo-shine.png(第3或第4阶段,默认动画) → BootAnimation.zip(第4阶段,优先)。

以上~~