1.Activity启动流程 (7.0版本之前)

从startActivity()开始,最终都会调用startActivityForResult()

在该方法里面会调用Instrumentation.execStartActivity()执行(Instrumentation主要用来监控应用程序和系统的交互)启动,execStartActivity()方法里面有2个方法,一个是ActivityManagerNative.getDefault().startActivity()这个方法是执行act启动的,另外还有一个方法checkStartActivityResult(result, intent),这个方法是用来检测启动结果的。

再回到启动流程上,ActivityManagerNative.getDefault()返回的是IActivityManager,IActivityManager也是一个接口,他是实现类是一个代理类ActvityManagerProxy(他是AMS的代理,他会获取到IBinder类型的AMS的引用),他通过IBinder向ActivityManagerService(以下简称AMS)发送启动Act请求,
接着AMS会经过一系列处理,中间会将需要创建的activity的具体信息初始化,并将其一路传下去。最后通过app.thread.scheduleLauncherActivity来实现进程切换,启动activity;

app.thread指的是IApplicationThread,它的实现是ActivityThread的内部类ApplicationThread,其中ApplicationThread继承了IApplicationThread.Stub。app指的是传入的要启动Activity所在的应用程序(就是你自己当前的app进程)。因为当前的AMS代码运行在SystemServer进程中,通过这里切换回来。同时也说明ApplicationThread是应用程序与SystemServer进程沟通的桥梁。

ApplicationThread通过scheduleLauncherActivity()向名为H的hadnler发送类型为LAUNCH_ACTIVITY的消息(此方法会将启动act的参数封装为ActivityClientRecord并传递过去),H的handleMessage里最后调用performLauncherActivity来完成act的启动。

先获取ActivityInfo(用于存储代码已以及manifest信息,比如theme和launchmode),获取LoadedApk,获取ComponentName(包含Act的包名类名),启动act上下文环境,根据ComponentName获取类名,用类加载器创建该activity实例,创建application(如果没有的话),接着初始化act调用activity.attach(args...),这个方法会创建window对象,然后会将Decorview添加到window中,同时会创建viewRootImpl,将Decorview和viewRootImpl关联起来。这个viewRootImpl是完成view绘制的三大流程的(具体的时机是onResume方法第一次执行后,这时候会调用WindowManager的addView()方法,这个方法里会创建viewRootImpl对象,随后将他跟decorview关联起来,然后调用setview(方法),这里面调用requestlayout()来执行绘制三个流程)。

AMS内部维护者ActivityStack(act栈),同时AMS通过ActivityThread同步activity的生命周期。

2. app启动流程:

①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
②system_server进程接收到请求后判断,如果不存在目标进程则通过AMS向zygote进程发送创建进程的请求(通过Socket);
③Zygote进程fork出新的子进程,即App进程;
④App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
⑤system_server进程在收到请求后,进行一系列准备工作后(同上),再通过binder IPC向App进程发送scheduleLaunchActivity请求;
⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
⑦主线程在收到Message后,通过反射机制创建目标Activity,并回调Activity.onCreate()等方法。
⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。

相关知识:

1.zygote

zygote意为“受精卵“。Android是基于Linux系统的,而在Linux中,所有的进程都是由init进程直接或者是间接fork出来的,zygote进程也不例外。
在Android系统里面,zygote是一个进程的名字。Android是基于Linux System的,当你的手机开机的时候,Linux的内核加载完成之后就会启动一个叫“init“的进程(安卓的第一个进程)。在Linux System里面,所有的进程都是由init进程fork出来的,我们的zygote进程也不例外。
我们都知道,每一个App其实都是
● 一个单独的dalvik虚拟机
● 一个单独的进程
所以当系统里面的第一个zygote进程运行之后,在这之后再开启App,就相当于开启一个新的进程。而为了实现资源共用和更快的启动速度,Android系统开启新进程的方式,是通过fork第一个zygote进程实现的。所以说,除了第一个zygote进程,其他应用所在的进程都是zygote的子进程,这下你明白为什么这个进程叫“受精卵”了吧?因为就像是一个受精卵一样,它能快速的分裂,并且产生遗传物质一样的细胞!

2.system_server

SystemServer也是一个进程,而且是由zygote进程fork出来的。
知道了SystemServer的本质,我们对它就不算太陌生了,这个进程是Android Framework里面两大非常重要的进程之一——另外一个进程就是上面的zygote进程。
为什么说SystemServer非常重要呢?因为系统里面重要的服务都是在这个进程里面开启的,比如 ActivityManagerService、PackageManagerService、WindowManagerService等等。

3.ActivityManagerService

ActivityManagerService,简称AMS,服务端对象,负责系统中所有Activity的生命周期。
ActivityManagerService进行初始化的时机很明确,就是在SystemServer进程开启的时候,就会初始化ActivityManagerService。

3.APK打包流程:

1.资源文件打包(布局文件xml,manifest),生成R.java。
2.AIDL文件生成对应的java文件
3.编译项目源码,生成.class文件
4.将java文件转换成dex文件,将java字节码转化为Dalvik自己饿啊,压缩常量池
以及清除冗余信息等。
5.通过该APKBuilder将资源文件,dex生成apk文件
6.keystore对apk签名
7.如果是正式版的apk,还会作对齐处理,就是将所有的资源文件其实距离4字节
的整数倍,这样通过内存访问apk文件会更快。

