专栏首页码上积木App启动流程三问

App启动流程三问

App的启动流程和Activity的启动流程也是面试中常常被问到的知识点,但是往往会涉及到很多方面,让我们不知道从何做答,今天就一起来看看启动流程相关问题:

  • 说一下APP的启动流程
  • 里面涉及到哪些重要的成员呢?都分别负责了什么,比如AMS?
  • 启动流程了解后,对我们开发有什么帮助呢?

说一下APP的启动流程

  • Launcher被调用点击事件,转到Instrumentation类的startActivity方法。
  • Instrumentation通过跨进程通信告诉AMS要启动应用的需求。
  • AMS反馈Launcher,让Launcher进入Paused状态
  • Launcher进入Paused状态,AMS转到ZygoteProcess类,并通过socket与Zygote通信,告知Zygote需要新建进程。
  • Zygote fork进程,并调用ActivityThread的main方法,也就是app的入口。
  • ActivityThread的main方法新建了ActivityThread实例,并新建了Looper实例,开始loop循环。
  • 同时ActivityThread也告知AMS,进程创建完毕,开始创建Application,Provider,并调用Applicaiton的attach,onCreate方法。
  • 最后就是创建上下文,通过类加载器加载Activity,调用Activity的onCreate方法。

里面涉及到哪些重要的成员呢?都分别负责了什么,比如AMS?

  • init进程,Android系统启动后,Zygote并不是第一个进程,而是linux的根进程init进程,然后init进程才会启动Zygote进程。
  • Zygote进程,所有android进程的父进程,当然也包括SystemServer进程
  • SystemServer进程,正如名字一样,系统服务进程,负责系统中大大小小的事物,为此也是启动了三员大将(ActivityManagerService,PackageManagerService,WindowManagerService)以及binder线程池。
  • ActivityManagerService,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,对于一些进程的启动,都会通过Binder通信机制传递给AMS,再处理给Zygote。
  • PackageManagerService,主要负责应用包的一些操作,比如安装,卸载,解析AndroidManifest.xml,扫描文件信息等等。
  • WindowManagerService,主要负责窗口相关的一些服务,比如窗口的启动,添加,删除等。
  • Launcher,桌面应用,也是属于应用,也有自己的Activity,一开机就会默认启动,通过设置Intent.CATEGORY_HOME的Category隐式启动。

启动流程了解后,对我们开发有什么帮助呢?

分析源码的目的一直都不是为了学知识而学,而是理解了这些基础,我们才能更好的解决问题。学习了App的启动流程,我们可以再思考下一些之前没理解透的问题。

1)比如启动优化,分析启动过程,其实可以优化启动速度的地方有三个地方:

  • Application的attach方法,MultiDexApplication会在方法里面会去执行MultiDex逻辑。所以这里可以进行MultiDex优化,比如今日头条方案就是单独启动一个进程的activity去加载MultiDex。
  • Application的onCreate方法,大量三方库的初始化都在这里进行,所以我们可以开启线程池,懒加载等等。把每个启动任务进行区分,哪些可以子线程运行,哪些有先后顺序。
  • Activity的onCreate方法,同样进行线程处理,懒加载。或者预创建Activity,提前类加载等等。

2)又比如插件化,通过了解启动流程可以知道哪些地方可以用来hook,从而完成我们侵入代码,替换Activity的工作。

3)还有上次说过的Activity显示View的过程,我们才知道什么时候进行DecorView的加载,什么时候进行view绘制等等

4)剩下的等你们来补充了~

拜拜

最近天气转凉,大家注意身体

本文分享自微信公众号 - 码上积木(Lzjimu),作者:积木zz

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 女儿拿着小天才电话手表问我App启动流程

    “爸爸爸爸,你说我玩的这个小天才电话手表怎么这么厉害,随便点一下这个小图片,这个应用就冒出来了,就可以听儿歌了。好神奇啊。”

    码上积木
  • 启动优化

    启动优化、布局优化、内存优化、卡顿优化、网络优化、数据库优化、内存泄漏优化、包体积优化等等。

    码上积木
  • Activity三问—猫眼真题

    Activity算是我们使用最多也是最基础的内容了。但是为什么面试还会频频问到呢?即使是面试高级Android职位。说到底还是因为他足够重要,万丈高楼平地起,打...

    码上积木
  • data_structure_and_algorithm -- 哈希算法(上):如何防止数据库中的用户被脱库?

    还记得 2011 年 CSDN 的“脱库”事件吗?当时,CSDN 网站被黑客攻击,超过 600 万用户的注册邮箱和密码明文被泄露,很多网友对 CSDN 明文保存...

    MachineLP
  • 想学FM系列(22)-SAP FM模块:派生规则推导策略(5)-派生规则推导使用

    4.2 派生规则推导的操作及测试 在派生规则具体维护时其操作界面通常如下: ? ① 显示\修改派生规则。 ② 选中某一条步骤,点击查看该步骤的定义。 ...

    SAP最佳业务实践
  • 工业互联网的现状、发展与未来(中国工业互联网研究报告)

    面对不断提升的成本、运营压力,以及回报率走低的趋势,老牌工业企业“通用电气”在2012年提出了“工业互联网(Industrial Internet)”的概念,随...

    庞九公子
  • 一张图弄清Activity的启动过程

    它是应用程序在AMS中的Binder对象,AMS利用它可以和ActivityThread通信,四大组件相关回调都是通过它来告诉ActivityThread的。

    Android技术干货分享
  • Android 进阶解密笔记-Android 系统进程

    僵尸进程:在Linux中,父进程使用fork创建子进程,子进程终止后,但父进程不知道子进程终止,虽然子进程已经退出,但系统还未它保留一定的信息(比如进程号,退出...

    Yif
  • 如何开通微信公众号同步?(微信打开)

    1. .点击右上角按钮「. . .」,选择在浏览器中打开网页

    云加社区
  • Python|如何让文件读取不再乱码

    有时在读取文件时是否会出现乱码?因为在中文Windows系统中,如果不指定文本文件的编码,那么它就会采用系统默认的GBK编码,即一个英文字符是ASCII码,一个...

    算法与编程之美

扫码关注云+社区

领取腾讯云代金券