[Android5.1]开机服务启动顺序

大家知道,当Android系统启动时候,会解析init.rc文件,然后根据里面的定义,启动各种服务,如netd、zygote、servier_manager等等,但这些服务之间其实是有依赖关系的,而且当其中的某个服务启动失败时,有时候会影响后续的服务启动。这篇文章就具体的分析一下开机服务的启动顺序。

服务的分类

init.rc中对服务做了分类,在service section里面有一个’class’标签,指明了该服务所属的类。如:

service surfaceflinger /system/bin/surfaceflinger
    class core  //所属类为‘core’
    user system
    group graphics drmrpc
    onrestart restart zygote

service media /system/bin/mediaserver
    class main  //所属类为‘main’
    user media
    group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc mediadrm system
    ioprio rt 4

init.rc中总共有三个分类:core、main和late_start,下面整理了各分类下属的服务:

  • core

ueventd、logd、healthd、adbd(disabled)、lmkd(LowMemoryKiller)、servicemanager、vold、debuggerd、surfaceflinger、bootanim(disabled)等

core分类中的服务都是一些核心服务,它们不启动,后续的服务或系统启动就可能出问题。比如servicemanager,binder通信大管家,它的启动很靠前,因为,其他服务启动时候需要向servicemanager注册binder服务。vold,负责存储类设备的挂载;还有surfaceflinger,图形显示的核心服务等。

  • main

debuggerd64、drm、media、ril-daemon、installd、flash_recovery、racoon(disabled)、mtpd(disabled)、keystore、dumpstate(disabled)、mdnsd(disabled)、pre-recovery(disabled)、cmd_services(disabled)、phasecheckserver、zygote等。

main分类中的服务是一些系统的基本服务,有了这些服务android系统、Java世界才能正常运行。

  • late_start:字面意思是晚些启动。/device/中一些硬件厂商的.rc文件中会将一些服务设置为该类。

上面服务后面加”(disabled)”,代表init进程在初始化阶段不会启动该服务。该服务的启动是由其他的因素触发而启动的,比如:

on property:persist.sys.cmdservice.enable=enable
    start cmd_services

表示当属性persist.sys.cmdservice.enable的值设置为enable时,会触发该action,执行下面的命令。由于命令是start,所以init进程会启动cmd_services。

除了“disabled”的服务,上面的顺序基本上就是服务的开机启动顺序,即先启动core服务,然后启动main服务,最后启动late_start类别的服务。注意,相同类别的服务,基本上是同时启动,相互之间的延时很小。

服务的启动

首先看一下,init.c–>main()源码:

int main(int argc, char **argv)
{
    ...
    action_for_each_trigger("early-init", action_add_queue_tail);
    ...
    action_for_each_trigger("init", action_add_queue_tail);
    ...
    action_for_each_trigger("late-init", action_add_queue_tail);
    ...
    for(;;) {
        ...
        execute_one_command();
        ...
    }
}

可以看到,依次将early-init、init、late-init三个section对应的命令插入到操作队列中。
然后在后面的for循环中,调用execute_one_command依次执行操作队列中的命令。
那early-init、init、late-init都定义了哪些操作呢?我们看一下init.rc中的定义。这里,我们只关注服务的启动,其他的操作屏蔽掉。

on early-init
    ...
    start ueventd  //ueventd是init启动的第一个进程
    ...

on init
    ... // 创建各种路径,并写入一些参数

on late-init
    //trigger 会调用action_for_each_trigger("xxx", action_add_queue_tail);
    //从而将xxx section里的操作加入操作队列

    // mount文件系统相关的操作
    trigger early-fs 
    trigger fs 
    trigger post-fs
    trigger post-fs-data

    trigger load_all_props_action  //加载属性
    trigger firmware_mounts_complete

    trigger early-boot //将‘early-boot’中的操作加入执行队列
    trigger boot  //将‘boot’中的操作加入执行队列

on early-boot
    ... // kernel trace相关

on boot
    ...
    class_start core // 启动core类别的服务

前面说了core类别的服务有很多,那这些服务的启动顺序怎么定义的呢?init进程在解析init.rc(init.rc中还import了其他的rc文件,解析完init.rc后,依次解析其他的rc文件)文件时,是从上到下依次解析,并存放在一个全局链表中的。服务的启动顺序就是该服务在全局链表中的位置。所以在rc文件中定义靠前的服务也会在全局链表的靠前位置,也就会先执行。
core类别的服务启动完了,那main类别的服务什么时候启动呢?
init.rc中对启动main类别服务的定义如下:

on nonencrypted
      class_start main
      class_start late_start

on property:vold.decrypt=trigger_restart_min_framework
      class_start main

on property:vold.decrypt=trigger_restart_framework
     class_start main
     class_start late_start

可见,有以上三种方式,会触发启动main类别的服务。通过名字可以看出,都和系统是否加密有关。
这里,我们分析一下nonencrypted。前面提到,在“late-init”section中会触发“fs”section。

on late-init
    ...
    trigger fs 
    ...

//这个section一般在init.${ro.hardware}.rc中定义
on fs 
    ...
    mount_all fstab
    ...

在“fs”section中会执行mount_all fstab命令。fstab是Android下比较重要的配置文件,它包含了系统在启动时挂载文件系统和存储设备的详细信息。对应的处理函数为:

