美文网首页
android App启动流程简介

android App启动流程简介

作者: 木木禾木 | 来源:发表于2020-05-09 17:44 被阅读0次

三个进程:
Launcher进程:整个App启动流程的起点,负责接收用户点击屏幕事件,它其实就是一个Activity,里面实现了点击事件,长按事件,触摸等事件,可以这么理解,把Launcher想象成一个总的Activity,屏幕上各种App的Icon就是这个Activity的button,当点击Icon时,会从Launcher跳转到其他页面。

SystemServer进程:这个进程在整个的Android进程中是非常重要的一个,地位和Zygote等同,它是属于Application Framework层的,Android中的所有服务,例如AMS, WindowsManager, PackageManagerService等等都是由这个SystemServer fork出来的。

App进程:你要启动的App所运行的进程。

六个大类:
ActivityManagerService:(AMS)AMS是Android中最核心的服务之一,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要,它本身也是一个Binder的实现类。

Instrumentation:监控应用程序和系统的交互。

ActivityThread:应用的入口类,通过调用main方法,开启消息循环队列。ActivityThread所在的线程被称为主线程。

ApplicationThread:ApplicationThread提供Binder通讯接口,AMS则通过代理调用此App进程的本地方法。

ActivityManagerProxy:AMS服务在当前进程的代理类,负责与AMS通信。

ApplicationThreadProxy:ApplicationThread在AMS服务中的代理类,负责与ApplicationThread通信。

1. 安卓手机系统的桌面其实也是一个Activity

可以在命令行通过 adb shell dumpsys activity activities 来查看正在运行的activities


2. 点击桌面app图标,桌面Activity响应点击事件,通过startActivity(intent)或LauncherApps的startMainActivity方法以启动app的主activity。
LauncherApps之startMainActivity

因此,每个app都需要设置一个主Activity:

        <activity
            android:name=".MainActivity"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


3. startActivity(Intent) 最终会执行Instrumentation类的execStartActivity,并通过ActivityManagerService启动主Activity;
Instrumentation之execStartActivity
可以看到,ActivityManager.getService()是获取ActivityManagerService的代理类实例, 然后来启动app的主Activity


4. 然后Zygote进程会创建app应用进程,完成了进程创建的操作后就会执行主线程ActivityThread的main()方法。

进入到ActivityThread的main方法以后,首先进行一些初始化(包括参数设置、性能安全监控之类的),然后初始化Looper(Looper、Handler消息机制),创建ActivityThread,存储线程的Handler,最后启动Looper监听消息。

再之后ActivityThread通过Binder将ApplicationThread对象传递给ActivityManagerService,并完成启动Activity的后续工作。

ActivityThread之main
ActivityThread之attach
attachApplication(mAppThread, startSeq) 会调用ActivityManagerService的attachApplicationLocked方法
ActivityManagerService之attachApplicationLocked
这里的thread.bindApplication 即调用ActivityThread中的bindApplication方法;

在bindApplication中通过sendMessage(H.BIND_APPLICATION, data)调起ActivityThread中的handleBindApplication(data)方法;

在handleBindApplication中,通过Instrumentation的callApplicationOnCreate调用了Application的onCreate()

ActivityThread之handleBindApplication


5. app的进程和主线程创建&初始化完成后,获取应用的ActivityStack,并取出主Activity,并在ActivityThread中通过mInstrumentation.callActivityOnCreate 调起Activity。

推荐阅读:
Android App启动流程详解


(部分内容参考于网络,如有不妥,请联系删除~)

相关文章

网友评论

      本文标题:android App启动流程简介

      本文链接:https://www.haomeiwen.com/subject/xvyqghtx.html