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

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

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

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

再回到启动流程上,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的启动。ui

先获取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的主界面。orm

相关知识:

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的子进程,这下你明白为何这个进程叫“受精卵”了吧?由于就像是一个受精卵同样,它能快速的分裂,而且产生遗传物质同样的细胞!server

2.system_server

SystemServer也是一个进程,并且是由zygote进程fork出来的。
知道了SystemServer的本质,咱们对它就不算太陌生了,这个进程是Android Framework里面两大很是重要的进程之一——另一个进程就是上面的zygote进程。
为何说SystemServer很是重要呢?由于系统里面重要的服务都是在这个进程里面开启的,好比 ActivityManagerService、PackageManagerService、WindowManagerService等等。xml

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安装过程

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

相关文章
相关标签/搜索