区块链技术博客
www.b2bchain.cn

Android Systrace 基础知识(四)- SystemServer 解读求职学习资料

本文介绍了Android Systrace 基础知识(四)- SystemServer 解读求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

本文是 Systrace 系列文章的第四篇,主要是对 SystemServer 进行简单介绍,介绍了 SystemServer 中几个比较重要的线程,由于 Input 和 Binder 比较重要,所以单独拿出来讲,在这里就没有再涉及到。

本系列的目的是通过 Systrace 这个工具,从另外一个角度来看待 Android 系统整体的运行,同时也从另外一个角度来对 Framework 进行学习。也许你看了很多讲 Framework 的文章,但是总是记不住代码,或者不清楚其运行的流程,也许从 Systrace 这个图形化的角度,你可以理解的更深入一些。

正文

窗口动画

Systrace 中的 SystemServer 一个比较重要的地方就是窗口动画,由于窗口归 SystemServer 来管,那么窗口动画也就是由 SystemServer 来进行统一的处理,其中涉及到两个比较重要的线程,Android.Anim 和 Android.Anim.if 这两个线程,这两个线程的基本知识在下面有讲。

这里我们以应用启动为例,查看窗口时如何在两个线程之间进行切换(Android P 里面,应用的启动动画由 Launcher 和应用自己的第一帧组成,之前是在 SystemServer 里面的,现在多任务的动画为了性能部分移到了 Launcher 去实现)

首先我们点击图标启动应用的时候,由于 App 还在启动,Launcher 首先启动一个 StartingWindow,等 App 的第一帧绘制好了之后,再切换到 App 的窗口动画

Launcher 动画
Android Systrace 基础知识(四)- SystemServer 解读

Launcher 动画

此时对应的,App 正在启动
Android Systrace 基础知识(四)- SystemServer 解读

App 正在启动

从上图可以看到,应用第一帧已经准备好了,接下来看对应的 SystemServer ,可以看到应用启动第一帧绘制完成后,动画切换到 App 的 Window 动画
Android Systrace 基础知识(四)- SystemServer 解读

App 的 Window 动画

ActivityManagerService

AMS 和 WMS 算是 SystemServer 中最繁忙的两个 Service 了,与 AMS 相关的 Trace 一般会用 TRACE_TAG_ACTIVITY_MANAGER 这个 TAG,在 Systrace 中的名字是 ActivityManager

下面是启动一个新的进程的时候,AMS 的输出
Android Systrace 基础知识(四)- SystemServer 解读

AMS

在进程和四大组件的各种场景一般都会有对应的 Trace 点来记录,比如大家熟悉的 ActivityStart、ActivityResume、activityStop 等,这些 Trace 点有一些在应用进程,有一些在 SystemServer 进程,所以大家在看 Activity 相关的代码逻辑的时候,需要不断在这两个进程之间进行切换,这样才能从一个整体的角度来看应用的状态变化和 SystemServer 在其中起到的作用。
Android Systrace 基础知识(四)- SystemServer 解读

AMS

WindowManagerService

与 AMS 相关的 Trace 一般会用 TRACE_TAG_WINDOW_MANAGER 这个 TAG,在 Systrace 中 WindowManagerService 在 SystemServer 中多在 对应的 Binder 中出现,比如下面应用启动的时候,relayoutWindow 的 Trace 输出
Android Systrace 基础知识(四)- SystemServer 解读

WMS

在 Window 的各种场景一般都会有对应的 Trace 点来记录,比如大家熟悉的 relayoutWIndow、performLayout、prepareToDisplay 等
Android Systrace 基础知识(四)- SystemServer 解读

WMS

Input

Input 是 SystemServer 线程里面非常重要的一部分,主要是由 InputReader 和 InputDispatcher 这两个 Native 线程组成,关于这一部分在 Systrace 基础知识 – Input 解读 里面已经详细讲过,这里就不再详细讲了
Android Systrace 基础知识(四)- SystemServer 解读

Input

Binder

SystemServer 由于提供大量的基础服务,所以进程间的通信非常繁忙,且大部分通信都是通过 Binder ,所以 Binder 在 SystemServer 中的作用非常关键,很多时候当后台有大量的 App 存在的时候,SystemServer 就会由于 Binder 通信和锁竞争,导致系统或者 App 卡顿。关于这一部分在 Binder 和锁竞争解读 里面已经详细讲过,这里就不再详细讲了
Android Systrace 基础知识(四)- SystemServer 解读

Binder

HandlerThread

BackgroundThread

com/android/internal/os/BackgroundThread.java

private BackgroundThread() {     super("android.bg", android.os.Process.THREAD_PRIORITY_BACKGROUND); }

