乐于分享
好东西不私藏

WMShell中线程相关官方文档

WMShell中线程相关官方文档

背景

这几年WMShell部分也在不断更新,而且基本上互联网,AI等对于WM Shell的知识几乎是空白的啥也搜不到,马哥这边对于WMShell出了自己去代码调研以外,也会经常去寻找一些官方的文档资料进行学习,下面就是关于WM Shell相关的官方文档路径。 frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/docs今天分享一下我们比较陌生的的WM Shell的线程知识,针对这块我们一起看着官方文档学习哈,有啥要讨论分享的知识可以vip群中讨论发言哈。

Threading

Boundaries

                                    Thread boundary
                                          |
                                WM Shell  | SystemUI
                                          |
                                          |
FeatureController <-> FeatureInterface <--|--> WMShell <-> SysUI
       |          (^post to shell thread) |            (^post to main thread)
      ...                                 |
       |                                  |
 OtherControllers                         |

Threads

We currently have multiple threads in use in the Shell library depending on the configuration by the product.

  • SysUI main thread (standard main thread)
  • ShellMainThread (only used if the resource config_enableShellMainThread is set true (ie. phones))
    • This thread runs with THREAD_PRIORITY_DISPLAY priority since so many windowing-critical components depend on it
    • This is also the UI thread for almost all UI created by the Shell
    • The Shell main thread Handler (and the Executor that wraps it) is async, so messages/runnables used via this Handler are handled immediately if there is no sync messages prior to it in the queue.
    • This falls back to the SysUI main thread otherwise
    • Note:
  • ShellBackgroundThread (for longer running tasks where we don’t want to block the shell main thread)
    • This thread runs with THREAD_PRIORITY_BACKGROUND priority but can be requested to be boosted to THREAD_PRIORITY_FOREGROUND
    • This is always another thread even if config_enableShellMainThread is not set true
    • Note:
  • ShellAnimationThread (currently only used for Transitions and Splitscreen, but potentially all animations could be offloaded here)
  • ShellSplashScreenThread (only for use with splashscreens)

Dagger setup

The threading-related components are provided by the WMShellConcurrencyModule, for example, the Executors and Handlers for the various threads that are used.  You can request an executor of the necessary type by using the appropriate annotation for each of the threads (ie.@ShellMainThread Executor) when injecting into your Shell component.

To get the SysUI main thread, you can use the @Main annotation.

Best practices

Components

  • Don’t do initialization in the Shell component constructors
    • If the host SysUI is not careful, it may construct the WMComponent dependencies on the main thread, and this reduces the likelihood that components will intiailize on the wrong thread in such cases
  • Be careful of using CountDownLatch and other blocking synchronization mechanisms in Shell code
    • If the Shell main thread is not a separate thread, this will cause a deadlock
  • Callbacks, Observers, Listeners to any non-shell component should post onto main Shell thread
    • This includes Binder calls, SysUI calls, BroadcastReceivers, etc. Basically any API that takes a runnable should either be registered with the right Executor/Handler or posted to the main Shell thread manually
  • Since everything in the Shell runs on the main Shell thread, you do not need to explicitlysynchronize your code (unless you are trying to prevent reentrantcy, but that can also be done in other ways)

Handlers/Executors

  • You generally never need to create Handlers explicitly, instead inject @ShellMainThread ShellExecutor instead
    • This is a common pattern to defer logic in UI code, but the Handler created wraps the Looper that is currently running, which can be wrong (see above for initialization vs construction)
  • That said, sometimes Handlers are necessary because Framework API only takes Handlers or you want to dedupe multiple messages
    • In such cases inject @ShellMainThread Handler or use view.getHandler() which should be OK assuming that the view root was initialized on the main Shell thread
  • Never use Looper.getMainLooper()
    • It’s likely going to be wrong, you can inject @Main ShellExecutor to get the SysUI main thread

Testing

  • You can use a TestShellExecutor to control the processing of messages

更多vip免费系统开发经典大厂面试题库获取,课程优惠购买成为vip学员进入vip群,积极讨论各种行业难点痛点疑难问题,答疑服务等。

请联系马哥微信:

目前所有专题课程如下:
1、经典fw的入门到精通实战八件套专题
详细课表:
Android Framework开发rom实战合集课表/车载车机手机高级系统开发工程必会技能
2、新专题投屏实战专题
车机手机投屏开发入门到精通实战课
3、aosp15之wms过渡动画ShellTransition实战专题
新课预告:ShellTransition项目实战专题aosp15版本
4、安卓音频Audio子系统实战专题
开学第一课:安卓音频框架Audio子系统实战专题–首发优惠活动
5、车机手机三分屏实战专题
2026第一课:安卓14-1车机手机三分屏实战专题–首发优惠活动
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » WMShell中线程相关官方文档

评论 抢沙发

4 + 9 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