Qualcomm MSM8916 将开关机动画放置到指定分区做法
应一个客户的需要,需要在 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 的流程即是:
- 读取 512 bytes 的 splash head 校验,并取出其中 bootanimation.zip 的首地址;
- seek 到 bootanimation.zip 区域的首地址,读取 32 bytes 的 head,校验并取出其中该文件大小的参数;
- 继续偏移 32 bytes,然后读取上述文件大小的字节数,放入缓存区;
- 继续读取 32 bytes 的尾,并取出其中的 16 bytes 的尾并校验之;
- 如果校验通过,则将第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 的流程即是:
- 读取 512 bytes 的 splash head 校验,并取出其中 shutdownanimation.zip 的首地址;
- seek 到 shutdownanimation.zip 区域的首地址,读取 32 bytes 的 head,校验并取出其中该文件大小的参数;
- 继续偏移 32 bytes,然后读取上述文件大小的字节数,放入缓存区;
- 继续读取 32 bytes 的尾,并取出其中的 19 bytes 的尾并校验之;
- 如果校验通过,则将第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 将开关机动画放置到指定分区做法相关推荐
- Android 8.0 开机动画,RK3326 android10.0(Q) 开机logo+开关机动画替换
RK3326 android10.0(Q) 开机logo+开关机动画替换 2020年08月14日 | 萬仟网移动技术 | 我要评论 开机logouboot和kernel阶段的logo分别为开机显示的第 ...
- RK3326 android10.0(Q) 开机logo+开关机动画替换
开机logo uboot和kernel阶段的logo分别为开机显示的第一张和第二张logo图片, uboot logo源文件: kernel/logo.bmp kernel logo源文件: kern ...
- Android P版自定义开关机动画
Android P版自定义开关机动画 Google default关机流程只显示进度条,不会播放关机动画.如需自定义开关机动画,建议使用mtkbootanimation进行客制化 [SOLUTION] ...
- Android系统(221)---O版自定义开关机动画
O版自定义开关机动画 O较前面的版本有更改,为方便自定义开关机动画我司,使用mtkbootanimation自定义开关机动画: [SOLUTION] O版会根据配置生成bootanimation或者m ...
- mtk使用android开关机动画,android MTK修改开关机动画
一丶修改开机logo ① device/tangxun/tx6580_weg_m/ProjectConfig.mk 中BOOT_LOGO=hd720 可知开机的图标在hd720文件夹中(这个需要 ...
- android 开关机动画
开机画面,按照国际惯例,一般是分为2屏,当然也有3屏的说法,不管怎样,我这里说得就是最后的一屏,按照bootanimation的字面意思翻译,大概也就是开机动画的意思,那这就不说第几屏了,直接用&qu ...
- android开机动画多长时间_android开关机动画和铃声配置
12. 分区修改 A 修改分区文件mediatek\build\tools\ptgen\partition_table.xls B 修改分区头文件mediatek\custom\project\com ...
- MTK平台修改Android动画,Android MTK平台修改开关机动画和开机logo
转载请注明出处:http://blog.csdn.net/u011479494/article/details/50682089 一.修改开机logo 由于我的机器分辨率为540*960 替换:med ...
- MTK Android 13平台开关机动画铃声客制化
MTK Android 13平台开关机动画铃声客制化 Android T和S的差异很大 主要是MtkShutdownThread.java和ShutdownThread.java差异 未完,待更新,填 ...
- android 关闭关机动画,Android 开关机动画 BootAnimation/ShutdownAnimation 解析
引言 (该部分转载): 开机动画的地址:system\media\bootanimation.zip,要修改开机动画就是修改bootanimation这个文件.如果说你的手机里没有这个文件,那就是说明 ...
最新文章
- Python九十天学习框架,从1到90,从0基础到IQ100
- CPU调度(CPU Scheduling)
- 超便携式截屏录屏软件FastStone Capture
- 数据库 / 事务的 ACID
- windows远程连接ubuntu 黑屏_Windows跟Windows远程连接传输文件
- java散列法的运用实例,Java HashMap compute() 使用方法及示例
- YOLOv5 的妙用:学习手语,帮助听力障碍群体
- 【POJ2774】Long Long Message,第一次的后缀数组
- 找个轻量级的Log库还挺难
- 50欧姆线设计 高频pcb_高频电路布线的应对方法有哪些?
- 再谈贝叶斯学派与频率学派的区别
- PCDJ DEX 3 for mac(DJ混音打碟工具)
- Keil5各个版本的下载地址
- java word 加水印_java如何给office加水印
- oracle 恢复表关联,ORACLE 12C使用RMAN进行表恢复
- Javascript-API-BOM、动画函数、网页轮播图、节流阀、筋斗云、固定侧边栏返回顶部案例
- 名编辑电子杂志大师教程 | 设置电子杂志书签功能
- 无穷小微积分理论的“根”扎的有多深?
- PS基础入门(一.橡皮檫的介绍)
- DM368+聚林200W的并口机芯正常出图
热门文章
- edge怎么开启沉浸式阅读_《幻塔》首测今日开启 探索沉浸式开放世界_网络游戏新闻...
- MyBatis和Hibernate的区别
- 26岁摩拜高管:“下不了手开除70、80后,公司死了谁负责?”
- QT实现串口调试助手(三):保存日志、QSS样式载入
- 李沐动手学深度学习V2-NLP文本预处理和代码实现
- 低代码真的是“行业毒瘤”?
- spring5.1.3使用篇-数据访问
- 旋度的散度恒为0(公式推导)
- 两个脑仁疼的error:error in __connection_block_invoke_2: Connection interrupted
- Hyperledger Fabric 2.3环境配置搭建指南及BUG记录