Android Framework学习启动流程(一)-init

776 阅读3分钟

Android 系统 基于9.0.0 启动-init

以下所有学习资源来自于刘叔的,也可以直接略过我去读源文,我只是记录自己的学习过程.

传送门Android框架层

init相关源码位于: system/core/init

init之前:

  • 开机执行引导程序Bootloader 拉起系统OS并运行
  • 启动内核 开始设置系统设置 解析init配置文件
  • 启动init进程 入口位于system/core/init/init.cpp的main函数

init职责:

  1. 创建zygote
  2. 初始化和启动属性服务
  3. 创建文件夹饼挂载设备
  4. 解析init.rc配置文件启动zygote进程

1. init入口main函数

int main(int argc, char** argv) {
    ...
    //初始化属性资源
    property_init();
    ...
    sigchld_handler_init();
    ...
    property_load_boot_defaults();
    export_oem_lock_status();
    //启动属性服务
    start_property_service();
    set_usb_controller();
    ...
    ActionManager& am = ActionManager::GetInstance();
    ServiceList& sm = ServiceList::GetInstance();
    //加载启动的脚本 解析init.rc文件
    LoadBootScripts(am, sm);
    ...
    return 0;
}

main函数 主要步骤

  1. 初始化属性资源
  2. 启动属性服务
  3. 加载启动的脚本 解析init.rc文件

2. LoadBootScripts 函数

static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_list) {
    Parser parser = CreateParser(action_manager, service_list);
    std::string bootscript = GetProperty("ro.boot.init_rc", "");
    if (bootscript.empty()) {
        //解析init.rc文件 位于system/core/rootdir/init.rc
        //init.rc是一个配置文件,内部由Android初始化语言编写(Android Init Language)编写的脚本
        parser.ParseConfig("/init.rc");
        if (!parser.ParseConfig("/system/etc/init")) {
            late_import_paths.emplace_back("/system/etc/init");
        }
        if (!parser.ParseConfig("/product/etc/init")) {
            late_import_paths.emplace_back("/product/etc/init");
        }
        if (!parser.ParseConfig("/odm/etc/init")) {
            late_import_paths.emplace_back("/odm/etc/init");
        }
        if (!parser.ParseConfig("/vendor/etc/init")) {
            late_import_paths.emplace_back("/vendor/etc/init");
        }
    } else {
        parser.ParseConfig(bootscript);
    }
}

3. init.rc 文件

//位于system/core/rootdir/init.zygote64.rc
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    writepid /dev/cpuset/foreground/tasks

4. 解析rc文件里的service

//位于 system/core/init/service.cpp
//1.解析init.rc文件内的service
Result<Success> ServiceParser::ParseSection(std::vector<std::string>&& args,
                                            const std::string& filename, int line) {
    if (args.size() < 3) {
        return Error() << "services must have a name and a program";
    }

    const std::string& name = args[1];
    if (!IsValidName(name)) {
        return Error() << "invalid service name '" << name << "'";
    }

    Subcontext* restart_action_subcontext = nullptr;
    if (subcontexts_) {
        for (auto& subcontext : *subcontexts_) {
            if (StartsWith(filename, subcontext.path_prefix())) {
                restart_action_subcontext = &subcontext;
                break;
            }
        }
    }

    std::vector<std::string> str_args(args.begin() + 2, args.end());
    //根据参数 构造service对象
    service_ = std::make_unique<Service>(name, restart_action_subcontext, str_args);
    return Success();
}

Result<Success> ServiceParser::ParseLineSection(std::vector<std::string>&& args, int line) {
    return service_ ? service_->ParseLine(std::move(args)) : Success();
}
//2.将service加入vector类型的services链表中
Result<Success> ServiceParser::EndSection() {
    if (service_) {
        Service* old_service = service_list_->FindService(service_->name());
        if (old_service) {
            if (!service_->is_override()) {
                return Error() << "ignored duplicate definition of service '" << service_->name()
                               << "'";
            }

            service_list_->RemoveService(*old_service);
            old_service = nullptr;
        }
        //将service对象加入到services链表中
        service_list_->AddService(std::move(service_));
    }

    return Success();
}

5. 开始启动zygote

位于 system/core/rootdir/init.rc
...
on nonencrypted
    class_start main //main即zygote 
    class_start late_start
...

6. class_start对应的函数为do_class_start 位于system/core/init/builtins.cpp

static Result<Success> do_class_start(const BuiltinArguments& args) {
    // Starting a class does not start services which are explicitly disabled.
    // They must  be started individually.
    for (const auto& service : ServiceList::GetInstance()) {
        if (service->classnames().count(args[1])) {
            if (auto result = service->StartIfNotDisabled(); !result) {
                LOG(ERROR) << "Could not start service '" << service->name()
                           << "' as part of class '" << args[1] << "': " << result.error();
            }
        }
    }
    return Success();
}
...

7. StartIfNotDisabled() 位于 system/core/init/service.cpp

Result<Success> Service::StartIfNotDisabled() {
    if (!(flags_ & SVC_DISABLED)) {
        return Start();
    } else {
        flags_ |= SVC_DISABLED_START;
    }
    return Success();
}

8. Start() 函数

Result<Success> Service::Start() {
    bool disabled = (flags_ & (SVC_DISABLED | SVC_RESET));
    flags_ &= (~(SVC_DISABLED|SVC_RESTARTING|SVC_RESET|SVC_RESTART|SVC_DISABLED_START));
    // 如果service 已经在运行 则返回成功
    if (flags_ & SVC_RUNNING) {
        if ((flags_ & SVC_ONESHOT) && disabled) {
            flags_ |= SVC_RESTART;
        }
        // It is not an error to try to start a service that is already running.
        return Success();
    }
    ...
    }
    //判断需要启动的service对应的执行文件是否存在 不存在则返回错误信息
    struct stat sb;
    if (stat(args_[0].c_str(), &sb) == -1) {
        flags_ |= SVC_DISABLED;
        return ErrnoError() << "Cannot find '" << args_[0] << "'";
    }
    ...
    pid_t pid = -1;
    if (namespace_flags_) {
        pid = clone(nullptr, nullptr, namespace_flags_ | SIGCHLD, nullptr);
    } else {
        //复制作为子进程
        pid = fork();
    }
    ...
    //通过execve执行程序
    if (!ExpandArgsAndExecv(args_)) {
        PLOG(ERROR) << "cannot execve('" << args_[0] << "')";
    }
    ...
    NotifyStateChange("running");
    return Success();
}

9. ExpandArgsAndExecv()函数

static bool ExpandArgsAndExecv(const std::vector<std::string>& args) {
    std::vector<std::string> expanded_args;
    std::vector<char*> c_strings;
    expanded_args.resize(args.size());
    c_strings.push_back(const_cast<char*>(args[0].data()));
    for (std::size_t i = 1; i < args.size(); ++i) {
        if (!expand_props(args[i], &expanded_args[i])) {
            LOG(FATAL) << args[0] << ": cannot expand '" << args[i] << "'";
        }
        c_strings.push_back(expanded_args[i].data());
    }
    c_strings.push_back(nullptr);
    //执行system/bin/app_process
    return execv(c_strings[0], c_strings.data()) == 0;
}


10. 进入app_processmain函数,完成启动zygote

//位于framework/cmds/app_process/app_main.cpp
int main(int argc, char* const argv[])
{
    ...
    //启动zygote
    if (zygote) {
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    } else if (className) {
        runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
    } else {
        fprintf(stderr, "Error: no class name or --zygote supplied.\n");
        app_usage();
        LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
    }
}

流程图

init启动流程 仅供参考