int do_mount_all(int nargs, char **args)
{
    ...

    pid = fork();
    if (pid > 0) {
        // 父进程,等待子进程的处理返回结果
        int wp_ret = TEMP_FAILURE_RETRY(waitpid(pid, &status, 0));

        if (WIFEXITED(status)) {
            ret = WEXITSTATUS(status);
        } else {
            ret = -1;
        }
    } else if (pid == 0) {
        // 子进程,进一步调用fs_mgr_mount_all()
        fstab = fs_mgr_read_fstab(args[1]);
        child_ret = fs_mgr_mount_all(fstab);
        ...
        _exit(child_ret);
    } else {
        ...
    }

    if (ret == FS_MGR_MNTALL_DEV_NEEDS_ENCRYPTION) {
        ...
    } else if (ret == FS_MGR_MNTALL_DEV_MIGHT_BE_ENCRYPTED) {
        ...
    } else if (ret == FS_MGR_MNTALL_DEV_NOT_ENCRYPTED) {
        ...
        // 这里就将"nonencrypted"中的操作加入到操作队列中
        action_for_each_trigger("nonencrypted", action_add_queue_tail);
    } else if (ret == FS_MGR_MNTALL_DEV_NEEDS_RECOVERY) {
        ...
    }
    ...
}

这里注意:如果调用fs_mgr_mount_all()返回结果不是FS_MGR_MNTALL_DEV_NOT_ENCRYPTED,就不会执行action_for_each_trigger(“nonencrypted”, action_add_queue_tail);这样main类别的服务就不会执行,系统就会无法正常启动。

总结

本文简单介绍了系统启动阶段各服务的启动顺序,实际过程会复杂很多。有时间的话,会进一步补充。

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要优化rk3128 android 5.1开机速度,可以采取以下几个措施: 1. 关闭启动时不必要的自启动应用程序:在设置中的应用程序管理中,禁用那些不需要在开机时自动启动的应用程序。这样可以减少开机时的负担,提升开机速度。 2. 清理系统缓存:打开设置,找到存储选项,进入缓存数据,并点击清除缓存按钮。这将清除系统中的临时文件和无用数据,从而提高启动速度。 3. 禁用不必要的动画效果:在开发者选项中,找到动画选项,并将所有的动画效果设置为关闭。这可以减少开机时显示的动画,加快开机速度。 4. 更新系统和应用程序:通过检查系统和应用程序是否有更新,并及时安装最新版本,可以修复一些bug和优化性能,从而提高开机速度。 5. 减少开机启动应用程序:进入设置-应用程序管理-自启动管理,关闭那些不必要的应用程序自启动。这样可以减少开机时需要加载的应用程序数量,提高开机速度。 6. 运行内存清理:在设置-内存中,找到清理内存选项,点击清理内存按钮。这将释放占用了内存的信息和进程,优化系统性能,加快开机速度。 通过以上优化措施,可以提高rk3128 android 5.1开机速度,让设备更加流畅高效。 ### 回答2: 要优化RK3128 Android 5.1开机速度,可以采取以下措施: 1. 清理启动项:在系统设置中禁用不必要的应用程序的自启动选项。这样可以减少开机时需要加载的应用程序数量,提升开机速度。 2. 禁用冷启动:冷启动是指应用程序第一次运行时需要加载的相关数据和资源,导致启动时间较长。可以通过在开发者选项中禁用冷启动来减少开机时应用程序的加载时间。 3. 清理缓存:开机时,系统会加载缓存文件,这些文件可能会导致开机速度变慢。因此,可以定期清理系统缓存,以提高开机速度。 4. 禁用动画效果:在系统设置中,禁用开机动画效果可以减少开机时间。可以通过进入“开发者选项”并将“窗口动画缩放”、“过渡动画缩放”和“动画持续时间缩放”调整为较低的数值或关闭来实现。 5. 更新系统:如果RK3128 Android 5.1的系统版本较旧,建议升级到最新的系统版本。新版本通常会修复一些开机速度方面的问题,并提供更好的性能和稳定性。 通过以上方法优化RK3128 Android 5.1开机速度,可以更快地启动设备,并提升使用体验。 ### 回答3: 为了优化rk3128 android5.1开机速度,可以采取以下几个方法: 1. 清理系统垃圾:首先,可以通过清理系统垃圾文件来释放存储空间,从而提升开机速度。可以使用一些系统清理工具,如CCleaner等来清理系统中的无效文件和缓存。 2. 禁用开机启动程序:在系统设置中,可以禁用一些不必要的开机启动程序。这些自启动程序会消耗系统资源,导致开机速度变慢。通过禁用不必要的自启动程序,可以减少开机时的负荷,从而提升开机速度。 3. 更新系统和应用程序:及时更新系统和应用程序可以优化开机速度。新版本的系统和应用程序通常会修复一些bug,并且优化系统性能。可以定期检查系统更新和应用程序更新,并及时进行更新。 4. 减少开机项:在系统设置中,可以选择性地关闭一些不必要的开机项。这些开机项会在系统启动时加载,影响开机速度。可以根据自己的需求,选择性地关闭不需要的开机项。 5. 使用高速存储卡:如果设备支持外置存储卡,可以使用高速的存储卡来提升开机速度。高速存储卡读写速度更快,可以加快系统的启动时间。 通过以上几个方法的结合使用,可以有效地优化rk3128 android5.1开机速度,提升用户的使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值