Android启动流程初步了解(小白)系统+Lanucher点击

文章写于以前,部分内容引用没有记住来源,如有侵权联系删除或注明出处。
大部分流程这篇文章有讲点击传送
Android启动流程初步了解(小白)系统+Lanucher点击_第1张图片
service_manager 进程

Binder IPC 通信过程中的守护进程 ServiceManager 进程主要是启动 Binder,提供服务的查询和注册。

**surface_flinger 进程 ** SurfaceFlinger 负责图像绘制,其功能是合成所有 Surface 并渲染到显示设备。

media_server 进程 MediaServer 进程主要是启动 AudioFlinger 音频服务

Zygote 进程

Zygote 进程孵化了所有的 Android 应用进程 Framework 框架初始化启动的开始。

Zygote 服务进程的主要功能:

  • 注册底层功能的 JNI 函数到虚拟机
  • 预加载 Java 类和资源
  • fork 并启动 system_server 核心进程
  • 作为守护进程监听处理“孵化新进程”的请求

系统服务在 ServiceManager 中已经注册

应用安装

应用安装的时候,通过 PackageManagerService 解析 apk 的 AndroidManifest.xml 文件,提取出这个 apk 的信息写入到 packages.xml 文件中,这些信息包括:权限、应用包名、icon、apk 的安装位置、版本、userID 等等。packages.xml 文件位于系统目录下/data/system/packages.xml。

Lanucher点击启动流程

Android启动流程初步了解(小白)系统+Lanucher点击_第2张图片
流程

launcher onclick -> START_ACTIVITY_TRANSACTION ->AMS->startActivity->fork进程->

加载ActivityThread.main() ->AT.attach ->ATTACH_APPLICATION_TRANSACTION->AMS(attachApplication)

绑定创建成功

AMS->BIND_APPLICATION_TRANSACTION ->app进程->ActivityThread.bindApplication()->sendMessage->ActivityThread.handleMeaasge-> AplicationThread.handleBindApplication

AMS-> SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令->ApplicationThread.scheduleLaunchActivity()->sendMessage->ActivityThread.handleLaunchActivity()->ActivityThread.performLaunchActivity() ->Activity.performCreate() -> onCreate()->Activity.setContentView()->ActivityThread.performResumeActivity()

fork进程

launcher onclick startActivity

在 system_server 进程中的服务端 ActivityManagerService 收到 START_ACTIVITY_TRANSACTION 命令后进行处理,调用 startActivity() 方法。

如果应用没有启动过,则会 fork 一个新进程。创建新进程的时候,AMS保存一个 ProcessRecord 信息

应用程序uid + process (默认使用 package 的名称,Manifest.xml可指定)

如果已经存在就不会新建进程了,这就属于应用内打开 Activity 的过程了。

进程创建成功切换至 App 进程,进入 app 进程后将 ActivityThread 类加载到新进程,并调用 ActivityThread.main() 方法

此时只创建了应用程序的 ActivityThread 和 ApplicationThread,和开启了 Handler 消息循环机制

ActivityThread.attach(false) 又会最终到 ActivityMangerService 的 attachApplication,这个工程其实是将本地的 ApplicationThread(Binder) 传递到 ActivityMangerService。然后 ActivityMangerService 就可以通过 ApplicationThread 的代理 ApplicationThreadProxy 来调用应用程序 ApplicationThread.bindApplication,通知应用程序的 ApplicationThread 已和 ActivityMangerService 绑定,可以不借助其他进程帮助Binder直接通信了。此时 Launcher 的任务也算是完成了。

在 system_server 进程中的服务端 ActivityManagerService 收到 ATTACH_APPLICATION_TRANSACTION 命令后进行处理,调用 attachApplication()。

发送送完 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令,还会发送 BIND_APPLICATION_TRANSACTION 命令来创建 Application。

app进程初始化

在 app 进程中,收到 BIND_APPLICATION_TRANSACTION 命令后调用 ActivityThread.bindApplication()

ActivityThread.bindApplication()
//缓存 Service,初始化 AppBindData,发送消息 H.BIND_APPLICATION。

ApplicationThreadProxy.bindApplication(…) 会传来这个应用的一些信息,如ApplicationInfo,Configuration 等**,在 ApplicationThread.bindApplication 里会待信息封装成A ppBindData**,通过

