应一个客户的需要,需要在 Android 5.1 上,将 Android 的开机 logo、开机动画 bootanimation.zip 和关机动画shutdownanimation.zip 一起存放在 splash 分区。下面就记述下实现的难点、思路以及大体逻辑。

难点

在整个实现的过程中,难点有两部分:

  • Android 5.1 权限问题,也就是 SElinux 问题;
  • 数据结构字节对齐问题

在后面的步骤中一一叙述之。

思路

将开机logo、kernel logo(如果有的话)、bootanimation.zip、shutdownanimation.zip 分别以二进制的形式存放在 splash 分区。为了系统能准确读出这几种文件,还需要将这几种文件的大小、以及存在 splash 分区的哪个位置,这两类参数也得保存到 splash 某个特定的位置。开机后,bootloader会首先取出开机logo进行显示,到了开机动画显示阶段,在显示之前,从 splash 分区取出 bootanimation.zip 然后显示,关机动画也是同样的道理。

实现

以下是实现的过程。

文件存入与读取

怎么放入 splash 分区,直接影响到怎么从 splash 分区读取文件。客户指定的 splash 分区一共是 20M,经过实际测量和估算,bootloader 开机 logo 大约占 2M,如果 kernel logo 也做的话,大概也在 2M 左右。而一般来说,bootanimation.zip 和 shutdownanimation.zip 也都大概在 7M 左右。那么总的算下来, 2x2M + 7x2M = 18M。那么怎么存呢?前面说过,怎么存将影响到怎么取。无非就两种取法:

  • 系统在约定的启动阶段,去约定的 splash 地址,读取约定大小的文件
  • 在 splash 分区特定的位置,放置一张表,表里说明,某个文件存放的位置,以及该文件的大小

对比两种取法,后面一种比前面一种灵活性更好,前面一种写法是在“取”的代码中把什么都写死了,一旦后面需要增加文件的大小,又得来修改这部分“取”的代码。而第二种方法则避免了这种缺陷。那这样吧,就将三个文件存放的起始地址、三个文件的大小,做成一张表,放在 splash 分区的最前面,每次读取文件的时候,就先检索该文件,然后根据该文件里面的值进行判定。为了更加准确,还需要加上一些头和尾,来作为校验。那么整个 splash 分区划定后如下:

如上图所示,对整个splash分区进行了划定。下面来说明每个子分区里面的详细内容。

splash head

在 splash head 里面需要放置以下内容:

  • splash head 头标志,这里使用字符串 “SPLASH!!” 来表示;
  • bootloader logo.png 的(存放)起始地址;
  • kernel logo.png 的(存放)起始地址;
  • bootanimation.zip 的(存放)起始地址;
  • shutdownanimation.zip 的(存放)起始地址

在上面的参数中,bootloader logo.png 、kernel logo.png 和 bootanimation.zip 的起始地址都是固定的,而 shutdownanimation.zip 的起始地址,是随着 bootanimation.zip 的起始地址加上其文件大小得出来的----这样做的目的是,将shutdownanimation.zip 接着 bootanimation.zip 放,尽可能的节约空间。另外,在代码中,因为当时为了验证的原因,多存入了 bootanimation.zip 和 shutdownanimation.zip 的大小参数,其实这俩参数在此处也可以不要。

bootloader logo.png 和 kernel logo.png 区域

这里没有什么特别的,直接在指定的地址上,写入 logo.png 即可。不过代码中并没有真正的去存入和读取 kernel logo.png—一般的,kernel logo.png 都不再显示了。

bootanimation.zip 区域

在 bootanimation.zip 区域,分为了 32 bytes 的头、bootanimation.zip 文件以及32 bytes 的尾三部分。

其详细放置情况如下:

  • bootanimation.zip head 标志,这里使用了 “BOOTANIMATION!!”;
  • 紧跟着 32 bytes 后放入 bootanimation.zip 文件大小的参数,以 byte 为单位,该参数占4 bytes.
  • 接着放入 bootanimation.zip 的二进制文件;
  • 接着放入 32 bytes 的尾部,在尾部的前 16 bytes,放入 bootanimation.zip 区域的结束标志,这里使用了 “BOOTANIMATIONEND”。

那么,在开机动画阶段,读取 bootanimation.zip 的流程即是:

  1. 读取 512 bytes 的 splash head 校验,并取出其中 bootanimation.zip 的首地址;
  2. seek 到 bootanimation.zip 区域的首地址,读取 32 bytes 的 head,校验并取出其中该文件大小的参数;
  3. 继续偏移 32 bytes,然后读取上述文件大小的字节数,放入缓存区;
  4. 继续读取 32 bytes 的尾,并取出其中的 16 bytes 的尾并校验之;
  5. 如果校验通过,则将第3步读取的数据写入到磁盘,结束对 bootanimation.zip 文件的读取。否则,则返回失败。

