Android Activity启动流程, app启动流程,APK打包流程, APK安装过程
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安装过程的更多相关文章
- Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。
原文:Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式. Android Activity 的四种启动模 ...
- Android Activity生命周期及启动模式
曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记.后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看.或许保存成博客的形式,会是更好的选 ...
- Android开发之解决APP启动白屏或者黑屏闪现的问题
在做搜芽的过程中,发现那个外包人缘做的不行,由于启动的时候会停顿,然后白屏一会,联想到几个月前我在我的三僚企业通信软件里面拉起9K-Mail的时候也会黑屏,所以决定学习一下.解决一下.这不,万能的网络 ...
- Android APK打包流程
简单build流程图 官网给了我们一张非常简单的编译.打包.apk生成内容以及签名的图片.图片大体介绍了从Project到运行到设备或者模拟器的一个大体流程,我们也从中看到一个完整的apk包含如下内容 ...
- Android漫游记(6)---APP启动之旅(I)
Android基于Linux2.6+内核,我们看一张图,以对Android系统的架构有个感性的认识. 我们从Kernel层简单说明: 1.Kernel层:基于Linux2.6+内核.同一时候做了一些嵌 ...
- Android Activity的4种启动模式详解(示例)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5233269.html 先介绍下Android对Activity的管理,Android采用Task来管理多个A ...
- Android Activity生命周期与启动模式
Activity的完整生命周期如下图: Activity的加载模式有四种: standard: 标准模式,默认的加载模式,每次通过这种模式启动目标Acitivity,都创建一个新的实例,并将该Acti ...
- Android activity四种基本启动模式
standard:默认的模式,每次启动会新创建一个activity对象 singleTop:在当前任务栈中,判断栈顶是否为当前的activity,如果是,就直接使用,如果不是,就会创建新的activi ...
- Android Activity的4种启动模式
Activity的启动模式 standard 默认标志的启动模式,每次startActivity都是创建一个新的activity的实例,适用于绝大数情况 singleTop 单一顶部,如果要开启的ac ...
随机推荐
- 解决WebUploader 上传按钮按F12 才行的问题
遇到了 WebUploader 插件的上传按钮点击无效(此时鼠标在按钮任何位置时,按钮都没变化).按F12 之后才有反应(此时鼠标在按钮任何位置时,按钮颜色都会变深) 的问题,网上查到一些答案,找到了 ...
- Java NIO 三大组件之 Buffer
NIO大三组件 之Buffer 一.什么是Buffer Buffer是用于特定原始类型的数据的容器. 它的实质就是一组数组,用于存储不同类型的数据. 二.缓冲区的类型 缓冲区类型除了Boolean值类 ...
- linux 精确延时
void HeartBeat_Check_TASK(void *pdata){ struct timeval tv; struct timespec ts; int err; U32 dwcount= ...
- Bootstrap 元素居中设置
一.Bootstrap水平居中 1. 文本:class ="text-center" 2. 图片居中:class = "center-block" 3.其他元素 ...
- ModelArts微认证零售客户分群知识点总结
\ 作者:华为云MVP郑永祥
- 华为云北京四业务,访问北京一OBS桶,配置指南
[摘要] 华为云跨数据中心,从北京四访问北京一的OBS桶里面的数据.免去数据迁移的麻烦 1 驱动力 跨region访问OBS桶里面的数据时.如果不走云连接,一个OBS桶域名对应的IP地址,是 ...
- 关于Python中的错误与异常,你是否了解的够仔细?
每次版本结束都描述这着同样的错误,相似的问题,但始终没见解决.所以今天,我就来总结下Python的错误与异常! 异常与错误 错误 语法错误 可以通过IDE或者解释器给出提示的错误 opentxt('a ...
- Java语法进阶13-文件、IO流
File File是文件和目录路径名的抽象表示形式,即File类是文件或目录的路径,而不是文件本身,因此File类不能直接访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流. File ...
- 模板引擎Thymeleaf
1.Thymeleaf简介 Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点 Thyme ...
- docker等文档
docker strapi koa express