精华内容
下载资源
问答
  • wms上传流程

    2017-11-12 04:04:00
    出库 ck_sc_bill(lmis) inf_ck_sc_bill(inf) inf_lmis_imp_ck_bill(ksoa) inf_erp_imp_ck_hz/mx(ksoa) 入库 rk_sc_bill(lmis) inf_rk_sc_bill(inf) inf_lmis_imp_rk_bill(ksoa) inf_erp_imp_rk_h...

    出库

    ck_sc_bill(lmis)

    inf_ck_sc_bill(inf)

    inf_lmis_imp_ck_bill(ksoa)

    inf_erp_imp_ck_hz/mx(ksoa)


    入库

    rk_sc_bill(lmis)

    inf_rk_sc_bill(inf)

    inf_lmis_imp_rk_bill(ksoa)

    inf_erp_imp_rk_hz/mx(ksoa)


    库存

    inf_kc_spphhw(inf)

    inf_kc_spphhw/spzkc(ksoa)



    本文转自 qvodnet 51CTO博客,原文链接:http://blog.51cto.com/bks2015/1615800

    展开全文
  • WMS服务启动流程

    2020-07-18 14:54:22
    2 WMS服务启动流程 wms(WindowManagerService)属于一种系统服务,类似的服务为AMS,PMS,IMS等,是在SystemServer中被启动。 启动wms服务的流程如下: 2.1 Zygote启动systemserver 由结构图的得知,在...

    2 WMS服务启动流程

       wms(WindowManagerService)属于一种系统服务,类似的服务为AMS,PMS,IMS等,是在SystemServer中被启动。

    启动wms服务的流程如下:

     

      2.1 Zygote启动systemserver

          由结构图的得知,在ZygoteInit.java的forkSystemServer函数中启动了SyetemServer进程,代码如下:

     

    2.2 systemserver进程启动过程

    handleSystemServerProcess的代码如下:

    handleSystemServerProcess的代码如下:

       ZygoteInit的zygoteInit主要的工作如下:

    1. 调用了Native的代码,启动了线程池
    2. 调用了findStaticMain方法来找到systemserver的main方法

    代码如下:

     

    通过findStaticMain方法调用到systemserver的main方法,代码如下:

     

    2.3 解析systemserver进程

    先查看以下systemserver的main方法,代码如下:

         此方法只调用了run方法,run方法代码很多,主要的涉及代码分析如下:

       从上述方法看到,官方把系统服务分为了三种类型,分别是引导服务、核心服务和其他服务,其中其他服务为一些非紧要和一些不需要立即启动的服务。系统服务大约有80多个,这里列出部分系统服务以及它们的作用如下表所示:

    引导服务

    作用

    Installer

    系统安装apk时的一个服务类,启动完成Installer服务之后才能启动其他的系统服务

    ActivityManagerService/ActivityTaskManagerService

    负责四大组件的启动、切换、调度

    PowerManagerService

    计算系统中和Power相关的计算,然后决策系统应该如何反应

    LightsService

    管理和显示背光LED

    DisplayManagerService

    用来管理所有显示设备

    UserManagerService

    多用户模式管理

    SensorService

    为系统提供各种感应器服务

    PackageManagerService

    用来对apk进行安装、解析、删除、卸载等等操作

     

    核心服务

    作用

    BatteryService

    管理电池相关的服务

    UsageStatsService

    收集用户使用每一个APP的频率、使用时常

    WebViewUpdateService

    WebView更新服务

     

    其他服务

    作用

    CameraService

    摄像头相关服务

    AlarmManagerService

    全局定时器管理服务

    InputManagerService

    管理输入事件

    WindowManagerService

    窗口管理服务

    VrManagerService

    VR模式管理服务

    BluetoothService

    蓝牙管理服务

    NotificationManagerService

    通知管理服务

    DeviceStorageMonitorService

    存储相关管理服务

    LocationManagerService

    定位管理服务

    AudioService

    音频相关管理服务

     

    从上述代码中得知,SyetemServer在启动时做了如下工作:
    1.启动Binder线程池,这样就可以与其他进程进行通信。
    2.创建SystemServiceManager用于对系统的服务进行创建、启动和生命周期管理。
    3.启动各种系统服务。

    2.4 分析startOtherService中涉及wms的初始化和启动服务

       wms的初始化和启动都是在startOtherService服务中,与wms相关的代码如下:

    从上述代码中得知wms,在此方法中主要执行的为:

    1. 初始化wms服务
    2. 将wms服务添加到systemserver中
    3. 初始化窗口管理策略类windowmanagerpolicy,调用onInitReady方法
    4. 通知wms 的显示准备完毕,调用displayReady
    5. 通知wms系统准备完毕,调用systemReady此时就可以读取屏幕的相关熟悉信息

     

     

    展开全文
  • Android P WMS addwindow流程 Android P WMS removewindow流程 Android P WMS relayoutWindow流程 Android P WMS windowanimator Android P WMS Surface Android P WMS 问题种类和debug分析技...

    Android P WMS removewindow流程

    Android P WMS relayoutWindow流程

    Android P WMS windowanimator

    Android P WMS Surface

    Android P WMS 问题种类和debug分析技巧

    Android P WMS View System 简介

     

    1.APP启动addWindow过程

    我们在WMS addWindow添加打印堆栈log

    1. //在WMS添加如下堆栈
    2. @WindowManagerService.java
    3. public int addWindow(Session session, IWindow client, int seq,
    4. LayoutParams attrs, int viewVisibility, int displayId, Rect outFrame,
    5. Rect outContentInsets, Rect outStableInsets, Rect outOutsets,
    6. DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel) {
    7. new Exception("William WindowManagerService stack").printStackTrace(); //add log

    然后在launcher点击启动settings,log如下。第一次在启动splash screen时执行addWindow,来至于SplashScreenStartingData.createStartingSurface,第二次是启动settings主界面  com.android.settings/com.android.settings.Settings。这一部分可以参考:

    Android悬浮窗TYPE_TOAST小结: 源码分析

    Android解析WindowManager(三)Window的添加过程

    1. //发现启动settings时,会先启动Splash Screen(启动画面也叫欢迎页)
    2. 1077 1148 W System.err: java.lang.Exception: William WindowManagerService stack
    3. 1077 1148 W System.err: at com.android.server.wm.WindowManagerService.addWindow(WindowManagerService.java:1157)
    4. 1077 1148 W System.err: at com.android.server.wm.Session.addToDisplay(Session.java:205)
    5. 1077 1148 W System.err: at android.view.ViewRootImpl.setView(ViewRootImpl.java:771)
    6. 1077 1148 W System.err: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
    7. 1077 1148 W System.err: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
    8. 1077 1148 W System.err: at com.android.server.policy.PhoneWindowManager.addSplashScreen(PhoneWindowManager.java:3214)
    9. 1077 1148 W System.err: at com.android.server.wm.SplashScreenStartingData.createStartingSurface(SplashScreenStartingData.java:56)
    10. 1077 1148 W System.err: at com.android.server.wm.AppWindowContainerController$1.run(AppWindowContainerController.java:170)
    11. 1077 1148 W System.err: at android.os.Handler.handleCallback(Handler.java:873)
    12. 1077 1148 W System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
    13. 1077 1148 W System.err: at android.os.Looper.loop(Looper.java:193)
    14. 1077 1148 W System.err: at android.os.HandlerThread.run(HandlerThread.java:65)
    15. 1077 1148 W System.err: at com.android.server.ServiceThread.run(ServiceThread.java:44)
    16. 1077 1148 V WindowManager: Window Window{e56651a u0 Splash Screen com.android.settings} client=android.view.ViewRootImpl$W@f2667c5 token=AppWindowToken{4be29e3 token=Token{afc8e12 ActivityRecord{f88399d u0 com.android.settings/.Settings t7}}} (Token{afc8e12 ActivityRecord{f88399d u0 com.android.settings/.Settings t7}}) params={(0,0)(fillxfill) ty=APPLICATION_STARTING wanim=0x10302f8
    17. 1077 1148 V WindowManager: Attaching Window{e56651a u0 Splash Screen com.android.settings} token=AppWindowToken{4be29e3 token=Token{afc8e12 ActivityRecord{f88399d u0 com.android.settings/.Settings t7}}}
    18. 1077 1148 V WindowManager: addWindow: New client android.view.ViewRootImpl$W@f2667c5: window=Window{e56651a u0 Splash Screen com.android.settings} Callers=com.android.server.wm.Session.addToDisplay:205 android.view.ViewRootImpl.setView:771 android.view.WindowManagerGlobal.addView:356 android.view.WindowManagerImpl.addView:93 com.android.server.policy.PhoneWindowManager.addSplashScreen:3214
    19. //然后才add settings window(com.android.settings/com.android.settings.Settings)
    20. 1077 1236 W System.err: java.lang.Exception: William WindowManagerService stack
    21. 1077 1236 W System.err: at com.android.server.wm.WindowManagerService.addWindow(WindowManagerService.java:1157)
    22. 1077 1236 W System.err: at com.android.server.wm.Session.addToDisplay(Session.java:205)
    23. 1077 1236 W System.err: at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:129)
    24. 1077 1236 W System.err: at com.android.server.wm.Session.onTransact(Session.java:164)
    25. 1077 1236 V WindowManager: Window Window{c70e488 u0 com.android.settings/com.android.settings.Settings} client=android.os.BinderProxy@d12a82b token=AppWindowToken{4be29e3 token=Token{afc8e12 ActivityRecord{f88399d u0 com.android.settings/.Settings t7}}} (Token{afc8e12 ActivityRecord{f88399d u0 com.android.settings/.Settings t7}}) params={(0,0)(fillxfill) sim={forwardNavigation} ty=BASE_APPLICATION wanim=0x10302f8
    26. 1077 1236 V WindowManager: Attaching Window{c70e488 u0 com.android.settings/com.android.settings.Settings} token=AppWindowToken{4be29e3 token=Token{afc8e12 ActivityRecord{f88399d u0 com.android.settings/.Settings t7}}}
    27. 1077 1236 V WindowManager: First window added to Session{d84ba9c 3168:1000}, creating SurfaceSession
    28. 1077 1236 V WindowManager: addWindow: New client android.os.BinderProxy@d12a82b: window=Window{c70e488 u0 com.android.settings/com.android.settings.Settings} Callers=com.android.server.wm.Session.addToDisplay:205 android.view.IWindowSession$Stub.onTransact:129 com.android.server.wm.Session.onTransact:164 android.os.Binder.execTransact:731 <bottom of call stack>

    Android解析WindowManager(三)Window的添加过程

    1.0 概述

    WindowManager对Window进行管理,说到管理那就离不开对Window的添加、更新和删除的操作,在这里我们把它们统称为Window的操作。对于Window的操作,最终都是交由WMS来进行处理。窗口的操作分为两大部分,一部分是WindowManager处理部分,另一部分是WMS处理部分。我们知道Window分为三大类,分别是:Application Window(应用程序窗口)、Sub Windwow(子窗口)和System Window(系统窗口),对于不同类型的窗口添加过程会有所不同,但是对于WMS处理部分,添加的过程基本上是一样的, WMS对于这三大类的窗口基本是“一视同仁”的。

     

    1.1 Activity的添加过程

    1. @frameworks/base/core/java/android/app/ActivityThread.java
    2. final void handleResumeActivity(IBinder token,
    3. boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
    4. ...
    5. r = performResumeActivity(token, clearHide, reason);//1
    6. ...
    7. if (r.window == null && !a.mFinished && willBeVisible) {
    8. r.window = r.activity.getWindow();
    9. View decor = r.window.getDecorView();
    10. decor.setVisibility(View.INVISIBLE);
    11. ViewManager wm = a.getWindowManager();//2
    12. WindowManager.LayoutParams l = r.window.getAttributes();
    13. a.mDecor = decor;
    14. l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
    15. l.softInputMode |= forwardBit;
    16. if (r.mPreserveWindow) {
    17. a.mWindowAdded = true;
    18. r.mPreserveWindow = false;
    19. ViewRootImpl impl = decor.getViewRootImpl();
    20. if (impl != null) {
    21. impl.notifyChildRebuilt();
    22. }
    23. }
    24. if (a.mVisibleFromClient && !a.mWindowAdded) {
    25. a.mWindowAdded = true;
    26. wm.addView(decor, l);//3
    27. }
    28. }

    注释1处的performResumeActivity方法最终会调用Activity的onResume方法。在注释2处得到ViewManager类型的wm对象,
    在注释3处调用了wm的addView方法,而addView方法的实现则是在WindowManagerImpl中,此后的过程在上面的系统窗口的添加过程已经讲过,
    唯一需要注意的是addView的第一个参数是DecorView。

    1.2 系统窗口的添加过程

    三大类窗口的添加过程会有所不同,这里以系统窗口StatusBar为例,StatusBar是SystemUI的重要组成部分,具体就是指系统状态栏,用于显示时间、电量和信号等信息。我们来查看StatusBar的实现类PhoneStatusBar的addStatusBarWindow方法,这个方法负责为StatusBar添加Window,如下所示。

    1. @/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
    2. private void addStatusBarWindow() {
    3. makeStatusBarView();
    4. mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
    5. mRemoteInputController = new RemoteInputController(mHeadsUpManager);
    6. mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight());
    7. }
    8. @/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
    9. public void add(View statusBarView, int barHeight) {
    10. // Now that the status bar window encompasses the sliding panel and its
    11. // translucent backdrop, the entire thing is made TRANSLUCENT and is
    12. // hardware-accelerated.
    13. mLp = new WindowManager.LayoutParams(
    14. ViewGroup.LayoutParams.MATCH_PARENT,
    15. barHeight,
    16. WindowManager.LayoutParams.TYPE_STATUS_BAR,
    17. WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
    18. | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
    19. | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
    20. | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
    21. | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
    22. PixelFormat.TRANSLUCENT);
    23. mLp.token = new Binder();
    24. mLp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
    25. mLp.gravity = Gravity.TOP;
    26. mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
    27. mLp.setTitle("StatusBar");
    28. mLp.packageName = mContext.getPackageName();
    29. mStatusBarView = statusBarView;
    30. mBarHeight = barHeight;
    31. mWindowManager.addView(mStatusBarView, mLp); //mWindowManager
    32. mLpChanged = new WindowManager.LayoutParams();
    33. mLpChanged.copyFrom(mLp);
    34. }
    35. //WindowManager继承ViewManager,因此还是在ViewManager
    36. @frameworks/base/core/java/android/view/WindowManager.java
    37. /**
    38. * The interface that apps use to talk to the window manager.
    39. * </p><p>
    40. @SystemService(Context.WINDOW_SERVICE)
    41. public interface WindowManager extends ViewManager {
    42. //包括addview update remove
    43. @/frameworks/base/core/java/android/view/ViewManager.java
    44. public interface ViewManager
    45. public void addView(View view, ViewGroup.LayoutParams params);
    46. public void updateViewLayout(View view, ViewGroup.LayoutParams params);
    47. public void removeView(View view);
    48. }
    49. //WindowManagerImpl具体实现addView
    50. public final class WindowManagerImpl implements WindowManager {
    51. private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
    52. @Override
    53. public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
    54. applyDefaultToken(params);
    55. mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
    56. }
    57. @frameworks/base/core/java/android/view/WindowManagerGlobal.java
    58. public void addView(View view, ViewGroup.LayoutParams params,
    59. Display display, Window parentWindow) {
    60. ...//参数检查
    61. final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams) params;
    62. if (parentWindow != null) {
    63. parentWindow.adjustLayoutParamsForSubWindow(wparams);//1
    64. } else {
    65. ...
    66. }
    67. ViewRootImpl root;
    68. View panelParentView = null;
    69. ...
    70. root = new ViewRootImpl(view.getContext(), display);//2
    71. view.setLayoutParams(wparams);
    72. mViews.add(view);
    73. mRoots.add(root);//3
    74. mParams.add(wparams);
    75. }
    76. try {
    77. root.setView(view, wparams, panelParentView);//4
    78. } catch (RuntimeException e) {
    79. ...
    80. }
    81. }
    82. /**
    83. * We have one child
    84. */
    85. public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
    86. synchronized (this) {
    87. try {
    88. mOrigWindowType = mWindowAttributes.type;
    89. mAttachInfo.mRecomputeGlobalAttributes = true;
    90. collectViewAttributes();
    91. res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
    92. getHostVisibility(), mDisplay.getDisplayId(),
    93. mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
    94. mAttachInfo.mOutsets, mInputChannel);
    95. }
    96. }
    97. @/frameworks/base/services/core/java/com/android/server/wm/Session.java
    98. public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
    99. int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
    100. Rect outOutsets, InputChannel outInputChannel) {
    101. return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId, //就调用到了wms::addWindow
    102. outContentInsets, outStableInsets, outOutsets, outInputChannel);
    103. }

     

    2.Window的添加过程(WMS部分)

    frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

    1. public int addWindow(Session session, IWindow client, int seq,
    2. WindowManager.LayoutParams attrs, int viewVisibility, int displayId,
    3. Rect outContentInsets, Rect outStableInsets, Rect outOutsets,
    4. InputChannel outInputChannel) {
    5. int[] appOp = new int[1];
    6. int res = mPolicy.checkAddPermission(attrs, appOp);//1
    7. if (res != WindowManagerGlobal.ADD_OKAY) {
    8. return res;
    9. }
    10. ...
    11. synchronized(mWindowMap) {
    12. if (!mDisplayReady) {
    13. throw new IllegalStateException("Display has not been initialialized");
    14. }
    15. final DisplayContent displayContent = mRoot.getDisplayContentOrCreate(displayId);//2
    16. if (displayContent == null) {
    17. Slog.w(TAG_WM, "Attempted to add window to a display that does not exist: "
    18. + displayId + ". Aborting.");
    19. return WindowManagerGlobal.ADD_INVALID_DISPLAY;
    20. }
    21. ...
    22. if (type >= FIRST_SUB_WINDOW && type <= LAST_SUB_WINDOW) {//3
    23. parentWindow = windowForClientLocked(null, attrs.token, false);//4
    24. if (parentWindow == null) {
    25. Slog.w(TAG_WM, "Attempted to add window with token that is not a window: "
    26. + attrs.token + ". Aborting.");
    27. return WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN;
    28. }
    29. if (parentWindow.mAttrs.type >= FIRST_SUB_WINDOW
    30. && parentWindow.mAttrs.type <= LAST_SUB_WINDOW) {
    31. Slog.w(TAG_WM, "Attempted to add window with token that is a sub-window: "
    32. + attrs.token + ". Aborting.");
    33. return WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN;
    34. }
    35. }
    36. ...
    37. }
    38. ...
    39. }

    WMS的addWindow返回的是addWindow的各种状态,比如添加Window成功,无效的display等等,这些状态被定义在WindowManagerGlobal中。 
    注释1处根据Window的属性,调用WMP的checkAddPermission方法来检查权限,具体的实现在PhoneWindowManager的checkAddPermission方法中,如果没有权限则不会执行后续的代码逻辑。注释2处通过displayId来获得窗口要添加到哪个DisplayContent上,如果没有找到DisplayContent,则返回WindowManagerGlobal.ADD_INVALID_DISPLAY这一状态,其中DisplayContent用来描述一块屏幕。注释3处,type代表一个窗口的类型,它的数值介于FIRST_SUB_WINDOW和LAST_SUB_WINDOW之间(1000~1999),这个数值定义在WindowManager中,说明这个窗口是一个子窗口,不了解窗口类型取值范围的请阅读Android解析WindowManager(二)Window的属性这篇文章。注释4处,attrs.token是IBinder类型的对象,windowForClientLocked方法内部会根据attrs.token作为key值从mWindowMap中得到该子窗口的父窗口。接着对父窗口进行判断,如果父窗口为null或者type的取值范围不正确则会返回错误的状态。
     

     

    1. ...
    2. AppWindowToken atoken = null;
    3. final boolean hasParent = parentWindow != null;
    4. WindowToken token = displayContent.getWindowToken(
    5. hasParent ? parentWindow.mAttrs.token : attrs.token);//1
    6. final int rootType = hasParent ? parentWindow.mAttrs.type : type;//2
    7. boolean addToastWindowRequiresToken = false;
    8. if (token == null) {
    9. if (rootType >= FIRST_APPLICATION_WINDOW && rootType <= LAST_APPLICATION_WINDOW) {
    10. Slog.w(TAG_WM, "Attempted to add application window with unknown token "
    11. + attrs.token + ". Aborting.");
    12. return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
    13. }
    14. if (rootType == TYPE_INPUT_METHOD) {
    15. Slog.w(TAG_WM, "Attempted to add input method window with unknown token "
    16. + attrs.token + ". Aborting.");
    17. return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
    18. }
    19. if (rootType == TYPE_VOICE_INTERACTION) {
    20. Slog.w(TAG_WM, "Attempted to add voice interaction window with unknown token "
    21. + attrs.token + ". Aborting.");
    22. return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
    23. }
    24. if (rootType == TYPE_WALLPAPER) {
    25. Slog.w(TAG_WM, "Attempted to add wallpaper window with unknown token "
    26. + attrs.token + ". Aborting.");
    27. return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
    28. }
    29. ...
    30. if (type == TYPE_TOAST) {
    31. // Apps targeting SDK above N MR1 cannot arbitrary add toast windows.
    32. if (doesAddToastWindowRequireToken(attrs.packageName, callingUid,
    33. parentWindow)) {
    34. Slog.w(TAG_WM, "Attempted to add a toast window with unknown token "
    35. + attrs.token + ". Aborting.");
    36. return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
    37. }
    38. }
    39. final IBinder binder = attrs.token != null ? attrs.token : client.asBinder();
    40. token = new WindowToken(this, binder, type, false, displayContent,
    41. session.mCanAddInternalSystemWindow);//3
    42. } else if (rootType >= FIRST_APPLICATION_WINDOW && rootType <= LAST_APPLICATION_WINDOW) {//4
    43. atoken = token.asAppWindowToken();//5
    44. if (atoken == null) {
    45. Slog.w(TAG_WM, "Attempted to add window with non-application token "
    46. + token + ". Aborting.");
    47. return WindowManagerGlobal.ADD_NOT_APP_TOKEN;
    48. } else if (atoken.removed) {
    49. Slog.w(TAG_WM, "Attempted to add window with exiting application token "
    50. + token + ". Aborting.");
    51. return WindowManagerGlobal.ADD_APP_EXITING;
    52. }
    53. } else if (rootType == TYPE_INPUT_METHOD) {
    54. if (token.windowType != TYPE_INPUT_METHOD) {
    55. Slog.w(TAG_WM, "Attempted to add input method window with bad token "
    56. + attrs.token + ". Aborting.");
    57. return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
    58. }
    59. }
    60. ...

     

    addWindow方法总结
    addWindow方法分了3个部分来进行讲解,主要就是做了下面4件事: 
    1. 对所要添加的窗口进行检查,如果窗口不满足一些条件,就不会再执行下面的代码逻辑。 
    2. WindowToken相关的处理,比如有的窗口类型需要提供WindowToken,没有提供的话就不会执行下面的代码逻辑,有的窗口类型则需要由WMS隐式创建WindowToken。 
    3. WindowState的创建和相关处理,将WindowToken和WindowState相关联。 
    4. 创建和配置DisplayContent,完成窗口添加到系统前的准备工作。
     

     

    参考链接:

    Android悬浮窗TYPE_TOAST小结: 源码分析

    Android解析WindowManagerService(二)WMS的重要成员和Window的添加过程

    Android解析WindowManager系列

    http://androidxref.com/9.0.0_r3/

    《深入理解Android:卷III》 

    展开全文
  • WindowManagerService 简称 WMS,主要有如下职责: 窗口管理:负责启动、添加、删除窗口,管理窗口大小、层级,核心成员有:WindowContainer、RootWindowContainer、DisplayContent、TaskStack、Task、...

    1 前言

    WMS 是 WindowManagerService 的简称。

    (1)WMS 主要职责

    • 窗口管理:负责启动、添加、删除窗口,管理窗口大小、层级,核心成员有:WindowContainer、RootWindowContainer、DisplayContent、TaskStack、Task、AppWindowToken、WindowState;
    • 窗口动画:由其子系统 WindowAnimator 管理;
    • 输入系统中转站:通过对窗口的触摸从而产生触摸事件,由 InputMethodService(IMS)对触摸事件进行处理,它会寻找一个最合适的窗口处理触摸反馈信息;
    • Surface 管理:为每个窗口分配一块 Surface,用于绘制要显示的内容。

    (2) WMS 创建过程中线程关系

    WMS 创建过程中涉及到的类主要有 SystemServer、WindowManagerService(WMS)、WindowManagerPolicy(WMP),它们都在 system_server 进程中运行,但是会在不同线程中运行,如下所示。

    2 WMS启动流程

    (1)main

    /frameworks/base/services/java/com/android/server/SystemServer.java 

    public static void main(String[] args) {
        new SystemServer().run();
    }

    (2)run

    /frameworks/base/services/java/com/android/server/SystemServer.java 

    private void run() {
    	try {
    		...
    		// 创建Looper
    		Looper.prepareMainLooper();
    		// 加载libandroid_servers.so
    		System.loadLibrary("android_servers");
    		// 创建系统的 Context:ContextImpl.createSystemContext(new ActivityThread())
    		createSystemContext();
    		// 创建 SystemServiceManager
    		mSystemServiceManager = new SystemServiceManager(mSystemContext);
    		LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    		...
    	}
    	...
    	try {
    		//启动引导服务,ActivityManagerService、ActivityTaskManagerService、PackageManagerService、PowerManagerService、DisplayManagerService 等
    		startBootstrapServices(); 
    		//启动核心服务,BatteryService、UsageStatusService 等
    		startCoreServices(); 
    		//启动其他服务,InputManagerService、WindowManagerService、CameraService、AlarmManagerService 等
    		startOtherServices(); 
    		...
    	}
    	...
    	// 开启消息循环
    	Looper.loop();
    }

    (3)startOtherServices

    /frameworks/base/services/java/com/android/server/SystemServer.java 

    private void startOtherServices() {
    	...
    	WindowManagerService wm = null;
    	...
    	InputManagerService inputManager = null;
    	...
    	try {
            ...
            inputManager = new InputManagerService(context);
    		...
            //PhoneWindowManager 是 WMP 的实现类
    		wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore, new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
    		ServiceManager.addService(Context.WINDOW_SERVICE, wm, false, DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
    		ServiceManager.addService(Context.INPUT_SERVICE, inputManager, false, DUMP_FLAG_PRIORITY_CRITICAL);
    		...
    		mActivityManagerService.setWindowManager(wm);
    		...
    		wm.onInitReady(); //initPolicy
    		...
            //wm 的 mInputManagerCallback 属性在定义时就被初始化
    		inputManager.setWindowManagerCallbacks(wm.getInputManagerCallback());
    		inputManager.start();
    		...
    	}
    	...
    	try {
    		wm.displayReady(); //初始化屏幕信息
    	}
    	...
    	try {
    		wm.systemReady(); //通知 WMS 系统的初始化完成
    	}
    	...
        final Configuration config = wm.computeNewConfiguration(DEFAULT_DISPLAY);
        ...
    }

     注意:在 WindowManagerService.main() 中,传入了 InputManagerService、PhoneWindowManager(WindowManagerPolicy 的实现类)、ActivityTaskManagerService(简称 ATMS)

    通过 ServiceManager.addService() 将 Context.WINDOW_SERVICE 与 WMS 绑定,因此在其他进程中可以通过如下方式获取 WMS。

    IBinder b = ServiceManager.getService(Context.WINDOW_SERVICE); 
    IWindowManager wm = IWindowManager.Stub.asInterface(b);

    (4)main

    /frameworks/base/services/java/com/android/server/wm/WindowManagerService.java 

    public static WindowManagerService main(final Context context, final InputManagerService im, final boolean showBootMsgs, 
    		final boolean onlyCore, WindowManagerPolicy policy, ActivityTaskManagerService atm) {
    	return main(context, im, showBootMsgs, onlyCore, policy, atm, SurfaceControl.Transaction::new);
    }
    
    public static WindowManagerService main(final Context context, final InputManagerService im, final boolean showBootMsgs, 
    		final boolean onlyCore, WindowManagerPolicy policy, ActivityTaskManagerService atm, TransactionFactory transactionFactory) {
        //在 android.display 线程中创建 WMS(此时 system_server 线程阻塞)
    	DisplayThread.getHandler().runWithScissors(() ->
    			sInstance = new WindowManagerService(context, im, showBootMsgs, onlyCore, policy, atm, transactionFactory), 0);
    	return sInstance;
    }

    3 WMS 初始化

     本节主要研究 WMS 在初始化时做的工作。

    (1)构造函数

    /frameworks/base/services/java/com/android/server/wm/WindowManagerService.java 

    private WindowManagerService(Context context, InputManagerService inputManager, boolean showBootMsgs, boolean onlyCore, 
    		WindowManagerPolicy policy, ActivityTaskManagerService atm, TransactionFactory transactionFactory) {
    	...
    	mAtmService = atm;
    	mContext = context;
    	...
    	mInputManager = inputManager;
        mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
    	...
    	mPolicy = policy;
        //动画管理
    	mAnimator = new WindowAnimator(this);
        //根容器,其子容器是 DisplayContent
    	mRoot = new RootWindowContainer(this);
        mWindowPlacerLocked = new WindowSurfacePlacer(this);
        ...
        //mPolicy 是 PhoneWindowManager 对象,WindowManagerPolicy 的实现类
        LocalServices.addService(WindowManagerPolicy.class, mPolicy);
    	...
    	//DM
    	mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
    	//PM
    	mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
    	//AMS
    	mActivityManager = ActivityManager.getService();
    	//ATMS
    	mActivityTaskManager = ActivityTaskManager.getService();
        //ActivityManagerInternal
        mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
        //ActivityTaskManagerInternal
        mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
        ...
        //PackageManagerInternal
        mPmInternal = LocalServices.getService(PackageManagerInternal.class);
        //添加本地服务
        LocalServices.addService(WindowManagerInternal.class, new LocalService());
    }

    LocalService 是 WMS 的内部类,也是 WindowManagerInternal 的实现类。

    (2)初始化 WMP

    /frameworks/base/services/java/com/android/server/wm/WindowManagerService.java 

    public void onInitReady() {
    	//初始化 WMP
    	initPolicy();
    	...
    	//打开 Surface 事务:SurfaceControl.openTransaction()
    	openSurfaceTransaction();
    	...
    }
    
    private void initPolicy() {
    	//在 android.ui 线程中执行
    	UiThread.getHandler().runWithScissors(new Runnable() {
    		@Override
    		public void run() {
    			WindowManagerPolicyThread.set(Thread.currentThread(), Looper.myLooper());
    			mPolicy.init(mContext, WindowManagerService.this, WindowManagerService.this);
    		}
    	}, 0);
    }

    (3)初始化 Display

    /frameworks/base/services/java/com/android/server/wm/WindowManagerService.java 

    public void displayReady() {
    	synchronized (mGlobalLock) {
    		if (mMaxUiWidth > 0) {
    			mRoot.forAllDisplays(displayContent -> displayContent.setMaxUiWidth(mMaxUiWidth));
    		}
    		final boolean changed = applyForcedPropertiesForDefaultDisplay();
    		mAnimator.ready();
    		...
    	}
    	...
    	updateCircularDisplayMaskIfNeeded();
    }

    (4)通知系统 WMS 初始化完成

    /frameworks/base/services/java/com/android/server/wm/WindowManagerService.java 

    public void systemReady() {
    	mSystemReady = true;
    	mPolicy.systemReady();
    	mRoot.forAllDisplayPolicies(DisplayPolicy::systemReady);
    	mTaskSnapshotController.systemReady();
    	...
    	UiThread.getHandler().post(mSettingsObserver::updateSystemUiSettings);
    	UiThread.getHandler().post(mSettingsObserver::updatePointerLocation);
    	...
    }

     

    展开全文
  • WMS海外仓分拣系统开发 WMS仓储物流开发系统流程
  • WMS库存盘点流程 WMS库存盘点计划

    千次阅读 2020-04-11 22:35:51
    对于仓库管理来说,盘点工作在管理...但是,在现实做好盘点工作却没有那些轻松容易,尤其是在库存量大的仓库,其作业量更是惊人,若没有一套成熟的盘点方法和流程,盘点起来不仅耗费的人力和时间多,且影响仓库正...
  • wms

    2014-08-04 17:00:00
    WMS 流程简介-- ASN(预报收货单)-新增预报信息(ASN)-到货验收--生成上架(安排库位)--接收****一般的货物不需要包装的。 ASN(预报收货单)-新增预报信息(ASN)-包装(打印标签)--到货验收--生成上架(安排库位)--接收**...
  • 电商物流仓储WMS业务流程 SKU是什么意思?一文详解电商仓储管理中SKU的含义 从货品角度看,SKU是指单独一种商品,其货品属性已经被确定。只要货品属性有所不同,那么就是不同的SKU。 PO信息核实:PO=purchase ...
  • 上一节讲了Activity启动流程,下面针对WMS启动做一个简单的介绍。以Android10.0 aosp为基础进行梳理。 谨以此记录下学习流程,欢迎广大博友交流指正。是时候提高一波了。。。 启动流程 简单分析 SystemServer类中...
  • 随着时代的发展,仓库...今天我们就来说说WMS系统设计与WMS系统的仓储流程是怎样的? 一.仓储管理  当货物入库时,仓库管理系统会根据不同的供应商和不同的货物建立相应的质量检验管理。供应商的货物出库后,可以
  • WMS-Window的添加流程

    2020-07-10 15:24:59
    我在上一篇文章介绍了 Activity 的启动流程,一直讲到到 WMS 这里结束,这篇文章讲沿着上篇文章的脉络继续分析下去。 这篇文章不仅仅是 Window 的添加过程,也会涉及到一些 WMS 相关的原理。我希望能通过了解 Window...
  • WMS仓库管理软件操作流程是怎样?随着互联网时代的到来,如何优化管理,将企业运营成本降到最低,为消费者提供更优质的服务成为了很多制造行业新的企业管理理念,也就是在这个的大背景下,WMS仓库管理系统应用而生。...
  • wms 仓储相关的流程图,包括 进货入库 上架 验货 拣货 出库等
  •  流程描述:  1)采购入库单:库管员根据物料的采购订单收货,然后申请检验,或者对于没有免检条码标签的物料,可以直接打印标签。  2)检验:检查收到的材料是否合格,不合格的退回供应商。  3)标签打印:...
  • 本文是关于wms系统的成品入库流程,希望能帮到你。 一、成品入库流程  1.生产入库:成品生产完成后,需要进行入库操作。首先,在ERP系统中创建产成品入库单,然后通过接口与WMS系统同步。同时,在生产车间,每...
  • WMS入库作业_核心业务流程

    千次阅读 2019-11-22 16:45:59
    仓库的入库作业是由一系列岗位按顺序完成,我先把入库的核心流程写出来,宏观上呈现WMS系统的入库作业模块由哪些子模块构成。 收货 上游系统(OMS、API)创建的入库任务,到了WMS系统生成到货通知单,该入库任务的...
  • 亮屏、灭屏流程整个流程涉及的模块比较多,包括PowerManagerService、DisplayPowerControl、WMS、AMS。因此在分析完WMS之后,我们把这块也分析下。 DisplayPowerControl 我们知道灭屏流程的发起是在PowerManager...
  • 流程图: 二、相关概念 1、ActivityThread:为应用程序的主线程类,所有的APK程序都有且仅有一个ActivityThread,程序的入口为该类static main()函数 Activity:Activity包含一个Window,该Window在Activity的attach...
  • WMS仓储系统的流程是怎样的?随着时代的发展,仓库管理被赋予了更多的功能,在供应链中发挥着越来越重要的作用。如何提高仓库管理的效率已经成为各大企业的首要问题之一。引入WMS体系是许多企业的选择。WMS系统的...
  • 本文以Activity.setRequestedOrientation为入口梳理下横竖屏切换的详细流程。     代码均是基于最新的11.0版本。  第一篇主要讲了横竖屏切换时的准备操作: 更新方向,执行冻屏,截图显示...
  • WMS--窗口创建流程整理

    千次阅读 2017-05-10 13:34:47
    参考:http://www.cnblogs.com/samchen2009/p/3364327.html   《图3》Choreographer处理Vsync流程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 394
精华内容 157
关键字:

wms流程