shutdownanimation.zip 区域

在 shutdownanimation.zip 区域,分为了 32 bytes 的头、shutdownanimation.zip 文件以及32 bytes 的尾三部分。

其详细放置情况如下:

  • shutdownanimation.zip head 标志,这里使用了 “SHUTDOWNANIMATION!!”;
  • 紧跟着 32 bytes 后放入 shutdownanimation.zip 文件大小的参数,以 byte 为单位,该参数占4 bytes.
  • 接着放入 shutdownanimation.zip 的二进制文件;
  • 接着放入 32 bytes 的尾部,在尾部的前 19 bytes,放入 shutdownanimation.zip 区域的结束标志,这里使用了 “SHUTDOWNANIMATIONEND”。

那么,在关机动画阶段,读取 shutdownanimation.zip 的流程即是:

  1. 读取 512 bytes 的 splash head 校验,并取出其中 shutdownanimation.zip 的首地址;
  2. seek 到 shutdownanimation.zip 区域的首地址,读取 32 bytes 的 head,校验并取出其中该文件大小的参数;
  3. 继续偏移 32 bytes,然后读取上述文件大小的字节数,放入缓存区;
  4. 继续读取 32 bytes 的尾,并取出其中的 19 bytes 的尾并校验之;
  5. 如果校验通过,则将第3步读取的数据写入到磁盘,结束对 shutdownanimation.zip 文件的读取。否则,则返回失败。

那么,上述几个区域,形成的数据结构大致如下:

其放置到 splash 分区的大概过程如下:

bootloader 读取

这个可以在加载开机 logo 的代码之前去 emmc/flash的splash分区进行读取,此处不述。

开关机读取

在高通平台上,开关机动画读取流程都是放在以下文件的:

frameworks/base/cmds/bootanimation/BootAnimation.cpp

在该文件的中 readyToRun() 里面,根据启动状态来判定当前是该调用开机动画还是关机动画:

int state = checkBootState() ? 0 : 1;

在这里,我们可以干掉原来的处理方法,根据 state 的值,来调用我们的读取函数,从splash分区读取开机动画或者关机动画。

注意!!!

这里需要注意的是,如果开关机动画无法成功读取,则开关机过程中,将会以 Android 原生图片进行显示: “ANDROID”。

难点处理

前面有提到在该次的实现过程中,有两处难点,其一就是权限问题,其二就是,字节对齐的问题。字节对齐很好处理,使用宏 #pragma pack 可以解决。这里给出解决方法以及所需权限结果。

如果我们在 .cpp 文件中,open/read/write 等操作时,没有权限,系统会提示,这些信息可以通过 logcat 或者 /proc/kmsg 下显示出来的。我这里解决的时候,是采用了kernel log 的方法,如下:

cat /proc/kmsg | grep avc

以下文字为引用别人的blog:

以上详情请参看: Android 5.x 权限问题解决方法

当然,也不一定就需要把所有的都搞完。比如我这里,就只解决了 avc 出现的过程中,出现了 “bootani” 的部分内容。

以下是读取开关机动画所需要的权限:

bootanim.te

allow bootanim block_device:dir search;
allow bootanim mmc_block_device:blk_file rw_file_perms;
allow bootanim system_data_file:dir {rw_file_perms search create add_name remove_name};
allow bootanim system_data_file:file {rw_file_perms create setattr unlink};

file_contexts

/dev/block/mmcblk0p29    u:object_r:mmc_block_device:s0

ueventd.rc

/dev/block/mmcblk0p29     0777   root       graphics

qseecomd.te

allow tee system_prop:property_service {set};

加入系统编译

让系统在 make 的时候,自动生成 splash.img,这是很重要的。这里以高通为例,修改如下:

vendor/qcom/build/tasks/generate_extra_images.mk

INSTALLED_SPLASHIMAGE_TARGET := $(PRODUCT_OUT)/splash.img
//....

测试

测试该功能对系统的影响是否正常,可以通过创建一个空的 splash.img 或者一个内容不符合前面规格的 splash.img,烧入到 splash分区。看系统能否正常起来,显示的是否是android原生的"ANDROID"图片。然后再烧回正常的 splash.img,看能否正常显示即可。

2016-08-04

存入 splash 分区 Python脚本