4. APK安装过程

1、复制APK到/data/app目录下,解压并扫描安装包。
2、资源管理器解析APK里的资源文件。
3、解析AndroidManifest文件,并在/data/data/目录下创建对应的应用数据目录。
4、然后对dex文件进行优化,并保存在dalvik-cache目录下。
5、将AndroidManifest文件解析出的四大组件信息注册到PackageManagerService中。
6、安装完成后,发送广播。

Android Activity启动流程, app启动流程,APK打包流程, APK安装过程的更多相关文章

  1. Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。

    原文:Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式. Android Activity 的四种启动模 ...

  2. Android Activity生命周期及启动模式

    曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记.后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看.或许保存成博客的形式,会是更好的选 ...

  3. Android开发之解决APP启动白屏或者黑屏闪现的问题

    在做搜芽的过程中,发现那个外包人缘做的不行,由于启动的时候会停顿,然后白屏一会,联想到几个月前我在我的三僚企业通信软件里面拉起9K-Mail的时候也会黑屏,所以决定学习一下.解决一下.这不,万能的网络 ...

  4. Android APK打包流程

    简单build流程图 官网给了我们一张非常简单的编译.打包.apk生成内容以及签名的图片.图片大体介绍了从Project到运行到设备或者模拟器的一个大体流程,我们也从中看到一个完整的apk包含如下内容 ...

  5. Android漫游记(6)---APP启动之旅(I)

    Android基于Linux2.6+内核,我们看一张图,以对Android系统的架构有个感性的认识. 我们从Kernel层简单说明: 1.Kernel层:基于Linux2.6+内核.同一时候做了一些嵌 ...

  6. Android Activity的4种启动模式详解(示例)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个A ...

  7. Android Activity生命周期与启动模式

    Activity的完整生命周期如下图: Activity的加载模式有四种: standard: 标准模式,默认的加载模式,每次通过这种模式启动目标Acitivity,都创建一个新的实例,并将该Acti ...

  8. Android activity四种基本启动模式

    standard:默认的模式,每次启动会新创建一个activity对象 singleTop:在当前任务栈中,判断栈顶是否为当前的activity,如果是,就直接使用,如果不是,就会创建新的activi ...

  9. Android Activity的4种启动模式

    Activity的启动模式 standard 默认标志的启动模式,每次startActivity都是创建一个新的activity的实例,适用于绝大数情况 singleTop 单一顶部,如果要开启的ac ...

随机推荐

  1. 学会使用这些,你的Windows可能会焕然一新

    星选哥用Windows也已经好多年了,今天用室友的电脑才发现,桌面真可以影响一个人的心情,从而影响工作,学习,生活. 所以准备推荐一些好用且轻量的小工具,让你时时刻刻有个好心情. 室友的桌面(还有很多 ...

  2. 在vue中选中某个标签,并且对其属性进行操作

    第一步:在标签中添加ref="111"属性 第二步:this.$refs.111.属性=""   此步骤是一111为标记选中了要操作的标签,通过点属性的方法,进 ...

  3. Rust入坑指南:鳞次栉比

    很久没有挖Rust的坑啦,今天来挖一些排列整齐的坑.没错,就是要介绍一些集合类型的数据类型."鳞次栉比"这个标题是不是显得很有文化? 在Rust入坑指南:常规套路一文中我们已经介绍 ...

  4. 【漏洞复现】Apache Solr远程代码执行(CVE-2019-0193)

    0x01 概述 Solr简介 Apache Solr 是一个开源的企业级搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现.Apache Solr ...

  5. 使用WireMock进行更好的集成测试

    无论您是遵循传统的测试金字塔还是采用诸如"测试蜂窝"这样的较新方法,都应该在开发过程中的某个时候开始编写集成测试用例. 您可以编写不同类型的集成测试.从持久性测试开始,您可以检查组 ...

  6. CCNA 之 七 路由协议 三 OSPF

    OSPF协议 OSPF开放式最短路径优先 全称:Open Shortest Path First 是目前使用最为广泛的路由协议,主要因为OSPF是开放式协议,和IGRP.EIGRP思科的私有协议不同. ...

  7. CCNA 之 十二 Frame Relay 帧中继

    Fram Relay 帧中继 帧中继简介 VC.LMI.DLCI的概念 帧中继映射 Inverse-ARP的操作 帧中继配置 帧中继简介 分组交换广域网接入方式的一个代表,分组交换是以分组的形式在广域 ...

  8. 关于python语言优化的一些思考

    最近一直在做python工程化相关的工作,颇有心得,遂总结一下.一是为了整理思绪,二是为了解放自己健忘的大脑. python是一个C的语法糖盒子 原生的python通常都是由cpython实现,而cp ...

  9. JS前端将table导出到excel 兼容谷歌 IE 且保留表格样式

    CDSN上博主给我一段代码,可将表格导出为EXCEL文档,原文见: https://blog.csdn.net/zz210891470/article/details/94717644 向博主学习.致 ...

  10. Vue各种配置

    小知识 Vue.prototype和Vue.use的区别 这个是全局可以通过Vue对象获取serring的值 Vue.prototype.$settings = settings; 这个是配置全局环境 ...