Systrace 中的 BackgroundThread
Android Systrace 基础知识(四)- SystemServer 解读

BackgroundThread

BackgroundThread 在系统中使用比较多,许多对性能没有要求的任务,一般都会放到 BackgroundThread 中去执行
Android Systrace 基础知识(四)- SystemServer 解读

BackgroundThread

ServiceThread

ServiceThread 继承自 HandlerThread ,下面介绍的几个工作线程都是继承自 ServiceThread ,分别实现不同的功能,根据线程功能不同,其线程优先级也不同:UIThread、IoThread、DisplayThread、AnimationThread、FgThread、SurfaceAnimationThread

每个 Thread 都有自己的 Looper 、Thread 和 MessageQueue,互相不会影响。Android 系统根据功能,会使用不同的 Thread 来完成。

UiThread

com/android/server/UiThread.java

private UiThread() {     super("android.ui", Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/); }

Systrace 中的 UiThread
Android Systrace 基础知识(四)- SystemServer 解读

UiThread

UiThread 被使用的地方如下,具体的功能可以自己去源码里面查看,关键字是 UiThread.get()
Android Systrace 基础知识(四)- SystemServer 解读

UiThread

IoThread

com/android/server/IoThread.java

private IoThread() {     super("android.io", android.os.Process.THREAD_PRIORITY_DEFAULT, true /*allowIo*/); }

IoThread 被使用的地方如下,具体的功能可以自己去源码里面查看,关键字是 IoThread.get()
Android Systrace 基础知识(四)- SystemServer 解读

IoThread

DisplayThread

com/android/server/DisplayThread.java

