android display 杂谈(三)WMS

这篇具有很好参考价值的文章主要介绍了android display 杂谈(三)WMS。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

用来记录学习wms,后续会一点一点更新。。。。。。
代码:android14

WMS是在SystemServer进程中启动的

在SystemServer中的main方法中,调用run方法。
android display 杂谈(三)WMS,android

private void run() {
// Initialize native services.初始化服务,加载android_servers so库
870              System.loadLibrary("android_servers");
// Create the system service manager.创建SystemServiceManager
895              mSystemServiceManager = new SystemServiceManager(mSystemContext);

942              startOtherServices(t);//android14在startOtherServices中启动WindowManagerService

android14中,在startOtherServices中启动WindowManagerService

1606              wm = WindowManagerService.main(context, inputManager, !mFirstBoot,
1607                      new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);

该代码执行了WMS的main方法,会在内部创建一个WMS。其中有一个参数inputManager也是在startOtherServices中创建的,如下。

1589              t.traceBegin("StartInputManagerService");
1590              inputManager = new InputManagerService(context);

总结,WMS的main方法在startOtherServices中,而startOtherServices在SystemServer的run方法中,运行在system_server线程中。

1608              ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
1609                      DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
1610              ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
1611                      /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);

上述代码将WMS和IMS注册到ServerManager中。
回到上述的WindowManagerService main中。
/frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

