欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android Activity启动流程, app启动流程,APK打包流程, APK安装过程

程序员文章站 2022-04-15 14:05:57
1.Activity启动流程 (7.0版本之前) 从startActivity()开始,最终都会调用startActivityForResult() 在该方法里面会调用Instrumentation.execStartActivity()执行(Instrumentation主要用来监控应用程序和系统 ......

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文件会更快。

Android Activity启动流程, app启动流程,APK打包流程, APK安装过程

 

 

4. apk安装过程

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