“`java

本文是 Systrace 系列文章的第四篇,主要是对 SystemServer 进行简单介绍,介绍了 SystemServer 中几个比较重要的线程,由于 Input 和 Binder 比较重要,所以单独拿出来讲,在这里就没有再涉及到。

本系列的目的是通过 Systrace 这个工具,从另外一个角度来看待 Android 系统整体的运行,同时也从另外一个角度来对 Framework 进行学习。也许你看了很多讲 Framework 的文章,但是总是记不住代码,或者不清楚其运行的流程,也许从 Systrace 这个图形化的角度,你可以理解的更深入一些。

正文

窗口动画

Systrace 中的 SystemServer 一个比较重要的地方就是窗口动画,由于窗口归 SystemServer 来管,那么窗口动画也就是由 SystemServer 来进行统一的处理,其中涉及到两个比较重要的线程,Android.Anim 和 Android.Anim.if 这两个线程,这两个线程的基本知识在下面有讲。

这里我们以应用启动为例,查看窗口时如何在两个线程之间进行切换(Android P 里面,应用的启动动画由 Launcher 和应用自己的第一帧组成,之前是在 SystemServer 里面的,现在多任务的动画为了性能部分移到了 Launcher 去实现)

首先我们点击图标启动应用的时候,由于 App 还在启动,Launcher 首先启动一个 StartingWindow,等 App 的第一帧绘制好了之后,再切换到 App 的窗口动画

Launcher 动画
Android Systrace 基础知识(四)- SystemServer 解读

Launcher 动画

此时对应的,App 正在启动
Android Systrace 基础知识(四)- SystemServer 解读

App 正在启动

从上图可以看到,应用第一帧已经准备好了,接下来看对应的 SystemServer ,可以看到应用启动第一帧绘制完成后,动画切换到 App 的 Window 动画
Android Systrace 基础知识(四)- SystemServer 解读

App 的 Window 动画

ActivityManagerService

AMS 和 WMS 算是 SystemServer 中最繁忙的两个 Service 了,与 AMS 相关的 Trace 一般会用 TRACE_TAG_ACTIVITY_MANAGER 这个 TAG,在 Systrace 中的名字是 ActivityManager

下面是启动一个新的进程的时候,AMS 的输出
Android Systrace 基础知识(四)- SystemServer 解读

AMS

在进程和四大组件的各种场景一般都会有对应的 Trace 点来记录,比如大家熟悉的 ActivityStart、ActivityResume、activityStop 等,这些 Trace 点有一些在应用进程,有一些在 SystemServer 进程,所以大家在看 Activity 相关的代码逻辑的时候,需要不断在这两个进程之间进行切换,这样才能从一个整体的角度来看应用的状态变化和 SystemServer 在其中起到的作用。
Android Systrace 基础知识(四)- SystemServer 解读

AMS

WindowManagerService

与 AMS 相关的 Trace 一般会用 TRACE_TAG_WINDOW_MANAGER 这个 TAG,在 Systrace 中 WindowManagerService 在 SystemServer 中多在 对应的 Binder 中出现,比如下面应用启动的时候,relayoutWindow 的 Trace 输出
Android Systrace 基础知识(四)- SystemServer 解读

WMS

在 Window 的各种场景一般都会有对应的 Trace 点来记录,比如大家熟悉的 relayoutWIndow、performLayout、prepareToDisplay 等
Android Systrace 基础知识(四)- SystemServer 解读

WMS

Input

Input 是 SystemServer 线程里面非常重要的一部分,主要是由 InputReader 和 InputDispatcher 这两个 Native 线程组成,关于这一部分在 Systrace 基础知识 – Input 解读 里面已经详细讲过,这里就不再详细讲了
Android Systrace 基础知识(四)- SystemServer 解读

Input

Binder

SystemServer 由于提供大量的基础服务,所以进程间的通信非常繁忙,且大部分通信都是通过 Binder ,所以 Binder 在 SystemServer 中的作用非常关键,很多时候当后台有大量的 App 存在的时候,SystemServer 就会由于 Binder 通信和锁竞争,导致系统或者 App 卡顿。关于这一部分在 Binder 和锁竞争解读 里面已经详细讲过,这里就不再详细讲了
Android Systrace 基础知识(四)- SystemServer 解读

Binder

HandlerThread

BackgroundThread

com/android/internal/os/BackgroundThread.java

private BackgroundThread() {     super("android.bg", android.os.Process.THREAD_PRIORITY_BACKGROUND); }

Systrace 中的 BackgroundThread
Android Systrace 基础知识(四)- SystemServer 解读

BackgroundThread

BackgroundThread 在系统中使用比较多,许多对性能没有要求的任务,一般都会放到 BackgroundThread 中去执行
Android Systrace 基础知识(四)- SystemServer 解读

BackgroundThread

ServiceThread

ServiceThread 继承自 HandlerThread ,下面介绍的几个工作线程都是继承自 ServiceThread ,分别实现不同的功能,根据线程功能不同,其线程优先级也不同:UIThread、IoThread、DisplayThread、AnimationThread、FgThread、SurfaceAnimationThread

每个 Thread 都有自己的 Looper 、Thread 和 MessageQueue,互相不会影响。Android 系统根据功能,会使用不同的 Thread 来完成。

UiThread

com/android/server/UiThread.java

private UiThread() {     super("android.ui", Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/); }

Systrace 中的 UiThread
Android Systrace 基础知识(四)- SystemServer 解读

UiThread

UiThread 被使用的地方如下,具体的功能可以自己去源码里面查看,关键字是 UiThread.get()
Android Systrace 基础知识(四)- SystemServer 解读

UiThread

IoThread

com/android/server/IoThread.java

private IoThread() {     super("android.io", android.os.Process.THREAD_PRIORITY_DEFAULT, true /*allowIo*/); }

IoThread 被使用的地方如下,具体的功能可以自己去源码里面查看,关键字是 IoThread.get()
Android Systrace 基础知识(四)- SystemServer 解读

IoThread

DisplayThread

com/android/server/DisplayThread.java

“`java

本文是 Systrace 系列文章的第四篇,主要是对 SystemServer 进行简单介绍,介绍了 SystemServer 中几个比较重要的线程,由于 Input 和 Binder 比较重要,所以单独拿出来讲,在这里就没有再涉及到。

本系列的目的是通过 Systrace 这个工具,从另外一个角度来看待 Android 系统整体的运行,同时也从另外一个角度来对 Framework 进行学习。也许你看了很多讲 Framework 的文章,但是总是记不住代码,或者不清楚其运行的流程,也许从 Systrace 这个图形化的角度,你可以理解的更深入一些。

正文

窗口动画

Systrace 中的 SystemServer 一个比较重要的地方就是窗口动画,由于窗口归 SystemServer 来管,那么窗口动画也就是由 SystemServer 来进行统一的处理,其中涉及到两个比较重要的线程,Android.Anim 和 Android.Anim.if 这两个线程,这两个线程的基本知识在下面有讲。

这里我们以应用启动为例,查看窗口时如何在两个线程之间进行切换(Android P 里面,应用的启动动画由 Launcher 和应用自己的第一帧组成,之前是在 SystemServer 里面的,现在多任务的动画为了性能部分移到了 Launcher 去实现)

首先我们点击图标启动应用的时候,由于 App 还在启动,Launcher 首先启动一个 StartingWindow,等 App 的第一帧绘制好了之后,再切换到 App 的窗口动画

Launcher 动画
Android Systrace 基础知识(四)- SystemServer 解读

Launcher 动画

