赞
踩
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
明白了吧!就是从这里诞生的。。。。。。。。。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。