Qualcomm MSM8916 将开关机动画放置到指定分区做法相关推荐

  1. Android 8.0 开机动画,RK3326 android10.0(Q) 开机logo+开关机动画替换

    RK3326 android10.0(Q) 开机logo+开关机动画替换 2020年08月14日 | 萬仟网移动技术 | 我要评论 开机logouboot和kernel阶段的logo分别为开机显示的第 ...

  2. RK3326 android10.0(Q) 开机logo+开关机动画替换

    开机logo uboot和kernel阶段的logo分别为开机显示的第一张和第二张logo图片, uboot logo源文件: kernel/logo.bmp kernel logo源文件: kern ...

  3. Android P版自定义开关机动画

    Android P版自定义开关机动画 Google default关机流程只显示进度条,不会播放关机动画.如需自定义开关机动画,建议使用mtkbootanimation进行客制化 [SOLUTION] ...

  4. Android系统(221)---O版自定义开关机动画

    O版自定义开关机动画 O较前面的版本有更改,为方便自定义开关机动画我司,使用mtkbootanimation自定义开关机动画: [SOLUTION] O版会根据配置生成bootanimation或者m ...

  5. mtk使用android开关机动画,android MTK修改开关机动画

    一丶修改开机logo ① device/tangxun/tx6580_weg_m/ProjectConfig.mk   中BOOT_LOGO=hd720  可知开机的图标在hd720文件夹中(这个需要 ...

  6. android 开关机动画

    开机画面,按照国际惯例,一般是分为2屏,当然也有3屏的说法,不管怎样,我这里说得就是最后的一屏,按照bootanimation的字面意思翻译,大概也就是开机动画的意思,那这就不说第几屏了,直接用&qu ...

  7. android开机动画多长时间_android开关机动画和铃声配置

    12. 分区修改 A 修改分区文件mediatek\build\tools\ptgen\partition_table.xls B 修改分区头文件mediatek\custom\project\com ...

  8. MTK平台修改Android动画,Android MTK平台修改开关机动画和开机logo

    转载请注明出处:http://blog.csdn.net/u011479494/article/details/50682089 一.修改开机logo 由于我的机器分辨率为540*960 替换:med ...

  9. MTK Android 13平台开关机动画铃声客制化

    MTK Android 13平台开关机动画铃声客制化 Android T和S的差异很大 主要是MtkShutdownThread.java和ShutdownThread.java差异 未完,待更新,填 ...

  10. android 关闭关机动画,Android 开关机动画 BootAnimation/ShutdownAnimation 解析

    引言 (该部分转载): 开机动画的地址:system\media\bootanimation.zip,要修改开机动画就是修改bootanimation这个文件.如果说你的手机里没有这个文件,那就是说明 ...

最新文章

  1. Python九十天学习框架,从1到90,从0基础到IQ100
  2. CPU调度(CPU Scheduling)
  3. 超便携式截屏录屏软件FastStone Capture
  4. 数据库 / 事务的 ACID
  5. windows远程连接ubuntu 黑屏_Windows跟Windows远程连接传输文件
  6. java散列法的运用实例,Java HashMap compute() 使用方法及示例
  7. YOLOv5 的妙用:学习手语,帮助听力障碍群体
  8. 【POJ2774】Long Long Message,第一次的后缀数组
  9. 找个轻量级的Log库还挺难
  10. 50欧姆线设计 高频pcb_高频电路布线的应对方法有哪些?
  11. 再谈贝叶斯学派与频率学派的区别
  12. PCDJ DEX 3 for mac(DJ混音打碟工具)
  13. Keil5各个版本的下载地址
  14. java word 加水印_java如何给office加水印
  15. oracle 恢复表关联,ORACLE 12C使用RMAN进行表恢复
  16. Javascript-API-BOM、动画函数、网页轮播图、节流阀、筋斗云、固定侧边栏返回顶部案例
  17. 名编辑电子杂志大师教程 | 设置电子杂志书签功能
  18. 无穷小微积分理论的“根”扎的有多深?
  19. PS基础入门(一.橡皮檫的介绍)
  20. DM368+聚林200W的并口机芯正常出图

热门文章

  1. edge怎么开启沉浸式阅读_《幻塔》首测今日开启 探索沉浸式开放世界_网络游戏新闻...
  2. MyBatis和Hibernate的区别
  3. 26岁摩拜高管:“下不了手开除70、80后,公司死了谁负责?”
  4. QT实现串口调试助手(三):保存日志、QSS样式载入
  5. 李沐动手学深度学习V2-NLP文本预处理和代码实现
  6. 低代码真的是“行业毒瘤”?
  7. spring5.1.3使用篇-数据访问
  8. 旋度的散度恒为0(公式推导)
  9. 两个脑仁疼的error:error in __connection_block_invoke_2: Connection interrupted
  10. Hyperledger Fabric 2.3环境配置搭建指南及BUG记录