init
is the first
process after kernel started. The corresponding source code lies in: /system/core/init.
It does the following tasks step by step:
1.
Initialize log system.
2.
Parse /init.rc and
/init.%hardware%.rc.
3.
Execute early-init action in
the two files parsed in step 2.
4.
Device specific initialize.
For example, make all device node in /dev and download firmwares.
5.
Initialize property system.
Actually the property system is working as a share memory. Logically it looks
like a registry under Windows system.
6.
Execute init action in the
two files parsed in step 2.
7.
Start property service.
8.
Execute early-boot and boot
actions in the two files parsed in step 2.
9.
Execute property action in
the two files parsed in step 2.
10.
Enter into an infinite loop
to wait for device/property set/child process exit events. For example, if an
SD card is plugged in, init will receive a device add event, so it can make
node for the device. Most of the important process is forked in init, so if any
of them crash, init will receive a SIGCHLD then translate it into a child
process exit event, so in the loop init can handle the process exit event and
execute the commands defined in *.rc(it will run command onrestart).
The .rc file is a script file defined by
Android. The default is /system/core/rootdir/init.rc. We can take a loot at the
file format (/system/core/init/readme.txt is a good overall introduction of the
script). Basically the script file contains actions and services.
Actions
-------
Actions are named sequences of commands. Actions
have a trigger which is used to determine when the action should occur.
When an event which matches an
action's trigger occurs, that action is added to the tail of a to-be-executed
queue (unless it is already on the queue).
Each action in the queue is dequeued in sequence
and each command in that action is executed in sequence.
Init handles other activities (device
creation/destruction, property setting, process restarting) "between"
the execution of the commands in activities.
Actions take the form of:
on <trigger>
<command>
<command>
<command>
...
Services
--------
Services are programs which init launches and
(optionally) restarts when they exit.
Services
take the form of:
service <name> <pathname> [
<argument> ]*
<option>
<option>
...
Options
-------
Options are modifiers to services.
They affect how and when init runs the
service.
Triggers
--------
Triggers are strings which can be used to match
certain kinds of events and used to cause an action to occur.
The builtin supported commands are defined in
device/system/init/keywords.h. Commands are implementd in
device/system/init/bultins.c.
The init program only executes five kinds of
triggers: “early-init”, “init”, “early-boot”, “boot”, “property:*”. Take a look
at the following line in default init.rc.
class_start
default
This line is a command for the action
corresponding to “boot” trigger. It will start all services whose class name
equals to “default”. By default, if no class option is defined for a service,
the service’s class name is “default”. So this line will start all the services
in the order of position in the file by default. (BTW, you can start any
service using start commands, if you like.) Any service is run as a forked
process of init, take a look at the source code of service_start in /system/core/init.c.
So according to the default init.rc, the
following services will be executed step by step:
console
: star a shell. The source is in
device/system/bin/ash.
adbd
: start adb daemon. The source is in
device/tools/adbd. By default is disabled.
servicemanager
: start binder system. The
source is in device/commands/binder.
mountd
: mount all fs defined in
/system/etc/mountd.conf if started, receive commands through local socket to
mount any fs. The source is in device/system/bin/mountd.
debuggerd
: start debug system. The source is in
device/system/bin/debuggerd.
rild
: start radio interface layer daemon. The source
is in device/commands/rind.
zygote
: start Android Java Runtime and start system
server. It’s the most important service. The source is in device/servers/app.
media
: start AudioFlinger, MediaPlayerService and
CameraService. The source is in device/commands/mediaserver.
bootsound
: play the default boot sound
/system/media/audio/ui/boot.mp3. The source is in device/commands/playmp3.
dbus
: start dbus daemon, it’s only used by BlueZ.
The source is in device/system/Bluetooth/dbus-daemon.
hcid
: redirect hcid’s stdout and stderr to the
Android logging system. The source is in device/system/bin/logwrapper. By
default is disabled.
hfag
: start Bluetooth handsfree audio gateway, it’s
only used by BlueZ. The source is in device/system/Bluetooth/bluez-utils. By
default is disabled.
hsag
: start Bluetooth headset audio gateway, it’s
only used by BlueZ. The source is in device/system/Bluetooth/bluez-utils. By
default is disabled.
installd
: start install package daemon. The source is in
device/servers/installd.
flash_recovery
: load /system/recovery.img.
The source is in device/commands/recovery/mtdutils.
Zygote
service does the
following tasks step by step:
1.
Create JAVA VM.
2.
Register android native
function for JAVA VM.
3.
Call the main function in the
JAVA class named com.android.internal.os.ZygoteInit whose source is
device/java/android/com/android/internal/os/ZygoteInit.java.
a)
Load ZygoteInit class
b)
Register zygote socket
c)
Load preload classes(the
default file is device/java/android/preloaded-classes)
d)
Load preload resources
e)
Call Zygote::forkSystemServer
(implemented in device/dalvik/vm/InternalNative.c) to fork a new process. In
the new process, call the main function in the JAVA class named
com.android.server.SystemServer, whose source is in
device/java/services/com/android/server.
i.
Load libandroid_servers.so
ii.
Call JNI native init1
function implemented in
device/libs/android_servers/com_android_server_SystemServers. It only calls
system_init implemented in device/servers/system/library/system_init.cpp.
l
If running on simulator,
instantiate AudioFlinger, MediaPlayerService and CameraService here.
l
Call init2 function in JAVA
class named com.android.server.SystemServer, whose source is in
device/java/services/com/android/server. This function is very critical for
Android because it start all of Android JAVA services
.
l
If not running on simulator,
call IPCThreadState::self()->joinThreadPool() to enter into service
dispatcher.
init1 初始化一些本地库,包括audio, media , camero ,内部 执行过程 /system_init.cpp
extern "C" status_t system_init()
{
LOGI("Entered system_init()");
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
LOGI("ServiceManager: %p/n", sm.get());
sp<GrimReaper> grim = new GrimReaper();
sm->asBinder()->linkToDeath(grim, grim.get(), 0);
char propBuf[PROPERTY_VALUE_MAX];
property_get("system_init.startsurfaceflinger", propBuf, "1");
if (strcmp(propBuf, "1") == 0) {
// Start the SurfaceFlinger
SurfaceFlinger::instantiate();
}
// On the simulator, audioflinger et al don't get started the
// same way as on the device, and we need to start them here
if (!proc->supportsProcesses()) {
// Start the AudioFlinger
AudioFlinger::instantiate();
// Start the media playback service
MediaPlayerService::instantiate();
// Start the camera service
CameraService::instantiate();
// Start the audio policy service
AudioPolicyService::instantiate();
}
// And now start the Android runtime. We have to do this bit
// of nastiness because the Android runtime initialization requires
// some of the core system services to already be started.
// All other servers should just start the Android runtime at
// the beginning of their processes's main(), before calling
// the init function.
LOGI("System server: starting Android runtime./n");
AndroidRuntime* runtime = AndroidRuntime::getRuntime();
LOGI("System server: starting Android services./n");
runtime->callStatic("com/android/server/SystemServer", "init2");
// If running in our own process, just go into the thread
// pool. Otherwise, call the initialization finished
// func to let this process continue its initilization.
if (proc->supportsProcesses()) {
LOGI("System server: entering thread pool./n");
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
LOGI("System server: exiting thread pool./n");
}
return NO_ERROR;
}
调用 init2初始化系统服务
runtime->callStatic("com/android/server/SystemServer", "init2");
SystemServer::init2 will start a new thread to
start all JAVA services as follows:
Core Services:
1.
Starting Power Manager
2.
Creating Activity Manager
3.
Starting Telephony Registry
4.
Starting Package Manager
5.
Set Activity Manager Service
as System Process
6.
Starting Context Manager
7.
Starting System Context
Providers
8.
Starting Battery
Service
9.
Starting Alarm Manager
10.
Starting Sensor Service
11.
Starting Window Manager
12.
Starting Bluetooth Service
13.
Starting Mount Service
Other services
1.
Starting Status Bar Service
2.
Starting Hardware Service
3.
Starting NetStat Service
4.
Starting Connectivity Service
5.
Starting Notification Manager
6.
Starting DeviceStorageMonitor
Service
7.
Starting Location Manager
8.
Starting Search Service
9.
Starting Clipboard Service
10.
Starting Checkin Service
11.
Starting Wallpaper Service
12.
Starting Audio Service
13.
Starting HeadsetObserver
14.
Starting AdbSettingsObserver
Finally SystemServer::init2 will call
ActivityManagerService.systemReady to launch the first activity by senting
Intent.CATEGORY_HOME intent
.
There is another way to start system server,
which is through a program named system_server whose source is
device/servers/system/system_main.cpp. It also calls system_init to start
system services. So there is a question: why does Android have two methods to
start system services? My guess is that directly start system_server may have
synchronous problem with zygote because system_server will call JNI to start
SystemServer::init2, while at that time zygote may not start JAVA VM yet. So
Android uses another method. After zynote is initialized, fork a new process to
start system services.
分享到:
相关推荐
(1)设备驱动初始化与注册函数 从Linux 2.6起引入了一套新的驱动管理和注册机制:Platform_device和Platform_driver。Linux中 大部分的设备驱动,都可以使用这套机制, 设备用Platform_device表示,驱动用Platform_...
Android 系统 Linux系统 内核kernel启动流程 init 进程介绍,init进程初始化,内核启动三个阶段深入浅出介绍,简单易懂 。kernel_init() 函数介绍,ramdisk_execute_command,execute_command /sbin/init,/etc/init,...
• bootloader---初始化、从Flash读取Kernel镜像及一些必须的配置信息,引导kernel启动 • linuxkernel启动linux内核 • init进程启动 • init进程读取init.rc启动必要的daemon程序,如:adbd、...
1. OS级别,由bootloader载入linux kernel后(注:bootloader和制造商有关,一般都是自己修改后的bootloader,大同小异,无外乎加载了自己的安全机制,我们可以用最常见的uboot来考虑),kernel开始初始化, 并载入...
2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance Alliance Alliance Alliance 什么是开放手机联盟? 开放手机联盟, Open Handset Alliance :是美国 Google 公司与 2007 年 ...
高层选项(选择不同的解压选项),设置媒体分区文件,添加预制媒体文件,设置数据文件(添加预制DATA文件),设置LOGO镜像(更换LOGO图片),设置Kernel/Recovery(修改KERNEL初始化文件),设置基本信息,解压system镜像,...
2、将本补丁的kernel/drivers/Led下面的文件Makefile和Led.c拷贝到drivers/Led目录下; 3、根据具体的平台修改Led.c文件中Gpio_init的端口初始化和CONFIG_LED_GPIO的端口定义; 其中: Gpio_init主要根据CONFIG_LED...
2.Uboot 初始化系统以及加载kernel image的时间 3.Kernel 启动所需要的时间 4.Init 挂载文件系统以及Android系统启动的时间 优化思路: 1.针对影响响应时间,探讨最佳响应时间,这个主要是考虑长短按的区别。 2....
详细介绍了linux中关于ufs及scsi协议实现,以及和block和文件系统层之间的调用关系:基于linux kernel4.4
系统启动大致可分为一下几个阶段:• bootloader---初始化、从Flash读取Kernel镜像及一些必须的配置信息,引导kernel启动• linuxkernel启动linux内核• init进程启动• init进程读取init.rc启动...
1.在dts里配置两套mipi的初始化指令和mipi的hs_clock (假如只有两屏兼容) 2.在uboot阶段读取mipi屏IC的寄存器值mipi.id,根据寄存器值来区分读取都的是那块屏,并加载对应的屏幕数据,最后将该寄存器值mipi.id...
硬件重新初始化存在一些问题,需要修补 kexec 并加载内核。 其中一些工作在其他 x86 Intel Mid 平板电脑上很有用。 当前状态:内核加载,启动到 Android。 USB、触摸屏、视频、声音、MMC、SD 卡、电源管理、wifi、...
初始化频谱 初始化频谱 这些文件包含在此仓库的ramdisk文件夹中。 要使用这些ramdisk文件,请添加 import /init.spectrum.rc 到设备主ramdisk文件的顶部。 接下来,将您的内核名称添加到应用程序。 打开init....
BlackBox内核BlackBox Kernel与以下设备兼容-小米Redmi Note 5 Pro(Whyred) Android第一代(新芽) Yu Yureka(蕃茄)从源代码构建自定义内核初始化Linux发行版,克隆存储库并执行构建脚本// Establish ...
当设备连接被检测到后,USBD软件会使用端口0来初始化设备,执行普通的(非特殊)配置,并且获得有设备提供的其他端点的信息。端点是以他们的端点数目(取决于设计的时间),总线宽带,访问频率,延迟和处理错误要求...
第 1 章 体系结构 第 1 问: Q:请问在初始化 CPU 堆栈的时候一开始在执行 mov r0, LR 这句指令时处理器是什么模式 A:复位后的模式,即管理模式.
3、借用bma250.c这个驱动程序,初始化的部分修改为初始化bmi160,调通BMI160的gsensor部分。 4、完善全志/博世提供的bmi160的驱动程序,调通BMI160的gsensor部分。 (陀螺仪部分鱼刺类似,陀螺仪部分借用l3gd20.c来...
态度决定一切:从初始化函数开始............................................................................................41 内核学习的心理问题...........................................................
态度决定一切:从初始化函数开始 ..................................................................................... 26 内核学习的心理问题 ................................................................