- 浏览: 22512 次
- 性别:
- 来自: 北京
最新评论
page11
WindowManagerService的getDisplayContentLocked函数的定义如下:
1 public DisplayContent getDisplayContentLocked(final int displayId) {
2 DisplayContent displayContent = mDisplayContents.get(displayId);
3 if (displayContent == null) {
4 final Display display = mDisplayManager.getDisplay(displayId);
5 if (display != null) {
6 displayContent = new DisplayContent(display);
7 mDisplayContents.put(displayId, displayContent);
8 }
9 }
10 return displayContent;
11 }
getDisplayContentLocked函数的逻辑还是比较简单的.
page12
在这篇文章里, 我们分析一下WindowState的创建过程.
WindowState类的定义如下:
final class WindowState implements WindowManagerPolicy.WindowState
WindowState类的定义如下:
1 WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
2 WindowState attachedWindow, int seq, WindowManager.LayoutParams a,
3 int viewVisibility, final DisplayContent displayContent) {
4 mService = service;
5 mSession = s;
6 mClient = c;
7 mToken = token;
8 mOwnerUid = s.mUid;
9 mAttrs.copyFrom(a);
10 mViewVisibility = viewVisibility;
11 mDisplayContent = displayContent;
12 mPolicy = mService.mPolicy;
13 mContext = mService.mContext;
14 DeathRecipient deathRecipient = new DeathRecipient();
15 mSeq = seq;
16 mEnforceSizeCompat = (mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0;
17 if (WindowManagerService.localLOGV) Slog.v(
18 TAG, "Window " + this + " client=" + c.asBinder()
19 + " token=" + token + " (" + mAttrs.token + ")" + " params=" + a);
20 try {
21 c.asBinder().linkToDeath(deathRecipient, 0);
22 } catch (RemoteException e) {
23 mDeathRecipient = null;
24 mAttachedWindow = null;
25 mLayoutAttached = false;
26 mIsImWindow = false;
27 mIsWallpaper = false;
28 mIsFloatingLayer = false;
29 mBaseLayer = 0;
30 mSubLayer = 0;
31 mInputWindowHandle = null;
32 mWinAnimator = null;
33 return;
34 }
35 mDeathRecipient = deathRecipient;
36
37 if ((mAttrs.type >= FIRST_SUB_WINDOW &&
38 mAttrs.type <= LAST_SUB_WINDOW)) {
39 // The multiplier here is to reserve space for multiple
40 // windows in the same type layer.
41 mBaseLayer = mPolicy.windowTypeToLayerLw(
42 attachedWindow.mAttrs.type) * WindowManagerService.TYPE_LAYER_MULTIPLIER
43 + WindowManagerService.TYPE_LAYER_OFFSET;
44 mSubLayer = mPolicy.subWindowTypeToLayerLw(a.type);
45 mAttachedWindow = attachedWindow;
46 if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + this + " to " + mAttachedWindow);
47 mAttachedWindow.mChildWindows.add(this);
48 mLayoutAttached = mAttrs.type !=
49 WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
50 mIsImWindow = attachedWindow.mAttrs.type == TYPE_INPUT_METHOD
51 || attachedWindow.mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
52 mIsWallpaper = attachedWindow.mAttrs.type == TYPE_WALLPAPER;
53 mIsFloatingLayer = mIsImWindow || mIsWallpaper;
54 } else {
55 // The multiplier here is to reserve space for multiple
56 // windows in the same type layer.
57 mBaseLayer = mPolicy.windowTypeToLayerLw(a.type)
58 * WindowManagerService.TYPE_LAYER_MULTIPLIER
59 + WindowManagerService.TYPE_LAYER_OFFSET;
60 mSubLayer = 0;
61 mAttachedWindow = null;
62 mLayoutAttached = false;
63 mIsImWindow = mAttrs.type == TYPE_INPUT_METHOD
64 || mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
65 mIsWallpaper = mAttrs.type == TYPE_WALLPAPER;
66 mIsFloatingLayer = mIsImWindow || mIsWallpaper;
67 }
68
69 WindowState appWin = this;
70 while (appWin.mAttachedWindow != null) {
71 appWin = appWin.mAttachedWindow;
72 }
73 WindowToken appToken = appWin.mToken;
74 while (appToken.appWindowToken == null) {
75 WindowToken parent = mService.mTokenMap.get(appToken.token);
76 if (parent == null || appToken == parent) {
77 break;
78 }
79 appToken = parent;
80 }
81 mRootToken = appToken;
82 mAppToken = appToken.appWindowToken;
83
84 mWinAnimator = new WindowStateAnimator(this);
85 mWinAnimator.mAlpha = a.alpha;
86
87 mRequestedWidth = 0;
88 mRequestedHeight = 0;
89 mLastRequestedWidth = 0;
90 mLastRequestedHeight = 0;
91 mXOffset = 0;
92 mYOffset = 0;
93 mLayer = 0;
94 mInputWindowHandle = new InputWindowHandle(
95 mAppToken != null ? mAppToken.mInputApplicationHandle : null, this,
96 displayContent.getDisplayId());
97 }
第6行(WindowState->WindowState)会将IWindow接口保存到成员变量mClient中去.
page13
WindowState的attach函数的定义如下:
1 void attach() {
2 if (WindowManagerService.localLOGV) Slog.v(
3 TAG, "Attaching " + this + " token=" + mToken
4 + ", list=" + mToken.windows);
5 mSession.windowAddedLocked();
6 }
第5行(WindowState->attach)会调用Session的windowAddedLocked函数, 关于Session的windowAddedLocked函数的详细分析可以参考page14文件.
page14
这里我们分析一下Session的windowAddedLocked函数的实现, Session的windowAddedLocked函数的定义如下:
1 void windowAddedLocked() {
2 if (mSurfaceSession == null) {
3 if (WindowManagerService.localLOGV) Slog.v(
4 WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession");
5 mSurfaceSession = new SurfaceSession();
6 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
7 WindowManagerService.TAG, " NEW SURFACE SESSION " + mSurfaceSession);
8 mService.mSessions.add(this);
9 }
10 mNumWindow++;
11 }
第2行(Session->windowAddedLocked)判断是否已经创建过SurfaceSession, 如果是就不用在创建了. 由此可知, 每一个Activity都对应有一个SurfaceSession对象.
第5行(Session->windowAddedLocked)会创建一个SurfaceSession对象, 关于SurfaceSession对象的创建过程可以参考page15文件.
第8行(Session->windowAddedLocked)会将本Session加入到mService.mSessions中去, mService.mSessions的定义如下:
final HashSet<Session> mSessions = new HashSet<Session>();
mSessions保存着当前活跃的连接
最后, 第10行(Session->windowAddedLocked)会将window的数量加1.
page15
这里我们关注一下SurfaceSession对象的创建, SurfaceSession类的构造函数的定义如下:
1 public SurfaceSession() {
2 mNativeClient = nativeCreate();
3 }
第2行(SurfaceSession->SurfaceSession)会调用nativeCreate函数, nativeCreate函数的定义如下:
private static native int nativeCreate();
这是个native函数, 最终会调用android_view_surfaceSession.cpp中的nativeCreate函数, android_view_surfaceSession.cpp中的nativeCreate函数的定义如下:
1 static jint nativeCreate(JNIEnv* env, jclass clazz) {
2 SurfaceComposerClient* client = new SurfaceComposerClient();
3 client->incStrong(clazz);
4 return reinterpret_cast<jint>(client);
5 }
我靠, 我靠, 我靠!看到了吧, 第三行(android_view_surfaceSession.cpp::nativeCreate)会创建一个SurfaceComposerClient, 是不是很熟悉.
WindowManagerService的getDisplayContentLocked函数的定义如下:
1 public DisplayContent getDisplayContentLocked(final int displayId) {
2 DisplayContent displayContent = mDisplayContents.get(displayId);
3 if (displayContent == null) {
4 final Display display = mDisplayManager.getDisplay(displayId);
5 if (display != null) {
6 displayContent = new DisplayContent(display);
7 mDisplayContents.put(displayId, displayContent);
8 }
9 }
10 return displayContent;
11 }
getDisplayContentLocked函数的逻辑还是比较简单的.
page12
在这篇文章里, 我们分析一下WindowState的创建过程.
WindowState类的定义如下:
final class WindowState implements WindowManagerPolicy.WindowState
WindowState类的定义如下:
1 WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
2 WindowState attachedWindow, int seq, WindowManager.LayoutParams a,
3 int viewVisibility, final DisplayContent displayContent) {
4 mService = service;
5 mSession = s;
6 mClient = c;
7 mToken = token;
8 mOwnerUid = s.mUid;
9 mAttrs.copyFrom(a);
10 mViewVisibility = viewVisibility;
11 mDisplayContent = displayContent;
12 mPolicy = mService.mPolicy;
13 mContext = mService.mContext;
14 DeathRecipient deathRecipient = new DeathRecipient();
15 mSeq = seq;
16 mEnforceSizeCompat = (mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0;
17 if (WindowManagerService.localLOGV) Slog.v(
18 TAG, "Window " + this + " client=" + c.asBinder()
19 + " token=" + token + " (" + mAttrs.token + ")" + " params=" + a);
20 try {
21 c.asBinder().linkToDeath(deathRecipient, 0);
22 } catch (RemoteException e) {
23 mDeathRecipient = null;
24 mAttachedWindow = null;
25 mLayoutAttached = false;
26 mIsImWindow = false;
27 mIsWallpaper = false;
28 mIsFloatingLayer = false;
29 mBaseLayer = 0;
30 mSubLayer = 0;
31 mInputWindowHandle = null;
32 mWinAnimator = null;
33 return;
34 }
35 mDeathRecipient = deathRecipient;
36
37 if ((mAttrs.type >= FIRST_SUB_WINDOW &&
38 mAttrs.type <= LAST_SUB_WINDOW)) {
39 // The multiplier here is to reserve space for multiple
40 // windows in the same type layer.
41 mBaseLayer = mPolicy.windowTypeToLayerLw(
42 attachedWindow.mAttrs.type) * WindowManagerService.TYPE_LAYER_MULTIPLIER
43 + WindowManagerService.TYPE_LAYER_OFFSET;
44 mSubLayer = mPolicy.subWindowTypeToLayerLw(a.type);
45 mAttachedWindow = attachedWindow;
46 if (WindowManagerService.DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + this + " to " + mAttachedWindow);
47 mAttachedWindow.mChildWindows.add(this);
48 mLayoutAttached = mAttrs.type !=
49 WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
50 mIsImWindow = attachedWindow.mAttrs.type == TYPE_INPUT_METHOD
51 || attachedWindow.mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
52 mIsWallpaper = attachedWindow.mAttrs.type == TYPE_WALLPAPER;
53 mIsFloatingLayer = mIsImWindow || mIsWallpaper;
54 } else {
55 // The multiplier here is to reserve space for multiple
56 // windows in the same type layer.
57 mBaseLayer = mPolicy.windowTypeToLayerLw(a.type)
58 * WindowManagerService.TYPE_LAYER_MULTIPLIER
59 + WindowManagerService.TYPE_LAYER_OFFSET;
60 mSubLayer = 0;
61 mAttachedWindow = null;
62 mLayoutAttached = false;
63 mIsImWindow = mAttrs.type == TYPE_INPUT_METHOD
64 || mAttrs.type == TYPE_INPUT_METHOD_DIALOG;
65 mIsWallpaper = mAttrs.type == TYPE_WALLPAPER;
66 mIsFloatingLayer = mIsImWindow || mIsWallpaper;
67 }
68
69 WindowState appWin = this;
70 while (appWin.mAttachedWindow != null) {
71 appWin = appWin.mAttachedWindow;
72 }
73 WindowToken appToken = appWin.mToken;
74 while (appToken.appWindowToken == null) {
75 WindowToken parent = mService.mTokenMap.get(appToken.token);
76 if (parent == null || appToken == parent) {
77 break;
78 }
79 appToken = parent;
80 }
81 mRootToken = appToken;
82 mAppToken = appToken.appWindowToken;
83
84 mWinAnimator = new WindowStateAnimator(this);
85 mWinAnimator.mAlpha = a.alpha;
86
87 mRequestedWidth = 0;
88 mRequestedHeight = 0;
89 mLastRequestedWidth = 0;
90 mLastRequestedHeight = 0;
91 mXOffset = 0;
92 mYOffset = 0;
93 mLayer = 0;
94 mInputWindowHandle = new InputWindowHandle(
95 mAppToken != null ? mAppToken.mInputApplicationHandle : null, this,
96 displayContent.getDisplayId());
97 }
第6行(WindowState->WindowState)会将IWindow接口保存到成员变量mClient中去.
page13
WindowState的attach函数的定义如下:
1 void attach() {
2 if (WindowManagerService.localLOGV) Slog.v(
3 TAG, "Attaching " + this + " token=" + mToken
4 + ", list=" + mToken.windows);
5 mSession.windowAddedLocked();
6 }
第5行(WindowState->attach)会调用Session的windowAddedLocked函数, 关于Session的windowAddedLocked函数的详细分析可以参考page14文件.
page14
这里我们分析一下Session的windowAddedLocked函数的实现, Session的windowAddedLocked函数的定义如下:
1 void windowAddedLocked() {
2 if (mSurfaceSession == null) {
3 if (WindowManagerService.localLOGV) Slog.v(
4 WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession");
5 mSurfaceSession = new SurfaceSession();
6 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
7 WindowManagerService.TAG, " NEW SURFACE SESSION " + mSurfaceSession);
8 mService.mSessions.add(this);
9 }
10 mNumWindow++;
11 }
第2行(Session->windowAddedLocked)判断是否已经创建过SurfaceSession, 如果是就不用在创建了. 由此可知, 每一个Activity都对应有一个SurfaceSession对象.
第5行(Session->windowAddedLocked)会创建一个SurfaceSession对象, 关于SurfaceSession对象的创建过程可以参考page15文件.
第8行(Session->windowAddedLocked)会将本Session加入到mService.mSessions中去, mService.mSessions的定义如下:
final HashSet<Session> mSessions = new HashSet<Session>();
mSessions保存着当前活跃的连接
最后, 第10行(Session->windowAddedLocked)会将window的数量加1.
page15
这里我们关注一下SurfaceSession对象的创建, SurfaceSession类的构造函数的定义如下:
1 public SurfaceSession() {
2 mNativeClient = nativeCreate();
3 }
第2行(SurfaceSession->SurfaceSession)会调用nativeCreate函数, nativeCreate函数的定义如下:
private static native int nativeCreate();
这是个native函数, 最终会调用android_view_surfaceSession.cpp中的nativeCreate函数, android_view_surfaceSession.cpp中的nativeCreate函数的定义如下:
1 static jint nativeCreate(JNIEnv* env, jclass clazz) {
2 SurfaceComposerClient* client = new SurfaceComposerClient();
3 client->incStrong(clazz);
4 return reinterpret_cast<jint>(client);
5 }
我靠, 我靠, 我靠!看到了吧, 第三行(android_view_surfaceSession.cpp::nativeCreate)会创建一个SurfaceComposerClient, 是不是很熟悉.
发表评论
-
Activity与WindowManagerService连接的过程(二)
2018-04-16 16:36 705page6 WindowManagerGlobal的getW ... -
Activity与WindowManagerService连接的过程(一)
2018-04-16 16:21 954page1 Activity组件在 ... -
Activity的ViewRoot的创建过程(三)
2017-11-06 14:25 706page7 在这篇文章里, 我们分析一下W类的构造过程. W ... -
Activity的ViewRoot的创建过程(二)
2017-11-06 14:29 869page4 我们看一下ViewRootImpl对象的创 ... -
Activity的ViewRoot的创建过程(一)
2017-11-06 14:27 1026page1 当一个Activity第一次激活的时候会为该Ac ... -
Activity的Window和WindowManager的创建过程(三)
2017-07-05 11:49 1298page9 在这里我们分析一下DisplayManager的 ... -
Activity的Window和WindowManager的创建过程(二)
2017-07-05 11:31 498page5 在这篇文章中, 我们分析一下ContextImp ... -
Activity的Window和WindowManager的创建过程(一)
2017-07-05 11:27 575page1 我们开始分析一下Activity的Window和 ... -
Acitivy创建Context的过程(二)
2017-06-21 14:11 451page4 在这里我们分析一下ContextImpl的ini ... -
Acitivy创建Context的过程(一)
2017-06-21 14:15 585page1 从本篇文章开始,我们分析一下Activity创建 ... -
应用程序进程与SurfaceFlinger的连接过程
2017-06-21 11:49 1024我们从SurfaceComposerClient对象的创建开始 ... -
Android源码之SurfaceFlinger的启动(三)
2017-04-20 11:09 1003page11 我们来看一下SurfaceFlinger ... -
Android源码之SurfaceFlinger的启动(二)
2017-04-18 15:15 812page6 我们看一下Thread的run函数的实现: ... -
Android源码之SurfaceFlinger的启动(一)
2017-04-17 10:07 908page1 在Android系统中, 显示系统在底层是通过S ... -
Android源码之Zygote
2015-12-15 11:45 481当ActivityManagerService启动一个应用程序 ... -
Android源码之Binder(五)
2015-12-04 09:19 1415Service组件在启动时,需要将自己注册到Service M ... -
Android源码之Binder(四)
2015-12-04 09:18 1803case BINDER_SET_MAX_THREADS: ... -
Android源码之Binder(三)
2015-12-04 09:17 881{ int ret; struct binder_pr ... -
Android源码之Binder(二)
2015-12-04 09:15 502分析完Binder驱动程序的打开和内存分配的过程之后,我们看一 ... -
Android源码之Binder(一)
2015-12-04 09:12 962在Android系统中,进程间通信使用的是Binder机制。B ...
相关推荐
WindowManagerService详解图
animations in WindowManagerService翻译的结果
Activity,Window,DecorView,ViewRootImpl,WindowManager,WindowManagerImpl,WindowManagerGlobal,WindowManagerService相关类图
深入理解WindowManagerService笔记
与Activity类似,Android系统中的窗口也是以堆栈的形式组织在WindowManagerService服务中的,其中,Z轴位置较低的窗口位于Z轴位置较高的窗口的下面。在本文中,我们就详细分析WindowManagerService服务是如何以堆栈...
有关4.0按键的处理流程,包括windowmanagerservice的激动启动等
Android系统采用一种称为Surface的UI架构为应用程序提供用户...这个PPT讲Android应用程序的Surface机制,阐述Activity、Window和View的关系,以及应用程序、WindowManagerService和SurfaceFlinger协作完成UI渲染的过程
DecorView通过PhoneWindow与WindowManagerService通信原理图 每个Activity都有一个Window对象,这个对象是PhoneWindow类型的。 每个Window对象里面都维护着一个WindowManager对象。 Activity里面添加一个View是通过...
悬浮窗,大家应该也不陌生,凌驾于应用之上的一个小弹窗,实现上很简单,就是添加一个系统级别的窗口,Android中通过WindowManagerService( WMS)来管理所有的窗口,对于WMS来说,管你是Activity、Toast、Dialog,...
这个PPT讲Android应用程序进程的启动和回收,主要涉及到Zygote进程、System Server进程,以及组件管理服务ActivityManagerService、窗口服务WindowManagerService,还有专用驱动Low Memory Killer。通过了解Android...
WindowManagerService.java : 作为应用与IMS的通信桥梁, 也作为InputDispatcher向AMS报告ANR的通信桥梁. ActivityManagerService.java :ANR 处理. Activity & Views :接收输入事件并处理.
创建一个Window,需要通过WindowManager即可完成,WindowManager是外界访问Window的入口,Window具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC的过程。Android中,所有...
系统服务是Android中非常重要的一部分, 像ActivityManagerService, PackageManagerService, WindowManagerService, 这些系统服务都是Framework层的关键服务, 本篇文章主要讲一下如何基于Android源码添加一个系统服务...
从上图可以看出,Android的显示系统分为3层:UI框架层:负责管理窗口中View组件的布局与绘制以及响应用户输入事件WindowManagerService
Android 事件捕捉和处理流程分析 ,在Android系统中,键盘按键事件是由WindowManagerService服务来管理的,然后再以消息的形式来分发给应用程序处理,不过和普通消息不一样,它是由硬件中断触发的;在上一篇文章...
Android控件TextView的实现...实际上,每一个视图都是一个控件,这些控制可以将自己的UI绘制在窗口的绘图表面上,同时还可以与用户进行交互,即获得用户的键盘或者触摸屏输入。在本文中,我们就详细分析窗口控件的上