1、安卓系统分为四层,分别是Linux内核层、Libraries层、FrameWork层,以及Applications层;
Linux内核层包含了Linux内核和各种驱动;
Libraries层包含各种类库(动态库(也叫共享库)、android运行时库、Dalvik虚拟机),编程语言主要为C或C++
FrameWork层大部分使用java语言编写,是android平台上Java世界的基石
Applications层是应用层,我们在这一层进行开发,使用java语言编写
2、Dalvik VM和传统JVM的区别:
(1)JVM虚拟机运行的是Java字节码(通常是.class文件),但Dalvik运行的是其专有的dex(Dalvik Executable)文件。
(2)JVM直接从.class文件或JAR包中加载字节码然后运行,而Dalvik则需要通过DX工具将应用程序的所有.class文件编译成.dex文件,然后再运行该.dex文件
(3)专有的.dex文件减少了.class文件中的冗余信息,而且会把所有.class文件整合到一个文件中,从而提高运行性能;而且DX工具还会对.dex文件进行一些性能的优化。
(4)基于寄存器实现。大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。一般来说,基于寄存器的虚拟机具有更好的性能表现,但在硬件通用上略差。
传统JVM:.java -> .class -> 打包成.jar
Dalvik VM: .java -> .class -> 打包成.dex -> 打包成 .apk
3、FrameWork层 ------- JAVA世界
Libraries层 ------- Native世界
Linux层 ------- Linux OS
Java世界和Native世界间的通信是通过JNI层(Java Native Interface,它提供了若干的API实现了Java和其他语言的通
信(主要是C&C++))
JNI层和Native世界都可以直接调用系统底层
android系统的启动
/system/core/init/Init.h
/system/core/init/Init.cpp
/system/core/init/Init_parser.h
/system/core/rootdir/Init.rc
/system/core/init/Init_parser.cpp
/system/core/init/Signal_handler.h
/system/core/init/Signal_handler.cpp
/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
/frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
/frameworks/base/core/services/java/com/android/server/SystemServer.java
/frameworks/base/core/java/com/android/internal/os/Zygote.java
/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
/frameworks/base/cmds/app_process/App_main.cpp (内含AppRuntime类)
/frameworks/base/core/jni/AndroidRuntime.cpp
frameworks/base/core/java/android/app/ActivityThread.java
frameworks/base/core/java/android/app/LoadedApk.java
frameworks/base/core/java/android/app/ContextImpl.java
frameworks/base/core/java/com/android/server/LocalServices.java
frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
frameworks/base/services/core/java/com/android/server/ServiceThread.java
frameworks/base/services/core/java/com/android/server/pm/Installer.java
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
1、BootLoader加载
---加电后,CPU先执行bootloader引导程序,正常启动系统,加载boot.img到RAM,然后执行,boot.img中包含内核
2、Kernel加载
---由bootloader加载kernel,kernel经自解压、初始化、载入built-in驱动程序,完成启动
3、启动init进程:——安卓世界第一个被启动的进程
加载的init.rc配置文件,并开启系统的守护进程(守护media、孵化器zygote、调试桥的守护进程)
①、多媒体的装载:onrestart restart media
②、Java世界的开启:onrestart restart zygote
③、adbd守护也被开启起来了,即调试桥(adb[Android Debug Bridge])的守护进程(adbd[Android Debug Bridge Daemon]) 也被开启起来了
4、Zygote进程(app_main.cpp)启动,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,它是整个JAVA世界的基础----native层
---在 zygote 的 main() 函数中主要做了下面几件事
- 初始化AppRuntime
- 设置进程名为 “zygote”
- AndroidRuntime.start() 启动 ZygoteInit 类,进入 Java 世界(AppRuntime 是 AndroidRuntime 的子类)
这里重点是最后一步,start() 函数里几个重要的步骤是:
- startVm() 启动虚拟机,配置各种虚拟机的参数
- startReg() 注册大量JNI 函数
- JNIEvn->CallStaticVoidMethod() 调用 ZygoteInit 类的 main() 函数
5、.ZygoteInit(ZygoteInit.java) 初始化---java层
- 创建 ZygoteServer,并建立 Socket 监听,用来和ActivityManagerService等通讯
- preload(),预加载大量的类和资源文件
- startSystemServer(),通过一次 fork 启动 system_server 进程
- 通过 ZygoteServer.runSelectLoop() 处理客户端发起的 Socket 连接
- startSystemServer() 中 fork 出 system_server 进程之后,调用 handleSystemServerProcess()
6、SystemServer.java代码中有两个方法,init1()启动Native世界,init2()启动Android的Framework世界(这是旧版本的)
startSystemServer() 函数的关键代码有三处。
(1)定义了一个String[]数组,数组中包含了要启动的进程的相关信息,其中最后一项指定新进程启动后装载的第一个Java类,此处即为com.android.server.SystemServer类;
String args[] = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,
1008,1009,1010,1018,1032,3001,3002,3003,3006,3007",
"--capabilities=" + capabilities + "," + capabilities,
"--runtime-init",
"--nice-name=system_server",
"com.android.server.SystemServer",
};
(2)调用forkSystemServer()从当前的zygote进程孵化出新的进程。该函数是一个native函数,其作用与folkAndSpecilize()相似;
(3)第三处,新进程启动后。在handleSystemServerProcess()函数中主要完成两件事情,第一是关闭Socket服务端,第二是抛出异常MethodAndArgsCaller,通过捕捉异常来调用caller.run(),最终通过反射来启动com.android.server.SystemServer的main 方法。这样做可以清除进程的堆栈,减少内存占用。
PS:抛出异常后,如果异常没有在当前的函数中捕获,那么当前的函数执行就会异常的退出,从应用程序的栈弹出,并将这个异常传递给上一个函数,直到异常被捕获处理,否则,就会引起程序的崩溃。这里通过抛异常的方式启动主要是清理应用程序栈中ZygoteInit.main以上的函数栈帧,以实现当相应的main函数退出时,能直接退出整个应用程序。 当当前的main退出后,就会退回到MethodAndArgsCaller.run而这个函数直接就退回到ZygoteInit.main函数,而ZygoteInit.main也无其他的操作,直接退出了函数,这样整个应用程序将会完全退出
SystemServer.main()
- new SystemServer().run();
- Looper.prepareMainLooper(); //准备主线程循环
- createSystemContext();
---ActivityThread.systemMain() ->ActivityThread.attach(true)
---这里的boolean参数是为了用来区分是否是系统进程,普通应用进程启动时会调用
---ActivityThread.main() -> ActivityThread.attach(false)
- startBootstrapServices(); //启动服务
- startCoreServices();
- startOtherServices();
---system_server进程中的服务启动方式有两种,分别是SystemServiceManager的startService()
和ServiceManager的addService()
---startService() 用于启动继承于SystemService的服务
---addService() 用于初始化继承于IBinder的服务
- Looper.loop(); //启动线性循环,等待消息处理
PS:SystemServer和Zygote共存亡,当SystemServer死亡,Zygote就会自杀