下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

使用app_process如何启动android java程序

作者:课课家教育     来源: http://www.kokojia.com点击数:4613发布时间: 2019-04-01 14:16:38

标签: android程序java开发课程java程序开发

      在app_process程序中,它会对Android的JNI进行手动注册的,能很好的使用Android的API,因此通过运行app_process程序启动一个java程序,是一个比较完美的方式。app_process程序是一个C程序,它的源码位于frameworks\\base\\cmds\\app_process。

使用app_process如何启动android java程序_android_java_java程序_课课家

  在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消息。

     本文主要介绍了使用app_process是如何启动android java程序的基本内容和方法,介绍了app_process的命令行参数,main函数和一些方法等。想要深入学习的同学可以自行查阅或后续我们还有文章更新。

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程