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、安装完成后,发送广播。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容