当前位置:   article > 正文

解说== frameworks/base/cmds/app_process/_frameworks/base/cmds/incidentd unit test

frameworks/base/cmds/incidentd unit test

 frameworks/base/cmds/app_process/

生成app_process linux执行程序

这是进入java世界的入口点,如果熟悉java的相当于java命令一样创建启动一个Java程序

这里随便扩展一下Android的整个世界观

Android的整个世界观组成由以下

1.linux内核世界 系统硬件驱动相关的地方

2.linux用户世界 相当于windows桌面的环境,只不过是没有UI只用命令调用的地方

3.jni世界 打通2世界和4世界的桥梁,实际就是Java 调用 C/C++ 或者 C/C++ 调用Java 代码的地方

4.Java世界 普通java程序运行的地方

5.Android系统世界 一堆与Android特性有关的java后台服务进程

6.Android应用世界 系统应用和第三方应用就是面对最终用户的地方

而app_process 就是置于在2世界到4世界之间的位置

用法:

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

代码解说部分

frameworks/base/cmds/app_process/app_main.cpp:186

1.main() 代码入口点

先会调用了系统函数prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)

这是操作程序的函数,应该是申明本进程不能调用suid/sgid函数, 文件capabilities, LSMs.

估计是不想给新启动的程序拥有更高的权限以致代码操作不当会危机1世界和2世界吧

注意查了一下这个PR_SET_NO_NEW_PRIVS字段是linux3.5才有的,也就是说这个版本的

aosp要对应linux3.5版本以上才可以,不然app_process 启动不来就悲剧了,因为android系统世界的第一个程序就是在这里诞生的。(剧透一下就是zygote卵化器)

2.分析所有命令启动时的参数,

并且如有需要就改改程序名称

使用的就是系统函数prctl(PR_SET_NAME,...)

所以如果你在设备终端上ps一下

USER     PID   PPID  VSIZE  RSS     WCHAN    PC        NAME
root      75    1     450128 45008 ffffffff b6ebcc64 S zygote
system    340   75    545892 72216 ffffffff b6ebd144 S system_server
radio     540   75    462116 29836 ffffffff b6ebd144 S com.android.server.telecom
radio     576   75    486348 39920 ffffffff b6ebd144 S com.android.phone
u0_a7     622   75    500060 51928 ffffffff b6ebd144 S com.android.launcher
u0_a14    770   75    490008 50340 ffffffff b6ebd144 S com.android.systemui
u0_a25    840   75    461568 29012 ffffffff b6ebd144 S com.android.deskclock
u0_a34    892   75    474884 34964 ffffffff b6ebd144 S com.android.inputmethod.latin
u0_a5     931   75    463500 31596 ffffffff b6ebd144 S android.process.media
u0_a51    959   75    456380 24596 ffffffff b6ebd144 S com.android.smspush
u0_a1     982   75    462176 29804 ffffffff b6ebd144 S com.android.providers.calendar
u0_a9     1069  75    477888 30976 ffffffff b6ebd144 S com.android.mms
u0_a21    1132  75    465224 28944 ffffffff b6ebd144 S com.android.calendar
u0_a28    1159  75    469672 32660 ffffffff b6ebd144 S com.android.email
u0_a65    1174  75    458292 26808 ffffffff b6ebd144 S com.example.android.basicsyncadapter
u0_a81    1196  75    467748 33100 ffffffff b6ebd144 S com.pp.assistant:ppservice
u0_a81    1239  75    467044 32464 ffffffff b6ebd144 S com.pp.assistant
u0_a29    1278  75    460052 26904 ffffffff b6ebd144 S com.android.exchange
 

看到了没有,其实以上的都是原本程序名称都是app_process,只不过是跟着需要换了名称而已,

所以有时在看代码很难发现找到入口点,就是这个原因了.

3.调用启动java vm的函数

runtime.start()

启动的类型模式有

Application 应用

SystemServer 系统服务

Tool 工具

Zygote 卵化器

307         runtime.start("com.android.internal.os.ZygoteInit", args);进入卵化器程序

这个地方就是java世界第一个程序的入口,如想看java世界的第一行java程序代码请找com.android.internal.os.ZygoteInit这个类

309         runtime.start("com.android.internal.os.RuntimeInit", args);进入应用/系统服务/工具程序

到这里app_process工作完成了,终于可以进入java世界去玩耍了。

那问题来了,不是说zygote卵化器是android系统世界里第一个诞生的程序吗,是什么时候诞生的?
/system/core/rootdir/init.zygote32.rc
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
明白了吧!就是从这里诞生的。。。。。。。。。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/324177
推荐阅读
相关标签
  

闽ICP备14008679号