您的位置:首页 > 移动开发 > Android开发

Android系统启动原理

2015-12-23 22:57 375 查看
   我们的Android手机在启动的时候都做了些什么,还有手机为什么需要耗费几十秒才能启动起来??

 一、启动过程

    Android系统架构由四层组成,底层为Linux内核层,第二层为Librares(c或c++)层,第三层为frameWork层

    顶层为app层;framework层和app层都算作是java层


  二、详解

      系统引导程序启动Linux内核时,内核会加载各种数据和驱动,有了驱动就开启Android系统并加载用户

   级别的第一个进程init.c

      1.init.c

	mkdir("/dev",0755);-->创建各种文件夹和挂载目录

	init_parse_config_file("/init.rc");-->解析配置文件init.rc,并加载

      2.init.rc

	启动了Zygote进程,这个进程是Android系统启动关键服务的一个母进程

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd


      3.App_main.cpp文件

	init.rc启动Zygote进程,但是Zygote的初始化是在App_main.cpp的main方法中完成的,如下

int main(int argc, const char* const argv[])
{
// 定义Android运行时环境.
AppRuntime runtime;
int i = runtime.addVmArguments(argc, argv);

...

bool startSystemServer = (i < argc) ?
strcmp(argv[i], "--start-system-server") == 0 : false;
setArgv0(argv0, "zygote");
set_process_name("zygote");

// 使用运行时环境启动Zygote的初始化类.
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer);

...
}


      4.ZygoteInit.java

	由此进入java代码层,加载系统运行依赖的class类和依赖的资源文件,由于类和资源文件很多所以

        系统在此处消耗的时间比较长大约20秒左右,这也是系统启动过程中最耗时的地方,然后启动系统的

	核心服务SystemServer

public static void main(String argv[]) {
// 加载系统运行依赖的class类.
preloadClasses();

...

if (argv[1].equals("true")) {
// Zygote孵化器进程开始孵化系统核心服务.
startSystemServer();
} else if (!argv[1].equals("false")) {
throw new RuntimeException(argv[0] + USAGE_STRING);
}

...
}


      5.SystemServer

	首先加载本地的动态链接库,然后调用动态链接库中的c函数,这时代码执行到了Libraries层

public static void main(String[] args) {
...

// 加载本地的动态链接库.
System.loadLibrary("android_servers");

// 调用动态链接库中的c函数.
init1(args);
}


	在init1(args);中调用了c中的代码com_android_server_SystemServer.cpp

       6.com_android_server_SystemServer

	调用系统初始化类System_init.cpp

static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{
// 转调
system_init();
}

// 此方法没有方法体.
extern "C" int system_init();


       7.System_init.cpp类

	在本类中开启硬件相关的服务、获取Android运行时调用SystemServer下的init2,进入java层

// 开启一些硬件相关的服务.
SensorService::instantiate();

...

// 获取Android运行时环境
AndroidRuntime* runtime = AndroidRuntime::getRuntime();

LOGI("System server: starting Android services.\n");
// 调用SystemServer类中静态方法init2. 从native层转到java层.
runtime->callStatic("com/android/server/SystemServer", "init2");


       8.init2()

	Android系统服务的初始化

public static final void init2() {
Slog.i(TAG, "Entered the Android system server!");

// 进入Android系统服务的初始化.
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();


	调用ServerThread类

       9.ServerThread中run方法执行

public void run() {
...

// 初始化系统的服务, 并且把服务添加ServiceManager中, 便于以后系统进行统一管理.
ServiceManager.addService("entropy", new EntropyService());

...

// 调用了ActivityManagerService的systemReady的方法.
((ActivityManagerService)ActivityManagerNative.getDefault())
.systemReady(new Runnable() {
public void run() {
...
}
});

...
}


       10.ActivityManagerService

	在本类中调用了ActivityStack中的resumeTopActivityLocked方法,在此方法中开启了系统的第一

	个界面,代码如下

// 找到第一个当前没有关闭的Activity, 系统刚刚系统没有任何Activity执行, 所以next为null
ActivityRecord next = topRunningActivityLocked(null);

// Remember how we'll process this pause/resume situation, and ensure
// that the state is reset however we wind up proceeding.
final boolean userLeaving = mUserLeaving;
mUserLeaving = false;

if (next == null) {
// There are no more activities!  Let's just start up the
// Launcher...
if (mMainStack) {
// 开启Launcher应用的第一个Activity界面.
return mService.startHomeActivityLocked();
}
}


	home界面显示,进入手机系统

  三、小结

	以上全都是Android系统的源码,看起来太费劲了,因为不仅有java代码还有c和c++的代码,方法之

    间还来回调用,但是看完源码后的收获是非常大的,虽然很多都还不懂,但是对于Android底层的实现有

    了进一步的认识



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: