Android程序是如何运行起来的?


文章目录

  • Android程序是如何运行起来的?
    • 概述

概述

要知道Android系统简单描述可以认为是Linux内核加上Java虚拟机。大部分Android程序,都是Java或者Kotlin这些JVM语言所写的。Android程序的启动过程,实际上就是Android系统启动Java虚拟机执行Java/Kotlin代码的过程。那么Android系统是怎么启动虚拟机的呢?这个问题得从Android系统启动说起。第一步当然是内核启动,Linux内核启动就是另一个非常复杂的问题了,这里先不说。Linux启动完成后呢,首先会启动第一个用户态的进程,叫做init进程,init进程是系统用户态中几乎所有进程的祖先。init进程会启动许多系统运行所需要的关键进程,这里面就包括zygote,zygote是系统里面的第一个Java进程。在zygote进程启动的过程中,会启动Java虚拟机,注册好虚拟机运行以及应用运行需要的一些JNI方法,load好一堆Java class,总之是一个很复杂的过程。然后呢,zygote进程跑起来之后,就会fork自身启动一个叫system_process的系统进程来运行framework的Java代码,然后system_process会启动一些必要的系统应用例如桌面等等。这个过程其实和启动应用程序很接近了。与此同时,zygote也开始监听其他进程发送来的启动新进程的请求。比如说我从桌面点了一个应用图标,那么桌面会请求系统启动这个图标对应的应用。这时这个应用还没有运行,那么我们需要启动一个Java虚拟机来运行这个应用的代码。这时候系统就会告诉zygote,我需要一个新Java虚拟机,zygote收到请求后,就会从自己本身,fork一个新进程出去。粗浅一点理解,fork就相当于从它自身复制了一个一模一样的进程出去,然后在新进程里面开始执行app的代码。可能有小伙伴会问,这里为什么要让zygote去复制自己而系统不直接新起一个呢?答案前面有提到,JVM的启动是一个很复杂的过程,需要注册很多JNI方法,load很多class等等,如果系统重新启动一个新的,那么这里就会很耗时。所以让zygote去复制它自身,以加快应用启动过程。这里也是zygote(受精卵)这个命名的意义所在。那么说到了新进程将会加载应用的代码去执行,这个加载执行又是另一个复杂的过程。一般来讲应用执行是有个入口函数的,通常叫main函数。我们写Android应用其实是没有自己写main函数的,那么Android应用的main函数在哪里呢?结合前面zygote启动新进程的过程,新进程应该也是加载的某一个有main函数的类,去看zygote的源码,就可以发现,zygote启动应用的时候是加载的一个叫android.app.ActivityThread的类。这个类我们平常在Android的崩溃日志,或者直接IDE里面搜索也能看得到。在ActivityThread的main方法里面,开启了应用的MainLooper,可以理解为我们平常说的应用主线程,开始无限循环处理应用的消息队列里面的消息。然后ActivityThread会与system_process交互,告诉系统自己已经准备好了,可以干活了,然后这时候系统会把之前桌面启动该应用的请求交还给它,这时候应用就会去加载请求所对应的类比如某一个activity等,去执行里面的代码。

参考文章:https://www.zhihu.com/question/355709456/answer/893934223

【Android】Android程序是如何运行起来的?相关推荐

  1. 今天终于将第一个 Android NDK 程序编译、运行成功

    今天终于将第一个 NDK 程序编译.运行成功. 起先看资料和书籍时,都要求安装 CygWin.我也安装了,并将 Sample: hello-jni 编译成功.编译的 LOG 如下:  LeoZheng ...

  2. Android APP开机启动,安卓APP开发自启动,安卓启动后APP自动启动 Android让程序开机自动运行APP

    让APP在安卓系统启动自动运行可以带来以下几个好处: 用户方便:当用户打开设备时,自动启动所需的APP可以让用户更方便地使用设备,不必手动打开APP. 提高用户黏性:自动启动APP可以让用户更快地开始 ...

  3. android实现程序的后台运行

    改写返回键事件监听,使得back键功能类似home键,让Acitivty退至后台时不被系统销毁,代码如下: public boolean onKeyDown(int keyCode, KeyEvent ...

  4. Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析

    出自:http://blog.csdn.net/luoshengyang/article/details/8201936 在前文中,我们简要介绍了Android应用程序窗口的框架.Android应用程 ...

  5. Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析

    在前文中,我们分析了Android应用程序窗口的运行上下文环境的创建过程.由此可知,每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一 ...

  6. Android eclipse 程序调试

    一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的. 步骤如下. 1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakp ...

  7. android 判断activity是否在运行,Android 判断某个Activity 是否在前台运行的实例

    如下所示: /** * 判断某个界面是否在前台 * * @param context Context * @param className 界面的类名 * @return 是否在前台显示 */ pub ...

  8. android如何写第一个程序,第一个Android应用程序

    **文章摘要 ** 1.熟悉第一个Android应用程序的创建,以及创建过程中的各个文件夹的意义. 2.熟悉Android界面之间的跳转方式. 一.关于开发工具: 1.开发工具(Eclipse.And ...

  9. android应用程序开发(第二版)课后习题答案.doc,android移动应用开发习题答案.pdf

    Android 移动应用开发习题答案 单元1 Android 开发环境搭建与模拟器创建 1.填空题 (1) 2008 (2 ) Linux .操作系统 (3 ) 应用程序层.应用程序框架层.核心类库. ...

  10. win10 android 登录,Microsoft现在允许您在Win10中运行Android应用程序

    8月7日消息:昨天,微软宣布了一项新功能,允许Win10用户在Windows 10中直接启动Android应用程序. 只有在选择三星Galaxy设备并允许Android将应用程序流到Windows 1 ...

最新文章

  1. java 匿名内部类
  2. C#会重蹈覆辙吗?系列之2:反射及元数据的性能问题
  3. 送一台电脑显示器,我每天办公都用它,安利!
  4. 单核工作法13:永不拖延(上)
  5. POJ3695(矩形切割中等题)
  6. mfc cimage加载显示图片_在微信小程序里实现图片预加载组件
  7. linux下远程登录如何退出,Ubuntu 中rdesktop如何切换和退出远程桌面
  8. 通过这次源码分析直播了解到在中国真正关心源码的webrtc开发者只有1%
  9. Yii2创建自定义小部件
  10. 你们一年大概可以存多少钱?
  11. 【MATLAB】通信信号调制通用函数 — 带通滤波器
  12. 奇舞周刊第 444 期:浅谈文档的实时协同编辑
  13. 【Visual C++】游戏开发笔记三十八 浅墨DirectX提高班之六 携手迈向三维世界:四大变换展身手
  14. CRM项目半途而废 “烂摊子”该如何收拾?
  15. hadoop之大数据生态系统的前世今生
  16. Proxmox VE7.3+Ceph超融合私有云建设案例(低成本高价值,拿走不谢)
  17. win10退出安全模式后,没有网络
  18. 2016阿里实习生面试经历
  19. 那些年我们错过的markdown
  20. 技术分享:几种常见的JavaScript混淆和反混淆工具分析实战

热门文章

  1. php追加写入,PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
  2. 微信公众号主域名防封、H5域名防封怎么处理?
  3. xd导出标注html,使用标记狮一键导出Adobe XD标注文件到本地如何选择[导出包支持范围]...
  4. 初高中英语老师教师资格证考试成功通过前辈备考经验分享
  5. [源码和文档分享]基于C#实现的支持AI人机博弈的国际象棋游戏程序
  6. 安捷伦网络分析仪面板介绍
  7. matlab 车牌识别模板,MATLAB的车牌识别
  8. 我的顾问咨询之路(4)
  9. Android Studio 升级到3.0后出现编译错误\.gradle\caches\transforms-1\files-1.1\***** 解决办法
  10. 黎曼曲率张量漫谈(续)