当前位置:主页 > 查看内容

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

发布时间:2021-09-17 00:00| 位朋友查看

简介:文章写于以前部分内容引用没有记住来源如有侵权联系删除或注明出处。 大部分流程这篇文章有讲 点击传送 service_manager 进程 Binder IPC 通信过程中的守护进程 ServiceManager 进程主要是启动 Binder提供服务的查询和注册。 **surface_flinger 进程 ** Surf……

文章写于以前,部分内容引用没有记住来源,如有侵权联系删除或注明出处。
大部分流程这篇文章有讲点击传送
在这里插入图片描述
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点击启动流程

在这里插入图片描述
流程

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 进行渲染并显示。

;原文链接:https://blog.csdn.net/qq_21480607/article/details/115966000
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