android java代码的启动:app_process

来源:互联网 发布:图像算法工程师面试题 编辑:程序博客网 时间:2024/05/18 22:52

原文地址:http://blog.csdn.net/chief1985/archive/2009/09/14/4551255.aspx

 

在android上,如果你直接用dalivik去加载framework.jar,你会发现里面的大部分native方法无法使用。同时,在/init.rc里面,你也找不到dalvikvm。在ps列表,也没有dalvikvm。那android是怎么启动java程序的呢?

在android上,java程序是通过app_process启动的。在/init.rc里面,有如下一段代码:

 

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

app_process的命令行参数如下:

app_process [java-options] cmd-dir start-class-name [options]

因此,init.rc里面的各个参数的对应关系为:

-Xzygote: java-options,这些参数会传给dalvik,这些参数必须以-开头,一旦遇到不是以-开头的或者--,代表java-options结束。

/system/bin:cmd-dir,也就是当前目录,文件操作的父路径将为此路径。

start-class-name:空

--zygote --start-system-server:选项。

 

从app_process的main函数(在app_main.cpp里面)可以看出,app_process有两种启动方式:一种是init.rc里面的这种方式,这种方式将会以zygote模式启动com.android.internal.os.ZygoteInit,并将进程名称改为zygote;另外一种是以非zygote模拟启动com.android.internal.os.RuntimeInit,并调用它的main方法,main的最后会执行finishInit,finishInit是一个native方法,这个方法会调用app_process的onStarted方法,在onStarted里面将会调用真正要执行的class。

无论app_process,它都将会调用frameworks/base/core/jni/AndroidRuntime.cpp里面的start

方法(496行)。这 个start方法会根据android属性系统设置dalvik的参数,并初始化java代码的native方法,最终启动dalvik。需要注意的是,java代码的大部分native方法(差不多80%)都是在这里面初始化的,这些初始化代码会检查java代码的正确性(例如是否有对应的native方法,是否有需要的属性等),在初始化过程中,任何一步的错误都将导致进程退出。整个native方法初始化过程如下:start(AndroidRuntime.cpp,766行)->startReg(AndroidRuntime.cpp,1136行)-> register_jni_procs(AndroidRuntime.cpp,1011行)。初始化的java class有(AndroidRuntime.cpp,1018行):

 

这些初始化的native方法是java代码与底层服务打交道的接口,因此我们必须初始化这些方法。

以app_process启动java class的另外一个好处是它会初始化IBinder,这样就可以在java代码和jni代码里面接收IBinder消息。