`
runfeel
  • 浏览: 904827 次
文章分类
社区版块
存档分类
最新评论

Android App的启动过程

 
阅读更多

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()
  • Linkerlinker_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启动的zygotefolk进程之后,并没有执行execve指令,因此是共享了zygote的代码段和数据段。其它的java进程,可以看做都是zygote的克隆,克隆之后的进程,各自根再据自己的需求(java代码),解释java语言。

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


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

er

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

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

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

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

分享到:
评论

相关推荐

    Android启动流程app安装和启动原理.docx

    Android应用安装有如下四种方式 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面 3.ADB工具安装――没有安装界面。 4.第三方应用安装――通过SD卡里的APK文件...

    appWidget启动Activity

    使用appWidget启动一个Activity

    android appwidget全面解析

    android的appwidget全面解析及启动运行过程。

    APP启动流程详解

    详细的解说了APP的启动过程及其核心代码,为学习Android framework框架提供了很好的学习资料

    Android-Anchors是一个基于图结构支持同异步依赖任务初始化Android启动框架

    其锚点提供 "勾住" 依赖的功能,能灵活解决初始化过程中复杂的同步问题。参考 alpha 并改进其部分细节, 更贴合 Android 启动的场景, 同时支持优化依赖初始化流程, 自动选择较优的路径进行初始化。

    Android在一个app中实现另一个app的自动安装,安装完成后自动打开(需Root)

    Android在一个app中实现另一个app的自动安装,安装完成后自动打开(需Root),详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/77485561

    给App开发人员讲点Android底层知识.pptx

    1、Binder 2、AIDL 3、PMS 4、App启动过程

    Android Launch Process(安卓系统启动过程)

    Android的系统启动流程,从开机到打开桌面的大概流程。

    Android 优化之app启动优化的实现

    App 启动方式 冷启动 App 没有启动过或 App 进程被杀,系统中不存在该 App 进程,此时启动即为冷启动。需要创建 App 进程,加载相关资源,启动 Main Thread,初始化首屏 Activity 等。在这个过程中,屏幕会显示一个...

    探索Android FrameWork底层开发视频全套

    3.Android编译过程分析 4.android.mk初识 5.Android.mk学习1 6.Android.mk学习2 7.Android.mk学习3 8.Android启动课程大纲 9.Android启动模式 10.init启动分析 11.走入init启动脚本 12.init脚本解析分析 13.init脚本...

    Android AOSP日志文件

    用于分析Android手机启动过程的日志

    java软件笔试题-MyNotebook:我大学时期的笔记本

    APP启动过程 LeakCanary源码分析 React-Native源码分析 gradle源码分析 part 2:设计模式与架构 part 3:编程语言 & 前端 & 机器学习 C++笔记 part 4: 数据结构与算法 part 5: 笔试/面试 part 6:专业基础 输入URL到...

    android WebView预加载

    现在web app越来越多,webview控件的使用也越来越重要。 有时我们会在启动页或引导页之后,加载一个webview为控件的主页。 但如果跳转之后再加载,会看到webview有一个加载的过程,如果网页较大可能加载起来会很慢。...

    Android相机启动加速详解

    用户在使用app过程中,过长的等待会产生焦虑。我们要做的就是让用户尽量感知不到相机启动的耗时。 按照网上能搜到的一般相机Sample的说法,从启动相机到实时预览,我们需要做三件事:1.构建一个GlSurfaceView并获取...

    Android 系统服务TelecomService启动过程原理分析

    Telecom模块的启动与初始化过程; 接下来一篇文章,主要以实际通话过程为例,分析下telephony收到来电后如何将电话信息发送到Telecom模块以及Telecom是如何处理来电。 什么是Telecom服务 Telecom是Android的一个...

    android开发入门与实战(上)

    9.1.2 用Intent启动一个新的Activity 9.1.3 Intent详细讲解 9.1.4 Android解析Intent实现 9.2 用广播告诉你——利用Intent来广播(BroadCast)事件 9.2.1 实现Android中的广播事件 9.2.2 BroadCastReceiver介绍 9.3 ...

    Android启动页解决方案(推荐)

    启动页几乎成为了每个app的标配,有些商家在启动页中增加了开屏广告以此带来更多的收入。目前启动页的广告都有倒计时的功能,那么我们在倒计时的过程中能做些什么呢? 这篇文章主要包括以下两方面内容 集成腾讯广告...

    android bugreport

    bugreport 记录了android启动过程的log,以及启动后的系统状态,包括进程列表,内存信息,VM信息等等到。通过adb bugreport > bugreport.txt 可以将bugreport取到bugreport.txt中。

    Java最全面试题宝典.rar

    APP启动过程 Activity启动流程以及界面展示过程 图片三级缓存 Bitmap的分析与使用 热修复的原理 AIDL Binder机制 Zygote和System进程的启动过程 Android中的MVC,MVP和MVVM MVP Android开机过程 Retrofit源码分析 ...

    最全java面试题.zip

    APP启动过程 Activity启动流程以及界面展示过程 图片三级缓存 Bitmap的分析与使用 热修复的原理 AIDL Binder机制 Zygote和System进程的启动过程 Android中的MVC,MVP和MVVM MVP Android开机过程 Retrofit源码分析 ...

Global site tag (gtag.js) - Google Analytics