开发环境 --Android 修改 init.rc

因为某些特殊的逻辑,希望启动的时候不去打开开机动画等服务。

之前也提到过开机动画的替换,只需要在"/system/media"目录下去更改bootanimation.zip就好了。

其中一些更细致的内容,比如desc.txt等配置,其他博客里会提到。

安卓制作开机动画

本次主要研究的如何完全关闭开机动画、开机铃声等。

开机动画的逻辑之前也研究过。

在系统启动时,会自动执行Ramdisk中的rc脚本,其中里面有一个文件/root/init.rc,它就是主系统服务javascript:;我们打开这个脚本,会发现里面有许多service开头的句子,这就是系统服务。它的作用就是在开机Boot启动时,启动system/bin下的二进制文件和sh脚本,以开启需要的系统服务。执行脚本后会按脚本顺序启动系统服务

系统服务启动后,一般先会启动媒体服务,紧接着启动开机关机动画和铃声服务,因为开关机动画和铃声是依赖媒体服务的,如果增加过删除此处的代码,就可以达到开启或者关闭动画和铃声的目的。

这时可能又会有朋友问了,关闭开关机动画和铃声不是进入system/media直接删除掉文件不就行了吗?不需要这么麻烦吧。
那这里又牵涉到一个地方,如果直接删除掉动画和铃声,系统在启动服务时,如果在system/media下搜索不到动画和铃声文件,它就会加载默认的开关机动画,默认的开关机动画是一个ANDROID,位于system/framework/framework-res.apk,解开框架文件,在assets资源文件夹下,有一个images文件下,有两张png图片,就是安卓默认的开关机动画。所以直接删除动画和铃声文件是无法彻底关闭动画和铃声的。我们只能通过修改系统服务来彻底开启和关闭。

在/root/init.rc中,下面这段脚本就是对应的启动开机动画的服务,只要将这段脚本删除掉就能实现关闭开机动画

service bootanim /system/bin/bootanimation          
    class core                                                         
    user root         
    group graphics audio
    disabled                                           
    oneshot 

Android 根目录下可以看到 init.rc ,但是却无力修改,改了也白瞎,重启就恢复了,ramdisk....

init.rc 是 rootfs 中的文件,Android 将 rootfs(initramfs) link 到 linux kernel image 中,生成正常启动的boot.img, recovery 模式的 recovery.img.
Android 每次 reboot 的时候 bootloader 都要将 boot.img 加载到ram 中,其中一部分是真正的 linux kernel image (zImage), 另外一部分就是 initramfs (包含 init, init.rc, etc).
之后,Linux kernel 初始化的时候会把 initramfs 以 rootfs 类型 mount 到 / .
这样,你用 adb shell 或 串口 修改 / 上的init.rc, 因为下次重启会重新加载,你的修改自然就没了.

在这边,生成的boot.img是整合到kernel.img中的。
 

PS:

在这边又有个小插曲,因为安卓的这个init.rc文件在一个公有的目录下,修改这个文件可能会导致所有项目中的init.rc遭到修改。

因此需要改动device.mk文件,将以下的这段代码替换成指定的目录下的init.rc文件。

PRODUCT_COPY_FILES += \
    device/hisilicon/bigfish/etc/init.rc:root/init.rc \

改成如下:

 PRODUCT_COPY_FILES += \
   device/kedacom/${TARGET_PRODUCT}/etc/init.rc:root/init.rc \

以上就是如何关闭启动服务中的bootanimation这个服务,

其他的服务开启关闭也可以参照这块。

猜你喜欢

转载自blog.csdn.net/Ivan804638781/article/details/100076102