android的启动过程

分类:android 学习770人阅读评论(0)收藏举报android system server string profiling linux

Android的启动过程可以分为两个阶段,第一阶段是Linux的启动,第二阶段才是Android的启动,下面我们分别来了解一下具体的过程。本篇我们主要是研究android的启动过程,linux的启动我们泛泛而过。

首先看下整个系统的启动过程,如下图:



首先通过init.rc,可以孵化出如下进程:

  • console:启动一个shell.

  • servicemanager:启动binder IPC servicemanager.

  • mountd:绑定定义在/system/etc/mountd.conf的文件.

  • debuggerd:启动debug system.

  • rild:启动radio interfacelayer daemon(跟电话相关).

  • zygote:启动Android Java VMRuntime和 启动systemserver.上层的应用都是从这个孵化出来

  • mediaserver:启动AudioFlinger,MediaPlayerService and CameraService.

以上是linux的启动,有了zygoteprocess后下面便是android的启动了,我们开始深入讲解

android进程都是从zygoteprocess孵化而出,那么zygote启动后都干了啥呢?

servicezygote /system/bin/app_process -Xzygote /system/bin --zygote--start-system-server ---- init.rc

init.rc中得知,我们首先看app_process,即在framework/base/cmds/app_main.cppmain函数中:

intmain(int argc, const char* const argv[])

{……..

runtime.start("com.android.internal.os.ZygoteInit",

startSystemServer);

}

runtime---AppRuntime runtime;

classAppRuntime : public AndroidRuntime(android的运行空间)

我们再看start函数都干了啥?

/*

*Start the Android runtime. This involvesstarting the virtual machine

*and calling the "static void main(String[] args)" method inthe class

*named by "className".

*/

voidAndroidRuntime::start(const char* className, const boolstartSystemServer)

{

LOGD("\n>>>>>>AndroidRuntime START %s <<<<<<\n",

className!= NULL ? className : "(unknown)");

…………………

jclassstartClass;

jmethodIDstartMeth;

………

startClass= env->FindClass(slashClassName);

if(startClass == NULL) {

LOGE("JavaVMunable to locate class '%s'\n", slashClassName);

/*keep going */

}else {

startMeth= env->GetStaticMethodID(startClass, "main",

"([Ljava/lang/String;)V");

if(startMeth == NULL) {

………………

}else {

env->CallStaticVoidMethod(startClass,startMeth, strArray);

…………………………

}

}

从注释看出启动了虚拟机,并调用com.android.internal.os.ZygoteInit里的main方法

继续追踪到frameworks/base/core/java/com/android/internal/os/ZygoteInit.javamain()函数,代码如下:


publicstatic void main(String argv[]) {

try{

VMRuntime.getRuntime().setMinimumHeapSize(5* 1024 * 1024);


//Start profiling the zygote initialization.

SamplingProfilerIntegration.start();


registerZygoteSocket();

…………….

gc();

……………

if(argv[1].equals("true")) {

startSystemServer();

}else if (!argv[1].equals("false")) {

thrownew RuntimeException(argv[0] + USAGE_STRING);

}

if(ZYGOTE_FORK_MODE) {

runForkMode();

}else {

runSelectLoopMode();

}

………………

}

}

privatestatic final boolean ZYGOTE_FORK_MODE = false

main函数可以看出,主要是做一些初始化zygote,并孵化systemservice进程

我们具体看下startSystemServer()方法:

privatestatic boolean startSystemServer()

throws MethodAndArgsCaller,RuntimeException {

……………………

/*Request to fork the system server process */

pid= Zygote.forkSystemServer(

parsedArgs.uid, parsedArgs.gid,

parsedArgs.gids, debugFlags,rlimits,

parsedArgs.permittedCapabilities,

parsedArgs.effectiveCapabilities);

}

以上zygote fork出了system_server进程,systemService这是第一个被zygote孵化出来的,由它启动了android的核心进程,如ActivityManager,WindowManager, PackageManager.我们下一步进入看看它是如何启动上层进程的,代码位于frameworks/base/services/java/com/android/server/systemserver.java

首先看下main函数:

publicstatic void main(String[] args) {

……….

checkStorageSpace();---检查/data空间内存状况,如果是低内存,将会删除/data下的保留文件已腾出空间

…………….

VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);----systemserver会一直在运行,所以会保留一定内存供其持续运行


System.loadLibrary("android_servers");

init1(args);----native方法

}

init1native方法,代码在frameworks/base/services/jni/com_android_server_systemService.cpp中,主要是启动一下native的进程,比如:SurfaceFlinger,AudioFlinger, etc..)

最后调用init2()启动androidservice ---- android.server.ServerThread。具体我们看下:

extern"C" int system_init();

staticvoid android_server_SystemServer_init1(JNIEnv* env, jobject clazz)

{

system_init();

}

上面我们还是没有看到我们想要的,继续看

frameworks/base/cmds/system_server/library/system_init.cpp

extern"C" status_t system_init()

{

…….

sp<ProcessState>proc(ProcessState::self());

sp<IServiceManager>sm = defaultServiceManager();

……………

if(strcmp(propBuf, "1") == 0) {

//Start the SurfaceFlinger

SurfaceFlinger::instantiate();

}

SensorService::instantiate();

……

if(!proc->supportsProcesses()) {

AudioFlinger::instantiate();

MediaPlayerService::instantiate();

CameraService::instantiate();

AudioPolicyService::instantiate();

}

……..

AndroidRuntime*runtime = AndroidRuntime::getRuntime();


LOGI("Systemserver: starting Android services.\n");

runtime->callStatic("com/android/server/SystemServer","init2");

if(proc->supportsProcesses()) {

LOGI("Systemserver: entering thread pool.\n");

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();

}

…………..

}

以上启动了一些native的进程 如SurfaceFlinger,SensorService,MediaPlayerService等等,最后回调到在framework/base/cmds/app_main.cpp init2函数中:

publicstatic final void init2() {

Slog.i(TAG,"Entered the Android system server!");

Threadthr = new ServerThread();

thr.setName("android.server.ServerThread");

thr.start();

}

到这我们来到了启动的最后过程ServerThread,在这里将会启动android上层的各种service,WindowManagerService,ActivityService等等,代码还是在framework/base/cmds/app_main.cpp中,

最后,调用各服务的systemReady()函数通知系统就绪,至此android启动完毕。

更多相关文章

  1. C语言函数以及函数的使用
  2. IPC进程间通信
  3. android 语言切换过程分析
  4. [置顶] Android进程间通信AIDL的使用分析
  5. android后台进程隐藏手段
  6. android的编译和运行过程深入分析
  7. Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程

随机推荐

  1. Android(Lollipop/5.0) Material Design(
  2. android手机安全卫士、Kotlin漫画、支付
  3. Android多语言布局layout
  4. android指纹识别、拼图游戏、仿MIUI长截
  5. Google Android手机操作系统发展历程[信
  6. android 控件使用集锦
  7. android layout布局属性
  8. 从0到1实现一个Android路由(4)——多模块
  9. android中的布局文件
  10. Ubuntu android NDK 配置