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字节码)而引起的。
er
上图中,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的别名)
分享到:
相关推荐
在Android应用开发中,"Android App 启动时显示正在加载...以上就是关于Android App启动时显示正在加载图片的相关知识点。通过合理地设计和优化,我们可以提供一个流畅、专业的启动体验,增强用户对应用的第一印象。
本资源包提供了四种不同的Android APP启动页面的实现方式,旨在帮助开发者创建既实用又美观的启动画面。下面将详细探讨这四种方法及其相关知识点。 1. **静态启动页**: 这是最简单的启动页类型,通常仅包含一个...
标题"android监听手机app启动"所指的就是这一功能,即在Android程序中捕获其他应用程序的启动事件。描述中提到,API 20之前和之后的方法有所不同,因为Android系统在不同版本中对权限和隐私保护进行了调整。 在API ...
本文将详细介绍四种常见的Android App启动页面实现方式。 1. **静态启动页** 静态启动页是最简单的形式,它通常包含一个固定的设计图片,如应用的logo或品牌背景。在`res/drawable`目录下创建一张图片资源,然后在...
针对“Android冷启动优化app启动速度(视觉上提高启动速度)”这一主题,我们将深入探讨如何提升应用的启动性能,尤其是视觉上的启动速度。 1. **理解启动流程** - **解析APK**: 应用启动的第一步是解析APK文件,...
然后,init进程启动Zygote进程,这是Android平台的基础进程,它初始化虚拟机(VM),预加载框架类和App所需的资源,并监听Socket请求,以便根据需求孵化新的VM来管理新的App进程。 Zygote进程的名字来源于生物学...
以下将详细讲解如何实现安卓APP的开机自启动,并介绍相关知识点。 首先,我们需要创建一个广播接收器,这个接收器会监听系统的ACTION_BOOT_COMPLETED广播,这是设备完成启动后发送的一个广播。在AndroidManifest....
最后,为了提升用户体验,可以在启动页加载过程中执行一些轻量级的初始化操作,如初始化数据缓存、设置默认主题等。但复杂的初始化工作应放在后台线程进行,以免阻塞主线程。 综上所述,创建一个高质量的Android...
视频应在APP启动时自动播放,无需用户操作。为了保证用户体验,通常会禁用视频的音效,或者在用户手动开启时才播放声音。此外,视频可能还需要包含循环播放、全屏切换等功能。 5. **延迟加载**: 为了不影响APP的...
在这个过程中,我们不使用JNI(Java Native Interface)来实现,而是主要通过Java代码来管理nginx的运行。 首先,了解nginx的基本概念是必要的。nginx是一款高性能的Web服务器,它以其轻量级、高并发和低内存占用而...
1. **Android APP启动方式**: - **冷启动**:当用户首次打开应用程序或者应用程序被完全关闭后再次打开时,系统需要创建一个新的进程来承载应用的所有组件。首先,系统会初始化`Application`类,然后创建并初始化...
然后,在 Android APP 启动时,首先执行壳 DEX 文件,然后对原 DEX 文件进行解密和动态加载。 函数 Native 化方法可以保持 Java 函数在内存中的 Native 属性,并通过 Hook 技术和反射机制隐式恢复和执行原 Java ...
本文将深入探讨如何实现Android app的缓存清理,并基于提供的"CacheClear"压缩包文件,讲解如何封装一个获取和清理缓存的工具类。 首先,了解Android缓存的作用。缓存是为了提高数据读取速度,将常用但加载较慢的...
### Android Init 启动过程分析 #### 一、初始化流程概览 在深入探讨Android的启动过程之前,我们需要明确一点:整个启动流程是从内核开始的。当内核加载完毕并准备好与用户空间进行交互时,它会启动一个称为`init...
在Android应用程序中,启动过程中的白屏或黑屏现象是非常常见的一个问题。这种现象通常发生在应用程序首次启动时,用户会看到一个短暂的空白屏幕,然后才是应用程序的主界面出现。这种情况会影响用户体验,让用户...
然而,有一种特殊的技术使得Android App能够调用并使用未安装的APK文件,这种技术被称为“插件化开发”。本项目名为"ApkDemo",它是一个Android Studio工程,包含两个模块:一个是主应用程序(主apk工程),另一个是...
总结,要在Android Studio中实现Service在app退出后继续运行并开机自启动,需要理解Service的生命周期,正确配置BroadcastReceiver,以及采取保活策略。同时,对App的卡死崩溃进行监控和处理,以提升用户体验和应用...
本文将详细解析如何实现一个Android APP版本更新功能,特别是结合进度条来实时显示下载进度。 首先,我们需要理解Android版本更新的基本流程。通常,这个过程包括检查新版本、下载更新文件(如APK)以及安装更新。...
在"qt for android 更新APP"的场景下,我们讨论的是如何在Android应用程序内部实现更新功能。这通常涉及到以下几个关键知识点: 1. **自动检查更新**:应用启动时或在设定的时间间隔内,通过网络请求(通常是HTTP或...
本文将深入探讨如何实现“Android开发启动app弹出一张广告图片,Dialog可以查看大图,查看某个图片功能”。这个过程涉及到多个关键知识点,包括自定义Dialog、图片加载库的使用以及图片查看器的实现。 首先,我们要...