android java代码的启动:app_process
来源:互联网 发布:windows 进程监控 编辑:程序博客网 时间:2024/05/18 22:40
在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消息。
- android java代码的启动:app_process
- android java代码的启动:app_process
- android java代码的启动:app_process
- android java代码的启动:app_process
- Android上app_process启动java进程
- android启动:app_process实现恢复出厂设置可恢复的apk预置
- 解析android framework下利用app_process来调用java写的命令及示例
- Android:adb通过app_process调用java类报错-java.lang.ClassNotFoundException
- android Java代码的启动
- android中的app_process命令
- app_process command in Android
- android:app_process两种用法
- android 启动第三方程序的代码
- android启动其他应用的一段代码
- android的启动过程(代码)
- android 启动其他应用的一段代码
- android启动其他应用的一段代码
- android启动其他应用的一段代码
- VARIANT 变量
- C#开源持久层框架
- YesKey 产品介绍
- 这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
- 成功需要走十步的话,三五步之间最难走……[
- android java代码的启动:app_process
- 一个简单的2选1数据选择器的测试平台(Testbench)
- Jive之抽象工厂模式
- 登录mysql出现/var/lib/mysql/mysql.sock不存在以及mysql dead but subsys locked的问题
- 字符串處理(按指定的關鍵字在字段中出現的次數排序)
- 案例分析准备资料收集
- 如何使用来自 Rich Edit(CRichEditCtrl) 控件的内置打印功能
- 用Crosstool 制作交叉编译工具链
- Step-by-step plan For a career Change