Android 系统分析[1]

时间:2021-08-04 15:48:03

 ANDROID搞了大概5个月了,总感觉到它的这个java封装非常的不爽。这次下载了Froyo的源码,准备好好分析下Android的运行流程。一直有个暗想--能否替换掉JAVA层?搞android最麻烦的就是老记不住它那几个文件的位置,这里将给出详细的路径,方便其他看客了解。

没有固定的顺序,不过大概就是从启动开始的一些东西吧。我的想法是对android了解越多,才越可能在此基础上做最好最完善的改动。真的很不喜欢它的java层。

 

一 用户空间init

我这里不分析linux启动的那第一个程序init。

 init代码在/system/core/init/init.c。感兴趣的可从main函数开始分析

android的其他重要进程都是init加载init.rc配置文件来fork的。其中,最重要的init.rc位于source/system/core/rootdir下。

init.rc有它特有的语法,可google一下就知道了。

 

二 zygote的诞生

 

zygote程序是有app_process弄出来的,app_process的启动在init.rc中有对应行。

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

//第一个zygote是这个服务的名字,实际启动的程序位于system/bin下的app_process,后面是这个程序的启动参数
    socket zygote stream 666

//这个表示init将创建一个unix域的socket,666是rwx的读写执行权限。
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media

其中,app_process位于/frameworks/base/cmds/app_process/app_main.cpp中。

下面分析它的mian函数。

 

从上面代码注释可以看出,很多工作都交给了Runtime对象来处理,这个runtime对象也是在这个cpp文件中定义的。我们来看一下。

 

其中,基类AndroidRuntime.h在frameworks/base/include/android_runtime/AndroidRuntime.h中定义。大概看看里边都定义了些什么。

 

AndroidRuntime类主要是和java打交道,而且好像只能由framework调用才能起作用,一般我自己的jni库都不用AndroidRuntime里边定义的方便函数,虽然都是static。原因如下(必须看看它的实现文件才知道原因)

该cpp位置在/frameworks/base/core/jni/AndroidRuntime.cpp中。

 回到app_process的main中,此处已运到到runtime.start("com.android.internal.os.ZygoteInit", startSystemServer)这句话来了,应进去看看start到底干了什么。

说来说去,不如看代码分析。