此时对应的,App 正在启动
Android Systrace 基础知识(四)- SystemServer 解读

App 正在启动

从上图可以看到,应用第一帧已经准备好了,接下来看对应的 SystemServer ,可以看到应用启动第一帧绘制完成后,动画切换到 App 的 Window 动画
Android Systrace 基础知识(四)- SystemServer 解读

App 的 Window 动画

ActivityManagerService

AMS 和 WMS 算是 SystemServer 中最繁忙的两个 Service 了,与 AMS 相关的 Trace 一般会用 TRACE_TAG_ACTIVITY_MANAGER 这个 TAG,在 Systrace 中的名字是 ActivityManager

下面是启动一个新的进程的时候,AMS 的输出
Android Systrace 基础知识(四)- SystemServer 解读

AMS

在进程和四大组件的各种场景一般都会有对应的 Trace 点来记录,比如大家熟悉的 ActivityStart、ActivityResume、activityStop 等,这些 Trace 点有一些在应用进程,有一些在 SystemServer 进程,所以大家在看 Activity 相关的代码逻辑的时候,需要不断在这两个进程之间进行切换,这样才能从一个整体的角度来看应用的状态变化和 SystemServer 在其中起到的作用。
Android Systrace 基础知识(四)- SystemServer 解读

AMS

WindowManagerService

与 AMS 相关的 Trace 一般会用 TRACE_TAG_WINDOW_MANAGER 这个 TAG,在 Systrace 中 WindowManagerService 在 SystemServer 中多在 对应的 Binder 中出现,比如下面应用启动的时候,relayoutWindow 的 Trace 输出
Android Systrace 基础知识(四)- SystemServer 解读

WMS

在 Window 的各种场景一般都会有对应的 Trace 点来记录,比如大家熟悉的 relayoutWIndow、performLayout、prepareToDisplay 等
Android Systrace 基础知识(四)- SystemServer 解读

WMS

Input

Input 是 SystemServer 线程里面非常重要的一部分,主要是由 InputReader 和 InputDispatcher 这两个 Native 线程组成,关于这一部分在 Systrace 基础知识 – Input 解读 里面已经详细讲过,这里就不再详细讲了
Android Systrace 基础知识(四)- SystemServer 解读

Input

Binder

SystemServer 由于提供大量的基础服务,所以进程间的通信非常繁忙,且大部分通信都是通过 Binder ,所以 Binder 在 SystemServer 中的作用非常关键,很多时候当后台有大量的 App 存在的时候,SystemServer 就会由于 Binder 通信和锁竞争,导致系统或者 App 卡顿。关于这一部分在 Binder 和锁竞争解读 里面已经详细讲过,这里就不再详细讲了
Android Systrace 基础知识(四)- SystemServer 解读

Binder

HandlerThread

BackgroundThread

com/android/internal/os/BackgroundThread.java

private BackgroundThread() {     super("android.bg", android.os.Process.THREAD_PRIORITY_BACKGROUND); }

Systrace 中的 BackgroundThread
Android Systrace 基础知识(四)- SystemServer 解读

BackgroundThread

BackgroundThread 在系统中使用比较多,许多对性能没有要求的任务,一般都会放到 BackgroundThread 中去执行
Android Systrace 基础知识(四)- SystemServer 解读

BackgroundThread

ServiceThread

ServiceThread 继承自 HandlerThread ,下面介绍的几个工作线程都是继承自 ServiceThread ,分别实现不同的功能,根据线程功能不同,其线程优先级也不同:UIThread、IoThread、DisplayThread、AnimationThread、FgThread、SurfaceAnimationThread

每个 Thread 都有自己的 Looper 、Thread 和 MessageQueue,互相不会影响。Android 系统根据功能,会使用不同的 Thread 来完成。

UiThread

com/android/server/UiThread.java

private UiThread() {     super("android.ui", Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/); }

Systrace 中的 UiThread
Android Systrace 基础知识(四)- SystemServer 解读

UiThread

UiThread 被使用的地方如下,具体的功能可以自己去源码里面查看,关键字是 UiThread.get()
Android Systrace 基础知识(四)- SystemServer 解读

UiThread

IoThread

com/android/server/IoThread.java

private IoThread() {     super("android.io", android.os.Process.THREAD_PRIORITY_DEFAULT, true /*allowIo*/); }

IoThread 被使用的地方如下,具体的功能可以自己去源码里面查看,关键字是 IoThread.get()
Android Systrace 基础知识(四)- SystemServer 解读

IoThread

DisplayThread

com/android/server/DisplayThread.java

“`java

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » Android Systrace 基础知识(四)- SystemServer 解读求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们