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底层的实现有
了进一步的认识
相关文章推荐
- Android Notification的多种用法
- Android动画--属性动画
- Failed to find 'ANDROID_HOME' environment variable
- Attribute is missing the Android namespace prefix
- 回调机制在 Android 监听用户界面操作中的体现
- MVP模式在Android项目中的使用
- android存储数据
- Android-Data Backup
- 一个Android登陆/注册XML布局文件代码
- Android开发入门前准备
- Android简单计时器的实现
- Android Bitmap 常见的几个操作:缩放,裁剪,旋转,偏移
- Android TouchEvent分发
- Android Studio你不知道的调试技巧
- Android开发艺术-第七章Android动画深入分析读书笔记
- Android 系统稳定性 - ANR(二)
- Android 系统稳定性 - ANR(一)
- 生产实习(Android)五
- 在Android Studio 中正确使用adil ”绝对经典“
- Android串口编程