sendMessage(H.BIND_APPLICATION, data)

将信息放到应用里的消息队列里,通过 Handler 消息机制,**在 ActivityThread.handleMeaasge 里处理 H.BIND_APPLICATION 的信息,调用 AplicationThread.handleBindApplication。**进而创建application。

Activity

上面 fork 进程时会发送 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令,在 app 进程中,收到 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令后调用 ApplicationThread.scheduleLaunchActivity()。

ApplicationThread.scheduleLaunchActivity()
//发送消息 H.LAUNCH_ACTIVITY。

sendMessage(H.LAUNCH_ACTIVITY, r);

ActivityThread.handleLaunchActivity()
//最终回调目标 Activity 的 onConfigurationChanged(),初始化 WindowManagerService。
//调用 ActivityThread.performLaunchActivity()

ActivityThread.performLaunchActivity() {
    //类似 Application 的创建过程,通过 classLoader 加载到 activity.
    activity = mInstrumentation.newActivity(classLoader, 
               component.getClassName(), r.intent);
    //因为 Activity 有界面,所以其 Context 是 ContextThemeWrapper 类型,但实现类仍是ContextImpl.
    Context appContext = createBaseContextForActivity(r, activity);
    activity.attach(context,mInstrumentation,application,...);
    //与 Window 进行关联
    
    //attach 后调用 activity 的 onCreate()方法。
    mInstrumentation.callActivityOnCreate(activity,...)
    
}
//在ActivityThread.handleLaunchActivity里,接着调用

Activity.performCreate() -> onCreate()
//最终回调目标 Activity 的 onCreate()。

Activity.setContentView()
//设置 layout 布局

ActivityThread.performResumeActivity()
//最终回调目标 Activity 的 onResume()。

  • ActivityThread 是什么,它是一个线程吗,如何被启动的?

它不是一个线程,它是运行在 App 进程中的主线程中的一个方法中。(ActivityThread类是Android APP进程的初始类,它的main函数是这个APP进程的入口)

ActivityThread 并调用 ActivityThread.attach() 方法告诉 ActivityManagerService.创建了一个应用 并将 ApplicationThread 传给 ActivityManagerService

ApplicationThread是ActivityThread的内部类,也是一个Binder对象。在此处它是作为Activitythread和AMS通信的桥梁.

  • ActivityClientRecord 与 ActivityRecord 是什么?

记录 Activity 相关信息,比如:Window,configuration,ActivityInfo 等。
ActivityClientRecord 是客户端的,ActivityRecord 是 ActivityManagerService 服务端的。

  • Context 是什么,ContextImpl,ContextWapper 是什么?

Context 定义了 App 进程的相关环境,Context 是一个接口,ContextImpl 是子类,ContextWapper 是具体实现。

应用资源是在 Application 初始化的时候,也就是创建 Application,ContextImpl 的时候,ContextImpl 就包含这个路径,主要就是对就是 ResourcesManager 这个单例的引用。

可以看出每次创建 Application 和 Acitvity 以及 Service 时就会有一个 ContextImpl 实例,ContentProvider 和B roadcastReceiver 的 Context 是其他地方传入的。

所以 Context 数量 = Application 数量 + Activity 数量 + Service 数量,单进程情况下 Application 数量就是 1。

  • Instrumentation 是什么?

管理着组件Application,Activity,Service等的创建,生命周期调用。

  • Application 是什么,什么时候创建的,每个应用程序有几个 Application?

Application 是在 ActivityThread**.handleBindApplication()** 中创建的,一个进程只会创建一个 Application,但是一个应用如果有多个进程就会创建多个 Application 对象。

  • 点击 Launcher 启动 Activity 和应用内部启动 Activity 的区别?

点击 Launcher 时会创建一个新进程来开启 Activity,而应用内打开 Activity,如果 Activity 不指定新进程,将在原来进程打开

  • Activity 启动过程,onCreate(),onResume() 回调时机及具体作用?

Activity.onCreate() 完成了 App 进程,Application,Activity 的创建,调用 setContentView() 给 Activity 设置了 layout 布局。是否开启新进程实在 ActivityManagerService 进行控制的 应用包名 + 应用UID

Activity.onResume() 完成了 Activity 中 Window 与 WindowManager 的关联,并对所有子 View 进行渲染并显示。

你可能感兴趣的:(Android,入门及进阶,android)