1137      public static WindowManagerService main(final Context context, final InputManagerService im,
1138              final boolean showBootMsgs, WindowManagerPolicy policy, ActivityTaskManagerService atm,
1139              DisplayWindowSettingsProvider displayWindowSettingsProvider,
1140              Supplier<SurfaceControl.Transaction> transactionFactory,
1141              Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {
1142          final WindowManagerService[] wms = new WindowManagerService[1];
1143          DisplayThread.getHandler().runWithScissors(() ->
1144                  wms[0] = new WindowManagerService(context, im, showBootMsgs, policy, atm,
1145                          displayWindowSettingsProvider, transactionFactory,
1146                          surfaceControlFactory), 0);
1147          return wms[0];
1148      }

DisplayThread.getHandler().runWithScissors调用DisplayThread的getHandler方法,获得DisplayThread的handler实例。
可以用来处理需要低延时显示的相关操作。

android display 杂谈(三)WMS,android
这张图可以清晰的了解到,不管是applicationWindow,还是SystemWindow都是由WindowManager和WMS处理。

addwindow

 public int addWindow(Session session, IWindow client, LayoutParams attrs, int viewVisibility,
1432              int displayId, int requestUserId, @InsetsType int requestedVisibleTypes,
1433              InputChannel outInputChannel, InsetsState outInsetsState,
1434              InsetsSourceControl.Array outActiveControls, Rect outAttachedFrame,
1435              float[] outSizeCompatScale) {

int res = mPolicy.checkAddPermission(attrs.type, isRoundedCornerOverlay, attrs.packageName,
1441                  appOp);

上述通过checkAddpermission方法来检测权限,如果没有权限则不会执行后续代码。

1457              final DisplayContent displayContent = getDisplayContentOrCreate(displayId, attrs.token);

上述代码中有一个参数:displayId,该参数获得窗口添加到哪个DisplayContent上。

 if (displayContent == null) {
1460                  ProtoLog.w(WM_ERROR, "Attempted to add window to a display that does "
1461                          + "not exist: %d. Aborting.", displayId);
1462                  return WindowManagerGlobal.ADD_INVALID_DISPLAY;
1463              }

如果displatContent等于null,则会返回一个ADD_INVALID_DISPLAY无效的状态,类似的还有成功的状态,这些状态都在WindowManagerGlobal中被定义。android display 杂谈(三)WMS,android

  if (type >= FIRST_SUB_WINDOW && type <= LAST_SUB_WINDOW) {
1478                  parentWindow = windowForClientLocked(null, attrs.token, false);
1479                  if (parentWindow == null) {
1480                      ProtoLog.w(WM_ERROR, "Attempted to add window with token that is not a window: "
1481                              + "%s.  Aborting.", attrs.token);
1482                      return WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN;
1483                  }

上述的一个判断,type代码窗口类型,它介于FIRST_SUB_WINDOW和LAST_SUB_WINDOW之间,FIRST_SUB_WINDOW和LAST_SUB_WINDOW值定义在windowmanger中
android display 杂谈(三)WMS,android

通常Window有三种类型,以及它们的值范围分别是:
Application Window(应用窗口) 1-99
Sub Window(子窗口)1000-1999
System Window(系统窗口)2000-2999

所以上述可以看出上述窗口是一个子窗口。

1478                  parentWindow = windowForClientLocked(null, attrs.token, false);

看一下windowforclientLocked方法

6033      final WindowState windowForClientLocked(Session session, IWindow client, boolean throwOnError) {
6034          return windowForClientLocked(session, client.asBinder(), throwOnError);
6035      }
6036  
6037      final WindowState windowForClientLocked(Session session, IBinder client, boolean throwOnError) {
6038          WindowState win = mWindowMap.get(client);
6039          if (DEBUG) Slog.v(TAG_WM, "Looking up client " + client + ": " + win);
6040          if (win == null) {
6041              if (throwOnError) {
6042                  throw new IllegalArgumentException(
6043                          "Requested window " + client + " does not exist");
6044              }
6045              ProtoLog.w(WM_ERROR, "Failed looking up window session=%s callers=%s", session,
6046                      Debug.getCallers(3));
6047              return null;
6048          }
6049          if (session != null && win.mSession != session) {
6050              if (throwOnError) {
6051                  throw new IllegalArgumentException("Requested window " + client + " is in session "
6052                          + win.mSession + ", not " + session);
6053              }
6054              ProtoLog.w(WM_ERROR, "Failed looking up window session=%s callers=%s", session,
6055                      Debug.getCallers(3));
6056              return null;
6057          }
6058  
6059          return win;
6060      }

根据attrs.token作为key值从mWindowMap中得到该子窗口的父窗口,如果win父类窗口等于null会返回错误。

 WindowToken token = displayContent.getWindowToken(
1525                      hasParent ? parentWindow.mAttrs.token : attrs.token);

通过displayContent的getWindowToken方法获得WindowToken

 if (token == null) {
1535                  if (!unprivilegedAppCanCreateTokenWith(parentWindow, callingUid, type,
1536                          rootType, attrs.token, attrs.packageName)) {
1537                      return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
1538                  }

......

1585              } else if (rootType == TYPE_INPUT_METHOD) {
1586                  if (token.windowType != TYPE_INPUT_METHOD) {
1587                      ProtoLog.w(WM_ERROR, "Attempted to add input method window with bad token "
1588                              + "%s.  Aborting.", attrs.token);
1589                      return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
1590                  }
                  } else if (rootType == TYPE_VOICE_INTERACTION) {
1592                  if (token.windowType != TYPE_VOICE_INTERACTION) {
1593                      ProtoLog.w(WM_ERROR, "Attempted to add voice interaction window with bad token "
1594                              + "%s.  Aborting.", attrs.token);
1595                      return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
1596                  }
1597              } else if (rootType == TYPE_WALLPAPER) {
1598                  if (token.windowType != TYPE_WALLPAPER) {
1599                      ProtoLog.w(WM_ERROR, "Attempted to add wallpaper window with bad token "
1600                              + "%s.  Aborting.", attrs.token);
1601                      return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
1602                  }
1603              } else if (rootType == TYPE_ACCESSIBILITY_OVERLAY) {
1604                  if (token.windowType != TYPE_ACCESSIBILITY_OVERLAY) {
1605                      ProtoLog.w(WM_ERROR,
1606                              "Attempted to add Accessibility overlay window with bad token "
1607                                      + "%s.  Aborting.", attrs.token);
1608                      return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
1609                  }

如果token为空,则做些判断,如果rootType等于TYPE_INPUT_METHOD等时,会返回ADD_BAD_APP_TOKEN状态值。文章来源地址https://www.toymoban.com/news/detail-742767.html

到了这里,关于android display 杂谈(三)WMS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android】WMS(二)Window的添加

    在 Android 应用开发中,软键盘的显示与隐藏是一个经常出现的问题,而 WindowManager 的 LayoutParams 中定义的软键盘相关模式则为开发者提供了一些解决方案。 其中, SoftInputMode 就是用于描述软键盘的显示方式和窗口的调整方式的属性。常用的几个 SoftInputMode 的作用: SOFT_INPUT_

    2024年02月09日
    浏览(52)
  • Android14 WMS 窗口布局流程performSurfacePlacement

    在WMS启动的时候,就创建了WindowSurfacePlacer对象,该对象专门用来执行窗口Surface的“摆放”操作。 标题      WindowSurfacePlacer#performSurfacePlacement() 方法,可以说是WMS中最核心的方法,负责所有窗口的Surface的摆放工作,如何显示、显示在什么位置、显示区域多大,都将通过这个

    2024年04月14日
    浏览(38)
  • 【Android Framework系列】第7章 WMS原理

    前面【Android Framework系列】第5章 AMS启动流程和【Android Framework系列】第6章 AMS原理之Launcher启动流程我们分析了 AMS启动 以及 Launcher启动 的整体流程,那 Launcher(Activity启动)后 , UI 是如 何渲染到屏幕 并且 展示 出来的呢?我们这章节来探讨一下。 WindowManagerService 简称 WMS ,是

    2024年02月16日
    浏览(47)
  • 【Android】WMS(三)Window的更新&UI刷新

    在 Android 中,窗口的更新是一个非常常见的事情。比如,在使用 App 过程中,需要弹出键盘窗口或者切换横竖屏时,就会发生窗口的更新。 首先,当需要更新窗口时,会调用 WindowManager 的 updateViewLayout() 方法来设置参数,并将参数设置到 对应的 View 上。WindowManager 的实现类为

    2024年02月09日
    浏览(77)
  • Android Display架构分析,黑屏,系统架构

    (642条消息) Android Display架构分析_lin-0410的博客-CSDN博客 (644条消息) Android系统架构_橙子19911016的博客-CSDN博客 1 Android 系统架构 Android 是谷歌开发的一款基于 Linux 内核的操作系统。系统架构分为五层,从下到上依次是Linux内核层、硬件抽象层、系统运行库层、应用框架层和应用

    2023年04月26日
    浏览(43)
  • android 13 WMS/AMS系统开发-窗口层级相关DisplayArea,WindowContainer

    官方注释: 给可以直接持有窗口的自己或它的孩子定义了一些公共的方法和属性,像RootWindowContainer、DisplayContent、DisplayArea、DisplayArea.Tokens、TaskDisplayArea、Task、ActivityRecord、WindowToken、WindowState都是直接或间接的继承该类。 这里面主要的重要要成员变量就是mParent和mChildren,一

    2024年02月16日
    浏览(40)
  • 【Android】Activity task和Instrumentation杂谈

    Android不仅可以装载众多的系统组件,还可以将它们跨进程组成ActivityTask,这个特性使得每个应用都不是孤立的。 从数据结构角度看,Task有先后之分,源码实现上采取了stack的方式。这种方式不仅符合用户的逻辑思维和使用习惯,还可以极大复用了系统的资源。 如图,contac

    2024年04月16日
    浏览(25)
  • Android Framework最难模块WMS实战作业-手机车机系统开发必备

    0-整体介绍 1-window-container.mp4 窗口层级树实战启动篇 2-displayarea-feature.mp4 窗口层级树源码分析相关 3-displayarea-draw-feature.mp4 窗口层级树绘制实战1 4-displayarea-draw-leaf.mp4 窗口层级树绘制实战2 5-displayarea-draw-leaf-2.mp4 窗口层级树绘制实战3 6-displayarea-surfacelayer.mp4 窗口层级树相关sur

    2024年02月12日
    浏览(50)
  • android 13 WMS/AMS系统开发-窗口层级相关DisplayArea,WindowContainer第二节

    接着上一节课学习,我们已经清楚的知道了层级结构应该怎么看,根据dumpsys的输出可以完美复原出层级结构树,也理解了结构树对于层级结构的控制作用。但还没有从源码部分对这个结构树进行一个分析,即分析生成这个结构树的源码部分。 结下来调用是实现类DefaultProvid

    2024年02月15日
    浏览(45)
  • 什么是WMS系统?WMS系统有什么功能

    科技进步促使的数字化转型正在为大多数行业铺平道路,并重新定义它们在各个方面的功能,物流行业也不例外,因为它见证了日常运营的重大转变。改变物流行业的关键之一就是WMS系统的引入。 仓储一直是运输和物流部门的核心支柱,随着新工具、技术和平台的引入,物流

    2024年02月05日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包