Native进程的运行过程

一般程序的启动步骤,可以用下图描述。程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行。

通常,native进程是由shell或者init启动,启动的过程如下:

  • Shell接收到命令,启动一个程序,此时shell首先会fork一个新的进程
  • 新fork的进程,通过execve系统调用,陷入到内核中,内核检查和加载需要执行的二进制映像文件,检验其合法性及权限。通常用户态进程要启动一个新的程序(如shell),fork后,execve要紧跟着执行,这样会有更好的效率(由于使用COW技术,这样可以避免页表复制,而execve后,之前进程中的所有内容都是无用的,若execve紧跟fork后,可以避免COW引起的拷贝);
  • 通常二进制文件都会要依赖一些系统动态库,此时kernel会启动加载器/system/bin/linker,执行linker的__linker_init()
  • Linker的linker_init(),会分析二进制的elf文件,加载依赖的动态库文件,然后转入二进制映像的入口函数__start中执行
  • __start会调用C库的初始化函数__libc_init()
  • __libc_init()会调用映像的main函数,这个main函数也就是用户app的入口函数
  • main() 函数执行完毕后,通过exit()退出进程执行

需要注意的是,android bionic提供的加载器是/system/bin/linker,而普通linux系统用的glibc是/lib/ld-linux-xx.so.2。这也是为何其他linux平台同指令架构的二进制文件,不能在android上运行的原因之一:启动用户进程的加载器这个程序运行的第一步就出错了。

Java进程的运行过程

Java进程的启动比较特殊,Java进程是zygote启动的,zygote在folk进程之后,并没有执行execve指令,因此是共享了zygote的代码段和数据段。其它的java进程,可以看做都是zygote的克隆,克隆之后的进程,各自根再据自己的需求(java代码),解释java语言。

也就是说:Android的所有进程,从native角度看都是zygote。 其对应的程序都是 /system/bin/app_process,虚拟机是运行在其中的。

那为何java进程又如此的不同呢? 实际上,从native的角度看,不同的各种java程序,可以如此理解:只是/system/bin/app_process 这个程序,因为不同的输入(Java dex字节码)而引起的。

上图中,user APK实际上市zygote的一个克隆(启动->进入main等之前的流程没有画出, app进程没有这个步骤,是从zygote进程中克隆过来),差别主要在dvm虚拟机执行的java代码的不同导致的表现的行为差异巨大。

Java进程没有执行exec调用,这样有一个很大的好处:使用linux的COW(copy on Write)技术,就可以在多个java进程间,共享内存资源——主要是java的核心库。

Java程序也可以使用native库,此时的native库需要通过dlopen来打开(即java中,使用System.loadLibrary()方法加载so库,虚拟机对应会调用的C库方法),dlopen加载so库的过程中,依旧会通过linker分析处理so库的elf信息,加载其它依赖的动态库。

(注:zygote实际上是/system/bin/app_process,zygote只是app_process的别名)

转载于:https://www.cnblogs.com/lanrenxinxin/p/4943632.html

android app启动过程相关推荐

  1. linux加载内核后如何运行app,Android app启动过程

    Native进程的运行过程 一般程序的启动步骤,可以用下图描述.程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行. 通常,native进程是由shell或者init启 ...

  2. android app启动过程(转)

    Native进程的运行过程 一般程序的启动步骤,可以用下图描述.程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行. 通常,native进程是由shell或者init启 ...

  3. Android系统(116)---APP启动过程

    APP启动过程 上图就可以很好的说明App启动的过程 ActivityManagerService组织回退栈时以ActivityRecord为基本单位,所有的ActivityRecord放在同一个Ar ...

  4. Android的启动过程

    Passion注:本篇文章描述的是Android的启动过程,不包括Linux的启动过程 分别来自 http://dingpwen.spaces.live.com/blog/cns!4CADD02D22 ...

  5. Framework学习(二)Android的启动过程

    Android设备的启动过程 上一张介绍了Android的系统的整体架构,认识了体系的构造,今天就讲一下,Android的系统的启动过程. 看了架构图,我们知道架构的设计是至上而下的,但是,Andro ...

  6. 一篇文章看明白 Android Service 启动过程

    Android - Service 启动过程 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文章看明白 An ...

  7. android开发进阶(一)-- android app启动流程

    这篇文章写得很详细: http://www.jianshu.com/p/a5532ecc8377 作者曾经在高通的Android性能组工作, 主要工作是优化Android Application的启动 ...

  8. android启动画面白屏,Android app启动时黑屏或者白屏的原因及解决办法

    1.产生原因 其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景. 示例: 2.解决办法 通过设置设置Style (1)设置背 ...

  9. android打开app白色页面,完美解决Android App启动页有白屏闪过的问题

    应用启动的时候有短暂的白屏,如图: 可以通过设置theme的方式来解决 @color/colorPrimary @color/colorPrimaryDark @color/colorAccent t ...

最新文章

  1. 前端必须会的基本知识题目
  2. 联想杜比音效_联想小新15 2020锐龙版开售
  3. # vmware异常关机后,虚拟系统无法启动的解决办法
  4. CTFshow 文件上传 web165
  5. ADMM参考资料(part1)
  6. 【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)
  7. leetcode 872. 叶子相似的树(dfs)
  8. unity mysql增删改查,XML的使用,增删改查(Unity中的)
  9. 三言两语话敏捷(2) - 持续集成
  10. 《涂抹Oracle—三思笔记之一步一步学Oracle》看书笔记(第一章)
  11. 史上最全Nginx面试题及答案
  12. 年终将至,财务人如何做好数据分析?
  13. 同程艺龙解除合作,同程支付艺龙3000万补偿金
  14. 平安夜 送自己一个小博客
  15. 史上最难的初等几何问题?分享一个参考答案
  16. 2021-02-10
  17. electron解决下载慢(亲测有效)
  18. C# GDI画图系列(五) 添加文字和导出图片等附加功能
  19. 基于Visual Graph快速开发出电力系统
  20. 如何选择优秀的期货公司开户

热门文章

  1. Response.Redirect奇怪现象
  2. CLIP-ViL:CLIP对视觉和语言任务有多大的好处?UC BerkeleyUCLA团队给出了答案!
  3. 短视频生产利器!视频裁剪之横屏转竖屏新技术,出自腾讯多媒体实验室
  4. 别再抱怨 TensorFlow2.0 辣鸡了,会了是“真香”
  5. CPU上跑到 33 FPS 的简单轻量级人体姿态估计网络
  6. CVPR 2019 | 告别低分辨率网络,微软提出高分辨率深度神经网络HRNet
  7. OpenCV | 图片与视频的相互转换(C++Python)
  8. 文本数据处理的终极指南-[NLP入门]
  9. c语言 炸弹文件,炸弹超人游戏c语言简板
  10. android复位机器人图片_Universal-Image-Loader 图片异步加载类库还不熟?