3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析

發(fā)布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章轉(zhuǎn)載至CSDN社區(qū)羅升陽的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8570428

通過前面幾篇文章的學(xué)習(xí),我們知道了在 Android系統(tǒng)中,無論是普通的Activity窗口,還是特殊的輸入法窗口和壁紙窗口,它們都是被WindowManagerService服務(wù)組 織在一個窗口堆棧中的,其中,Z軸位置較大的窗口排列在Z軸位置較小的窗口的上面。有了這個窗口堆棧之后,WindowManagerService服務(wù) 就可以按照一定的規(guī)則計算每一個窗口的Z軸位置了,本文就詳細(xì)分析這個計算過程。

? ? ? ? 基于窗口堆棧來計算窗口的Z軸位置是比較有意思的。按照一般的理解,應(yīng)該是先計算好窗口的Z軸位置,然后再按照Z軸位置的大小來將各個窗口排列在堆棧中。 但是,事實(shí)上,窗口是按照其它規(guī)則排列在堆棧中。這些規(guī)則與窗口的類型、創(chuàng)建順序和運(yùn)行狀態(tài)等有關(guān)。例如,狀態(tài)欄窗口總是位于堆棧的頂端,輸入法窗口總是 位于需要輸入法的窗口的上面,而壁紙窗口總是位于需要顯示壁紙的窗口的下面。又如,當(dāng)一個Activity組件從后臺激活到前臺時,與它所對應(yīng)的窗口就會 被相應(yīng)地移動到窗口堆棧的上面去。

? ? ? ? 從前面Android應(yīng)用程序與SurfaceFlinger服務(wù)的關(guān)系概述和學(xué)習(xí)計劃和Android系統(tǒng)Surface機(jī)制的SurfaceFlinger服務(wù)簡要介紹和學(xué)習(xí)計劃這 兩個系列的文章可以知道,窗口的UI最終是需要通過SurfaceFlinger服務(wù)來統(tǒng)一渲染的,而SurfaceFlinger服務(wù)在渲染窗口的UI 之前,需要計算基于各個窗口的Z軸位置來計算它們的可見區(qū)域。因此,WindowManagerService服務(wù)計算好每一個窗口的Z軸位置之后,還需 要將它們設(shè)置到SurfaceFlinger服務(wù)中去,以便SurfaceFlinger服務(wù)可以正確地渲染每一個窗口的UI。

? ? ? ? 上述窗口的Z軸位置計算和設(shè)置過程如圖1所示:

圖1 窗口Z軸位置的計算和設(shè)置過程

? ? ? ? 接下來,我們就首先分析兩個需要重新計算窗口Z軸位置的情景,接著再分析窗口的Z軸位置的計算過程,最后分析WindowManagerService服務(wù)將窗口的Z軸設(shè)置到SurfaceFlinger服務(wù)中去的過程。

? ? ? ? 一.?需要重新計算窗口Z軸位置的情景

? ? ? ? 這里主要分析兩個需要重新計算窗口Z軸位置的情景:應(yīng)用程序增加一個窗口到WindowManagerService服務(wù)和應(yīng)用程序請求WindowManagerService服務(wù)重新布局一個窗口。

? ? ? ??從前面Android應(yīng)用程序窗口(Activity)與WindowManagerService服務(wù)的連接過程分析一文可以知道,應(yīng)用程序請求增加一個窗口到WindowManagerService服務(wù)的時候,最終會調(diào)用到WindowManagerService類的成員函數(shù)addWindow。接下來我們就主要分析這個函數(shù)與重新計算窗口Z軸位置相關(guān)的邏輯,如下所示:

[java] view plaincopy
  1. public?class?WindowManagerService?extends?IWindowManager.Stub????
  2. ????????implements?Watchdog.Monitor?{????
  3. ????......????
  4. ????
  5. ????public?int?addWindow(Session?session,?IWindow?client,????
  6. ????????????WindowManager.LayoutParams?attrs,?int?viewVisibility,????
  7. ????????????Rect?outContentInsets,?InputChannel?outInputChannel)?{????
  8. ????????......????
  9. ????
  10. ????????synchronized(mWindowMap)?{????
  11. ????????????......????
  12. ????
  13. ????????????WindowToken?token?=?mTokenMap.get(attrs.token);?????
  14. ????????????......????
  15. ????
  16. ????????????win?=?new?WindowState(session,?client,?token,????
  17. ????????????????????attachedWindow,?attrs,?viewVisibility);????
  18. ????????????......????
  19. ????
  20. ????????????if?(attrs.type?==?TYPE_INPUT_METHOD)?{????
  21. ????????????????mInputMethodWindow?=?win;??
  22. ????????????????addInputMethodWindowToListLocked(win);??
  23. ????????????????......????
  24. ????????????}?else?if?(attrs.type?==?TYPE_INPUT_METHOD_DIALOG)?{????
  25. ????????????????mInputMethodDialogs.add(win);??
  26. ????????????????addWindowToListInOrderLocked(win,?true);??
  27. ????????????????adjustInputMethodDialogsLocked();??
  28. ????????????????......????
  29. ????????????}?else?{????
  30. ????????????????addWindowToListInOrderLocked(win,?true);????
  31. ????????????????if?(attrs.type?==?TYPE_WALLPAPER)?{????
  32. ????????????????????......????
  33. ????????????????????adjustWallpaperWindowsLocked();????
  34. ????????????????}?else?if?((attrs.flags&FLAG_SHOW_WALLPAPER)?!=?0)?{????
  35. ????????????????????adjustWallpaperWindowsLocked();????
  36. ????????????????}????
  37. ????????????}????
  38. ????????????......????
  39. ????
  40. ????????????assignLayersLocked();????
  41. ????
  42. ????????????......????
  43. ????????}????
  44. ????
  45. ????????......????
  46. ????}????
  47. ????
  48. ????......????
  49. }??????

? ? ? ??這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

? ? ? ??WindowManagerService類的成員函數(shù)addWindow的具體實(shí)現(xiàn)可以參考Android窗口管理服務(wù)WindowManagerService對壁紙窗口(Wallpaper Window)的管理分析和Android窗口管理服務(wù)WindowManagerService對輸入法窗口(Input Method Window)的管理分析這兩篇文章。我們注意到,WindowManagerService類的成員函數(shù)addWindow會根據(jù)當(dāng)前正在添加的窗口的類型來調(diào)用不同的成員函數(shù)來向窗口堆棧的合適位置插入一個WindowState對象,即:

? ? ? ? 1. 如果添加的是一個輸入法窗口,那么就調(diào)用成員函數(shù)addInputMethodWindowToListLocked將它放置在需要顯示輸入法的窗口的上面去;

? ? ? ? 2. 如果添加的是一個輸入法對話框,那么就先調(diào)用成員函數(shù)addWindowToListInOrderLocked來將它插入到窗口堆棧中,接著再調(diào)用成員 函數(shù)adjustInputMethodDialogsLocked來將它放置在輸入法窗口的上面;

? ? ? ? 3. 如果添加的是一個普通窗口,那么就直接調(diào)用成員函數(shù)addWindowToListInOrderLocked來將它插入到窗口堆棧中;

? ? ? ? 4.?如果添加的是一個普通窗口,并且這個窗口需要顯示壁紙,那么就先調(diào)用成員函數(shù)addWindowToListInOrderLocked來將它插入 到窗口堆棧中,接著再調(diào)用成員函數(shù)adjustWallpaperWindowsLocked來將壁紙窗口放置在它的下面。

? ? ? ? 5.?如果添加的是一個壁紙窗口,那么就先調(diào)用成員函數(shù)addWindowToListInOrderLocked來將它插入到窗口堆棧中,接著再調(diào)用成 員函數(shù)adjustWallpaperWindowsLocked來將它放置在需要顯示壁紙的窗口的下面。

? ? ? ? 無論如何,WindowManagerService類的成員函數(shù)addWindow最終都會調(diào)用成員函數(shù)assignLayersLocked來重新計算系統(tǒng)中所有窗口的Z軸位置,這是因?yàn)榍懊嫱翱诙褩T黾恿艘粋€新的窗口。

? ? ? ??從前面Android窗口管理服務(wù)WindowManagerService計算Activity窗口大小的過程分析一 文可以知道,應(yīng)用程序進(jìn)程請求WindowManagerService服務(wù)重新布局一個窗口的時候,最終會調(diào)用到 WindowManagerService類的成員函數(shù)relayoutWindow。接下來我們就主要分析這個函數(shù)與重新計算窗口Z軸位置相關(guān)的邏輯, 如下所示:

[java] view plaincopy
  1. public?class?WindowManagerService?extends?IWindowManager.Stub??????????
  2. ????????implements?Watchdog.Monitor?{????????
  3. ????......??????
  4. ??????
  5. ????public?int?relayoutWindow(Session?session,?IWindow?client,??????
  6. ????????????WindowManager.LayoutParams?attrs,?int?requestedWidth,??????
  7. ????????????int?requestedHeight,?int?viewVisibility,?boolean?insetsPending,??????
  8. ????????????Rect?outFrame,?Rect?outContentInsets,?Rect?outVisibleInsets,??????
  9. ????????????Configuration?outConfig,?Surface?outSurface)?{??????
  10. ????????......??????
  11. ??????
  12. ????????synchronized(mWindowMap)?{??????
  13. ????????????WindowState?win?=?windowForClientLocked(session,?client,?false);??????
  14. ????????????......??????
  15. ??????
  16. ????????????int?attrChanges?=?0;??????
  17. ????????????int?flagChanges?=?0;??????
  18. ????????????if?(attrs?!=?null)?{??????
  19. ????????????????flagChanges?=?win.mAttrs.flags?^=?attrs.flags;??????
  20. ????????????????attrChanges?=?win.mAttrs.copyFrom(attrs);??????
  21. ????????????}??????
  22. ????????????......??????
  23. ??????
  24. ????????????boolean?imMayMove?=?(flagChanges&(??????
  25. ????????????????????WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM?|??????
  26. ????????????????????WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE))?!=?0;??????
  27. ??????
  28. ????????????boolean?focusMayChange?=?win.mViewVisibility?!=?viewVisibility??????
  29. ????????????????????||?((flagChanges&WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)?!=?0)??????
  30. ????????????????????||?(!win.mRelayoutCalled);??????
  31. ??
  32. ????????????boolean?wallpaperMayMove?=?win.mViewVisibility?!=?viewVisibility??
  33. ????????????????????&&?(win.mAttrs.flags?&?FLAG_SHOW_WALLPAPER)?!=?0;??
  34. ????????????......??????
  35. ??????
  36. ??????
  37. ????????????if?(focusMayChange)?{??????
  38. ????????????????......??????
  39. ????????????????if?(updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES))?{??????
  40. ????????????????????imMayMove?=?false;??????
  41. ????????????????}??????
  42. ????????????????......??????
  43. ????????????}??????
  44. ??????
  45. ????????????//?updateFocusedWindowLocked()?already?assigned?layers?so?we?only?need?to??????
  46. ????????????//?reassign?them?at?this?point?if?the?IM?window?state?gets?shuffled??????
  47. ????????????boolean?assignLayers?=?false;??????
  48. ??????
  49. ????????????if?(imMayMove)?{??????
  50. ????????????????if?(moveInputMethodWindowsIfNeededLocked(false)?||?displayed)?{??????
  51. ????????????????????//?Little?hack?here?--?we?-should-?be?able?to?rely?on?the??????
  52. ????????????????????//?function?to?return?true?if?the?IME?has?moved?and?needs??????
  53. ????????????????????//?its?layer?recomputed.??However,?if?the?IME?was?hidden??????
  54. ????????????????????//?and?isn't?actually?moved?in?the?list,?its?layer?may?be??????
  55. ????????????????????//?out?of?data?so?we?make?sure?to?recompute?it.??????
  56. ????????????????????assignLayers?=?true;??????
  57. ????????????????}??????
  58. ????????????}??
  59. ????????????if?(wallpaperMayMove)?{??
  60. ????????????????if?((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED)?!=?0)?{??
  61. ????????????????????assignLayers?=?true;??
  62. ????????????????}??
  63. ????????????}??????
  64. ????????????......??????
  65. ??????
  66. ????????????if?(assignLayers)?{??????
  67. ????????????????assignLayersLocked();??????
  68. ????????????}??????
  69. ??????
  70. ????????????......??????
  71. ????????}??????
  72. ??????
  73. ????????......??????
  74. ??????
  75. ????????return?(inTouchMode???WindowManagerImpl.RELAYOUT_IN_TOUCH_MODE?:?0)??????
  76. ????????????????|?(displayed???WindowManagerImpl.RELAYOUT_FIRST_TIME?:?0);??????
  77. ????}??????
  78. ??????
  79. ????......??????
  80. }??????

? ? ? ??這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

? ? ? ??WindowManagerService類的成員函數(shù)relayoutWindow具體實(shí)現(xiàn)可以參考Android窗口管理服務(wù)WindowManagerService對壁紙窗口(Wallpaper Window)的管理分析和Android窗口管理服務(wù)WindowManagerService對輸入法窗口(Input Method Window)的管理分析這兩篇文章,與窗口Z軸位置計算相關(guān)的邏輯大概是這樣的:

? ? ? ? 1. 如果系統(tǒng)當(dāng)前獲得焦點(diǎn)的窗口可能發(fā)生了變化,那么就會調(diào)用成員函數(shù)updateFocusedWindowLocked來重新計算系統(tǒng)當(dāng)前應(yīng)該獲得焦點(diǎn)的 窗口。如果系統(tǒng)當(dāng)前獲得焦點(diǎn)的窗口真的發(fā)生了變化,即窗口堆棧的窗口排列發(fā)生了變化,那么在調(diào)用成員函數(shù) updateFocusedWindowLocked的時候,就會調(diào)用成員函數(shù)assignLayersLocked來重新計算系統(tǒng)中所有窗口的Z軸位 置。

? ? ? ? 2. 如果系統(tǒng)中的輸入法窗口可能需要移動,那么就會調(diào)用成員函數(shù)moveInputMethodWindowsIfNeededLocked來檢查是否真的需 要移動輸入法窗口。如果需要移動,那么成員函數(shù)moveInputMethodWindowsIfNeededLocked的返回值就會等于true,這 時候就說明輸入法窗口在窗口堆棧中的位置發(fā)生了變化,因此,就會將變量assignLayers的值設(shè)置為true,表示接下來需要重新計算系統(tǒng)中所有窗 口的Z軸位置。

? ? ? ? 3. 如果當(dāng)前正在請求調(diào)整其布局的窗口是由不可見變化可見的,即變量displayed的值等于true,那么接下來也是需要重新計算系統(tǒng)中所有窗口的Z軸位置的,因此,就會將assignLayers的值設(shè)置為true。

? ? ? ? 4.?如果系統(tǒng)中的壁紙窗口可能需要移動,那么就會調(diào)用成員函數(shù)adjustWallpaperWindowsLocked來檢查是否真的需要移動壁紙窗 口。如果需要移動,那么成員函數(shù)adjustWallpaperWindowsLocked的返回值的 ADJUST_WALLPAPER_LAYERS_CHANGED位就會等于1,這時候就說明壁紙窗口在窗口堆棧中的位置發(fā)生了變化,因此,就會將變量 assignLayers的值設(shè)置為true,表示接下來需要重新計算系統(tǒng)中所有窗口的Z軸位置。

? ? ? ? 經(jīng)過上述的一系列操作后,如果得到的變量assignLayers的值設(shè)置等于true,那么WindowManagerService類的成員函數(shù) relayoutWindow就會調(diào)用成員函數(shù)assignLayersLocked來重新計算系統(tǒng)中所有窗口的Z軸位置。

? ? ? ? 二.?計算系統(tǒng)中所有窗口的Z軸位置

? ? ? ? 從前面第一部分的內(nèi)容可以知道,一旦窗口堆棧中的窗口發(fā)生了變化,那么WindowManagerService類的成員函數(shù)assignLayersLocked就會調(diào)用來計算系統(tǒng)中所有窗口的Z軸位置。

? ? ? ? 窗口的Z軸位置除了與它在窗口堆棧中的位置有關(guān)之外,還與窗口的類型有關(guān)。窗口的類型在創(chuàng)建的時候就已經(jīng)是確定了 的,WindowManagerService服務(wù)在為它創(chuàng)建一個WindowState對象的時候,就會根據(jù)它的類型得到一個BaseLayer值,這 個BaseLayer值在計算它的Z軸位置的時候會用到。

? ? ? ? 接下來我們就通過WindowState類的構(gòu)造函數(shù)來分析一個窗口的BaseLayer值是如何確定的,如下所示:

[java] view plaincopy
  1. public?class?WindowManagerService?extends?IWindowManager.Stub??
  2. ????????implements?Watchdog.Monitor?{??
  3. ????......??
  4. ??
  5. ????/**?How?much?to?multiply?the?policy's?type?layer,?to?reserve?room?
  6. ?????*?for?multiple?windows?of?the?same?type?and?Z-ordering?adjustment?
  7. ?????*?with?TYPE_LAYER_OFFSET.?*/??
  8. ????static?final?int?TYPE_LAYER_MULTIPLIER?=?10000;??
  9. ??
  10. ????/**?Offset?from?TYPE_LAYER_MULTIPLIER?for?moving?a?group?of?windows?above?
  11. ?????*?or?below?others?in?the?same?layer.?*/??
  12. ????static?final?int?TYPE_LAYER_OFFSET?=?1000;??
  13. ????......??
  14. ??
  15. ????private?final?class?WindowState?implements?WindowManagerPolicy.WindowState?{??
  16. ????????......??
  17. ??
  18. ????????final?int?mBaseLayer;??
  19. ????????final?int?mSubLayer;??
  20. ????????......??
  21. ??
  22. ????????WindowState(Session?s,?IWindow?c,?WindowToken?token,??
  23. ???????????????WindowState?attachedWindow,?WindowManager.LayoutParams?a,??
  24. ???????????????int?viewVisibility)?{??
  25. ????????????......??
  26. ??
  27. ????????????if?((mAttrs.type?>=?FIRST_SUB_WINDOW?&&??
  28. ????????????????????mAttrs.type?<=?LAST_SUB_WINDOW))?{??
  29. ????????????????//?The?multiplier?here?is?to?reserve?space?for?multiple??
  30. ????????????????//?windows?in?the?same?type?layer.??
  31. ????????????????mBaseLayer?=?mPolicy.windowTypeToLayerLw(??
  32. ????????????????????????attachedWindow.mAttrs.type)?*?TYPE_LAYER_MULTIPLIER??
  33. ????????????????????????+?TYPE_LAYER_OFFSET;??
  34. ????????????????mSubLayer?=?mPolicy.subWindowTypeToLayerLw(a.type);??
  35. ????????????????......??
  36. ????????????}?else?{??
  37. ????????????????//?The?multiplier?here?is?to?reserve?space?for?multiple??
  38. ????????????????//?windows?in?the?same?type?layer.??
  39. ????????????????mBaseLayer?=?mPolicy.windowTypeToLayerLw(a.type)??
  40. ????????????????????????*?TYPE_LAYER_MULTIPLIER??
  41. ????????????????????????+?TYPE_LAYER_OFFSET;??
  42. ????????????????mSubLayer?=?0;??
  43. ????????????????......??
  44. ????????????}??
  45. ??
  46. ????????????......??
  47. ????????}??
  48. ??
  49. ????????......??
  50. ????}??
  51. ??
  52. ????......??
  53. }??

? ? ? ??這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

? ? ? ??一個窗口除了有一個BaseLayer值之外,還有一個SubLayer值,分別保存在一個對應(yīng)的WindowState對象的成員變量mBaseLayer和mSubLayer。SubLayer值是用來描述一個窗口是否是另外一個窗口的子窗口的。

? ? ? ? 假設(shè)一個窗口是另外一個窗口的子窗口,那么參數(shù)attachedWindow所描述的窗口就是父窗口,這時候子窗口的BaseLayer值就等于父窗口的BaseLayer值,而SubLayer值要么大于0,要么小于0,這與它自己的具體類型有關(guān)。

? ? ? ??假設(shè)一個窗口不是另外一個窗口的子窗口,那么這個窗口的BaseLayer值就與它自己的具體類型有關(guān),而SubLayer值就等于0。

? ? ? ? 現(xiàn)在的關(guān)鍵就是要根據(jù)窗口的類型來計算它的BaseLayer值和SubLayer值,它們分別是通過調(diào)用WindowManagerService類的 成員變量mPolicy所指向的一個PhoneWindowManager對象的成員函數(shù)windowTypeToLayerLw和 subWindowTypeToLayerLw來計算得到的。這里有兩個地方是需要注意的。

? ? ? ? 第一個地方是PhoneWindowManager對象的成員函數(shù)windowTypeToLayerLw的返回值并且不是一個窗口的最終的 BaseLayer值,而是要將它的返回值乘以一個常量TYPE_LAYER_MULTIPLIER,再加上另外一個常量 TYPE_LAYER_OFFSET之后,才得到最終的BaseLayer值。這是因?yàn)樵贏ndroid系統(tǒng)中,相同類型的窗口的Z軸位置都是有著相同的 值域,而不同類型的窗口的Z軸位置都是處于兩個不相交的值域。例如,假設(shè)有兩種不同類型的窗口,它們的Z軸位置的值域分別為[a, b]和[c, d],那么[a, b]和[c, d]的交集一定等于空。又由于每一種類型的窗口的數(shù)量是不確定的,因此,WindowManagerService服務(wù)就需要為每一種類型的窗口都預(yù)留一 個范圍足夠大的值域,以便可以滿足要求。

? ? ? ?WindowManagerService服務(wù)是如何為類型相同的窗口的Z軸位置預(yù)留一個范圍足夠大的值域的呢?我們假設(shè)類型為t的窗口的Z軸位置的值 域?yàn)閇a, b],并且以t為參數(shù)調(diào)用PhoneWindowManager對象的成員函數(shù)windowTypeToLayerLw的返回值為T,那么a的值就等于T *?TYPE_LAYER_MULTIPLIER +?TYPE_LAYER_OFFSET,而b的值就等于(T - 1) *?TYPE_LAYER_MULTIPLIER +?TYPE_LAYER_OFFSET - 1,即從T *?TYPE_LAYER_MULTIPLIER +?TYPE_LAYER_OFFSET開始,一共預(yù)留了TYPE_LAYER_MULTIPLIER個值作為類型為t窗口的Z軸位置。由于 TYPE_LAYER_MULTIPLIER的值定義為10000,而TYPE_LAYER_OFFSET的值定義為1000,因此,每一種類型的窗口都 預(yù)留有一個足夠大的值域來作為Z軸位置。

? ? ? ?第二個地方是窗口的SubLayer值并不直接參與窗口的Z軸位置的計算,但是它會影響到窗口在窗口堆棧的位置。接下來我們就會看到,窗口在窗口堆棧的位置是會影響到它的Z軸位置的計算的,因此,窗口的SubLayer間接地參與了窗口的Z軸位置的計算。

? ? ? ?窗口的SubLayer值是如何影響到窗口在窗口堆棧的位置的呢?在前面Android窗口管理服務(wù)WindowManagerService對窗口的組織方式分析一 文中,在分析WindowManagerService類的成員函數(shù)addWindowToListInOrderLocked的實(shí)現(xiàn)時提到,如果一個窗 口是另外一個窗口的子窗口,那么當(dāng)它的SubLayer值小于0的時候,它就會位于父窗口的下面,否則的話,就會位于父窗口的上面。

? ? ? ?在繼續(xù)分析WindowManagerService類的成員函數(shù)assignLayersLocked之前,我們首先分析 PhoneWindowManager類的成員函數(shù)windowTypeToLayerLw和subWindowTypeToLayerLw的實(shí)現(xiàn),以便 可以了解一個窗口的BaseLayer值和SubLayer值是如何確定的。

? ? ? ?PhoneWindowManager類的成員函數(shù)windowTypeToLayerLw的實(shí)現(xiàn)如下所示:

[java] view plaincopy
  1. public?class?PhoneWindowManager?implements?WindowManagerPolicy?{??
  2. ????......??
  3. ??
  4. ????public?int?windowTypeToLayerLw(int?type)?{??
  5. ????????if?(type?>=?FIRST_APPLICATION_WINDOW?&&?type?<=?LAST_APPLICATION_WINDOW)?{??
  6. ????????????return?APPLICATION_LAYER;??
  7. ????????}??
  8. ????????switch?(type)?{??
  9. ????????case?TYPE_STATUS_BAR:??
  10. ????????????return?STATUS_BAR_LAYER;??
  11. ????????case?TYPE_STATUS_BAR_PANEL:??
  12. ????????????return?STATUS_BAR_PANEL_LAYER;??
  13. ????????case?TYPE_SYSTEM_DIALOG:??
  14. ????????????return?SYSTEM_DIALOG_LAYER;??
  15. ????????case?TYPE_SEARCH_BAR:??
  16. ????????????return?SEARCH_BAR_LAYER;??
  17. ????????case?TYPE_PHONE:??
  18. ????????????return?PHONE_LAYER;??
  19. ????????case?TYPE_KEYGUARD:??
  20. ????????????return?KEYGUARD_LAYER;??
  21. ????????case?TYPE_KEYGUARD_DIALOG:??
  22. ????????????return?KEYGUARD_DIALOG_LAYER;??
  23. ????????case?TYPE_SYSTEM_ALERT:??
  24. ????????????return?SYSTEM_ALERT_LAYER;??
  25. ????????case?TYPE_SYSTEM_ERROR:??
  26. ????????????return?SYSTEM_ERROR_LAYER;??
  27. ????????case?TYPE_INPUT_METHOD:??
  28. ????????????return?INPUT_METHOD_LAYER;??
  29. ????????case?TYPE_INPUT_METHOD_DIALOG:??
  30. ????????????return?INPUT_METHOD_DIALOG_LAYER;??
  31. ????????case?TYPE_SYSTEM_OVERLAY:??
  32. ????????????return?SYSTEM_OVERLAY_LAYER;??
  33. ????????case?TYPE_SECURE_SYSTEM_OVERLAY:??
  34. ????????????return?SECURE_SYSTEM_OVERLAY_LAYER;??
  35. ????????case?TYPE_PRIORITY_PHONE:??
  36. ????????????return?PRIORITY_PHONE_LAYER;??
  37. ????????case?TYPE_TOAST:??
  38. ????????????return?TOAST_LAYER;??
  39. ????????case?TYPE_WALLPAPER:??
  40. ????????????return?WALLPAPER_LAYER;??
  41. ????????}??
  42. ????????Log.e(TAG,?"Unknown?window?type:?"?+?type);??
  43. ????????return?APPLICATION_LAYER;??
  44. ????}??
  45. ??
  46. ????......??
  47. }??

? ? ? ?這個函數(shù)定義在frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java文件中。

? ? ? ?從這里就可以看出,每一種窗口類型type都對應(yīng)有一個BaseLayer值,即每一個TYPE_XXX值都對應(yīng)有一個XXX_LAYER值,其 中,TYPE_XXX值定義在WindowManager.LayoutParams類中,而XXX_LAYER值就定義在 PhoneWindowManager類中,它們的對應(yīng)關(guān)系如圖2所示:

圖2 窗口類型與窗口BaseLayer值的對應(yīng)關(guān)系

? ? ? ?注意,如果參數(shù)type的值小于FIRST_APPLICATION_WINDOW,或者大于LAST_APPLICATION_WINDOW,或者不 是圖2列出來的其中一個值,那么PhoneWindowManager類的成員函數(shù)windowTypeToLayerLw就會返回一個 APPLICATION_LAYER(2)值給調(diào)用者。

? ? ? ?PhoneWindowManager類的成員函數(shù)subWindowTypeToLayerLw的實(shí)現(xiàn)如下所示:

[java] view plaincopy
  1. public?class?PhoneWindowManager?implements?WindowManagerPolicy?{??
  2. ????......??
  3. ??
  4. ????public?int?subWindowTypeToLayerLw(int?type)?{??
  5. ????????switch?(type)?{??
  6. ????????case?TYPE_APPLICATION_PANEL:??
  7. ????????case?TYPE_APPLICATION_ATTACHED_DIALOG:??
  8. ????????????return?APPLICATION_PANEL_SUBLAYER;??
  9. ????????case?TYPE_APPLICATION_MEDIA:??
  10. ????????????return?APPLICATION_MEDIA_SUBLAYER;??
  11. ????????case?TYPE_APPLICATION_MEDIA_OVERLAY:??
  12. ????????????return?APPLICATION_MEDIA_OVERLAY_SUBLAYER;??
  13. ????????case?TYPE_APPLICATION_SUB_PANEL:??
  14. ????????????return?APPLICATION_SUB_PANEL_SUBLAYER;??
  15. ????????}??
  16. ????????Log.e(TAG,?"Unknown?sub-window?type:?"?+?type);??
  17. ????????return?0;??
  18. ????}??
  19. ??
  20. ????......??
  21. }??

? ? ? ??這個函數(shù)定義在frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java文件中。

? ? ? ??從這里就可以看出,只有類型為TYPE_APPLICATION_PANEL、TYPE_APPLICATION_MEDIA、 TYPE_APPLICATION_MEDIA_OVERLAY和TYPE_APPLICATION_SUB_PANEL的窗口才對應(yīng)有一個 SubLayer值,它們的對應(yīng)關(guān)系如圖3所示:

圖3 窗口類型與窗口SubLayer值的對應(yīng)關(guān)系

? ? ? ? 在圖3中,TYPE_XXX值定義在WindowManager.LayoutParams類中,而XXX_LAYER值就定義在 PhoneWindowManager類中。注意,有兩種特殊的多媒體窗口TYPE_APPLICATION_MEDIA和 TYPE_APPLICATION_MEDIA_OVERLAY,它們是用來顯示多媒體的,例如,用來顯示視頻,并且它們都是附加在應(yīng)用程序窗口之上的, 但是由于它們的SubLayer值為負(fù)數(shù),因此它們實(shí)際上是位于宿主窗口之下的。類型為TYPE_APPLICATION_MEDIA的窗口有一個魔術(shù), 它會在宿主窗口里面挖一個洞,以便可以將自己顯示出來,而類型為TYPE_APPLICATION_MEDIA_OVERLAY背景一般都是透明的,位于 類型為TYPE_APPLICATION_MEDIA的窗口,可以用來顯示視頻的字幕之類的東西。實(shí)際上,類型為 TYPE_APPLICATION_MEDIA和TYPE_APPLICATION_MEDIA_OVERLAY的窗口也稱為SurfaceView。 SurfaceView很特殊,它與普通的View的最大區(qū)別就在于它們有獨(dú)立的繪圖表面,于是它們就可以在一個獨(dú)立的子線程里面進(jìn)行UI渲染。

? ? ? ? 理解了窗口的BaseLayer值和SubLayer值的計算過程之外,接下來我們就可以分析WindowManagerService類的成員函數(shù)assignLayersLocked的實(shí)現(xiàn)了,如下所示:

[java] view plaincopy
  1. public?class?WindowManagerService?extends?IWindowManager.Stub??
  2. ????????implements?Watchdog.Monitor?{??
  3. ????......??
  4. ??
  5. ????/**?How?much?to?increment?the?layer?for?each?window,?to?reserve?room?
  6. ?????*?for?effect?surfaces?between?them.?
  7. ?????*/??
  8. ????static?final?int?WINDOW_LAYER_MULTIPLIER?=?5;??
  9. ????......??
  10. ??
  11. ????private?final?void?assignLayersLocked()?{??
  12. ????????int?N?=?mWindows.size();??
  13. ????????int?curBaseLayer?=?0;??
  14. ????????int?curLayer?=?0;??
  15. ????????int?i;??
  16. ??
  17. ????????for?(i=0;?i<N;?i++)?{??
  18. ????????????WindowState?w?=?mWindows.get(i);??
  19. ????????????if?(w.mBaseLayer?==?curBaseLayer?||?w.mIsImWindow??
  20. ????????????????????||?(i?>?0?&&?w.mIsWallpaper))?{??
  21. ????????????????curLayer?+=?WINDOW_LAYER_MULTIPLIER;??
  22. ????????????????w.mLayer?=?curLayer;??
  23. ????????????}?else?{??
  24. ????????????????curBaseLayer?=?curLayer?=?w.mBaseLayer;??
  25. ????????????????w.mLayer?=?curLayer;??
  26. ????????????}??
  27. ????????????if?(w.mTargetAppToken?!=?null)?{??
  28. ????????????????w.mAnimLayer?=?w.mLayer?+?w.mTargetAppToken.animLayerAdjustment;??
  29. ????????????}?else?if?(w.mAppToken?!=?null)?{??
  30. ????????????????w.mAnimLayer?=?w.mLayer?+?w.mAppToken.animLayerAdjustment;??
  31. ????????????}?else?{??
  32. ????????????????w.mAnimLayer?=?w.mLayer;??
  33. ????????????}??
  34. ????????????if?(w.mIsImWindow)?{??
  35. ????????????????w.mAnimLayer?+=?mInputMethodAnimLayerAdjustment;??
  36. ????????????}?else?if?(w.mIsWallpaper)?{??
  37. ????????????????w.mAnimLayer?+=?mWallpaperAnimLayerAdjustment;??
  38. ????????????}??
  39. ????????????......??
  40. ????????}??
  41. ????}??
  42. ???
  43. ????......??
  44. }??

? ? ? ??這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

? ? ? ? 注意,在調(diào)用WindowManagerService類的成員函數(shù)assignLayersLocked之前,系統(tǒng)中的所有窗口在窗口堆棧中的位置都是 已經(jīng)排列好了的,這時候WindowManagerService類的成員函數(shù)assignLayersLocked就從下往上遍歷窗口堆棧,以連排列在 一起的類型相同的窗口為單位來計算每一個窗口的Z位置,即:

? ? ? ? 1. 每次遇到一個窗口,它的BaseLayer值與上一次計算的窗口的BaseLayer值不相等,就開始一個新的計算單元。

? ? ? ? 2. 在每一個計算單元中,第一個窗口的Z軸位置就等于它的BaseLayer值,而之后的每一個窗口的Z軸位置都比前一個窗口的Z軸位置大WINDOW_LAYER_MULTIPLIER。

? ? ? ? 這個窗口的Z軸位置計算方法有三個地方是需要注意的。 ? ? ? ?

? ? ? ? 第一個地方是從第2點(diǎn)可以看出,每一個窗口的Z軸位置值都不是連續(xù)的,這樣就在每兩個窗口之間都保留了一定的位置來插入其它窗口。

? ? ? ? 第二個地方是由于系統(tǒng)中所有類型相同的窗口不一定都是排列在一起的,因此,就有可能出現(xiàn)有些類型相同的窗口具有相同的Z軸位置。 WindowManagerService服務(wù)并不關(guān)心兩個不同窗口的Z軸位置是否相同,但是SurfaceFlinger服務(wù)就需要關(guān)心了,因?yàn)?SurfaceFlinger服務(wù)需要是按照Z軸從大到小的順序來計算窗口的可見性。那么SurfaceFlinger服務(wù)是如何確定兩個Z軸位置相同的 窗口的次序的呢?從前面Android應(yīng)用程序與SurfaceFlinger服務(wù)的關(guān)系概述和學(xué)習(xí)計劃和Android系統(tǒng)Surface機(jī)制的SurfaceFlinger服務(wù)簡要介紹和學(xué)習(xí)計劃這 兩個系列的文章可以知道,每一個窗口在SurfaceFlinger服務(wù)都對應(yīng)有一個Layer對象,而每一個Layer對象都有一個sequence 值,其中,先創(chuàng)建的Layer對象的sequence值大于后創(chuàng)建的Layer對象的sequence值。這樣,SurfaceFlinger服務(wù)在計算 對于兩個Z軸位置相同的窗口的可見性的時候,就會比較它們所對應(yīng)的Layer對象的sequence值,其中,sequence值大的窗口的可見性會先于 sequence值小的窗口得到計算,即先計算后創(chuàng)建的窗口的可見性,再計算先創(chuàng)建的窗口的可見性。

? ? ? ? 第三個地方是有兩種特殊的窗口,即輸入法窗口和壁紙窗口,當(dāng)它們不是窗口堆棧底部的第一個窗口時,它們所在的計算單元不是以窗口類型來劃分的,而靠近在哪 個窗口,就與哪個窗口在同一個計算單元中。當(dāng)輸入法窗口是窗口堆棧底部的第一個窗口時,它的Z軸位置就等于 WINDOW_LAYER_MULTIPLIER,而當(dāng)壁紙窗口是窗口堆棧底部的第一個窗口時,它的Z軸位置就等于它的BaseLayer值。

? ? ? ??前面計算得到的窗口的Z軸位置保存在WindowState類的成員變量mLayer中。事實(shí)上,保存在WindowState類的成員變量 mLayer中的Z軸位置還不是窗口的最終Z軸位置,因?yàn)檫€沒有考慮到窗口與窗口令牌之間的關(guān)系。每一個窗口令牌都可以設(shè)置一個Z軸調(diào)整值,而每一個窗口 要加上它所對應(yīng)的窗口令牌所設(shè)置的Z軸調(diào)整值之后,才能得到最終的Z軸位置。注意,只有類型為AppWindowToken的窗口令牌才可以設(shè)置Z軸調(diào)整 值,這個Z軸調(diào)整值就保存在AppWindowToken類的成員變量animLayerAdjustment中。

? ? ? ? 有時候,一個窗口會有一個目標(biāo)窗口。例如,輸入法窗口的目標(biāo)窗口是系統(tǒng)當(dāng)前需要顯示輸入法的窗口。在這種情況下,我們要使用目標(biāo)窗口所對應(yīng)的窗口令牌所設(shè)置的Z軸調(diào)整值來調(diào)整窗口的的Z軸位置。

? ? ? ? 那么,WindowManagerService服務(wù)是如何知道一個窗口所對應(yīng)的窗口令牌的類型是AppWindowToken,或者一個窗口有沒有目標(biāo) 窗口的呢?當(dāng)用來描述一個窗口的WindowState對象成員變量mAppToken的值不等于null的時候,那么就說明該窗口所對應(yīng)的窗口令牌的類 型是AppWindowToken,而當(dāng)用來描述一個窗口的WindowState對象成員變量mTargetAppToken的值不等于null的時 候,那么就說明該窗口有一個目標(biāo)窗口。

? ? ? ? 經(jīng)過上面的調(diào)整之后,窗口的Z軸位置就保存在WindowState類的成員變量mAnimLayer中。對于非輸入法窗口和非壁紙窗口來說,這時候保存 在用來描述它們的WindowState對象的成員變量mAnimLayer中的Z軸位置就是它們最終的Z軸位置了,但是對于輸入法窗口和壁紙窗口來說, 還需要繼續(xù)判斷它們的目標(biāo)窗口是否需要調(diào)整它們的Z軸位置。

? ? ? ? 從前面Android窗口管理服務(wù)WindowManagerService對壁紙窗口(Wallpaper Window)的管理分析和Android窗口管理服務(wù)WindowManagerService對輸入法窗口(Input Method Window)的管理分析這 兩篇文章知道,如果一個窗口要調(diào)整它所關(guān)聯(lián)的輸入法窗口和壁紙窗口的Z軸位置,那么要調(diào)整的值就會保存在WindowManagerService類的成 員變量mInputMethodAnimLayerAdjustment和mWallpaperAnimLayerAdjustment中,因此,只要將 WindowManagerService類的成員變量mInputMethodAnimLayerAdjustment和 mWallpaperAnimLayerAdjustment的值分別增加到前面所計算得到的輸入法窗口和壁紙窗口的Z軸位置上去,就可以得到輸入法窗口 和壁紙窗口的最終Z軸位置,并且保存到用來對應(yīng)的WindowState對象的成員變量mAnimLayer中。

? ? ? ? 從上面的計算過程就可以知道,系統(tǒng)中所有類型的窗口的最終Z軸位置都保存在WindowState類的成員變量mAnimLayer中。

? ? ? ? 三. 設(shè)置窗口的Z軸位置到SurfaceFlinger服務(wù)中去

? ? ? ? WindowManagerService服務(wù)在刷新系統(tǒng)的UI的時候,就會將系統(tǒng)中已經(jīng)計算好了的窗口Z軸位置設(shè)置到SurfaceFlinger服務(wù)中去,以便SurfaceFlinger服務(wù)可以對系統(tǒng)中的窗口進(jìn)行可見性計算以及合成和渲染等操作。

? ? ? ? 從前面Android窗口管理服務(wù)WindowManagerService計算Activity窗口大小的過程分析一 文可以知道,刷新系統(tǒng)UI是通過調(diào)用WindowManagerService類的成員函數(shù) performLayoutAndPlaceSurfacesLockedInner來實(shí)現(xiàn)的,接下來我們就分析這個成員函數(shù)與設(shè)置窗口的Z軸位置到 SurfaceFlinger服務(wù)中去相關(guān)的邏輯。

? ? ? ? 為了方便描述設(shè)置窗口的Z軸位置到SurfaceFlinger服務(wù)中去的過程,我們先列出WindowManagerService類的成員函數(shù)performLayoutAndPlaceSurfacesLockedInner的實(shí)現(xiàn)架構(gòu),如下所示:

[java] view plaincopy
  1. public?class?WindowManagerService?extends?IWindowManager.Stub????
  2. ????????implements?Watchdog.Monitor?{????
  3. ????......????
  4. ????
  5. ????private?final?void?performLayoutAndPlaceSurfacesLockedInner(????
  6. ????????????boolean?recoveringMemory)?{????
  7. ????????......????
  8. ????
  9. ????????Surface.openTransaction();????
  10. ????????......????
  11. ????
  12. ????????try?{????
  13. ????????????......????
  14. ????????????int?repeats?=?0;????
  15. ????????????int?changes?=?0;????
  16. ????????????????
  17. ????????????do?{????
  18. ????????????????repeats++;????
  19. ????????????????if?(repeats?>?6)?{????
  20. ????????????????????......????
  21. ????????????????????break;????
  22. ????????????????}????
  23. ????
  24. ????????????????//?FIRST?LOOP:?Perform?a?layout,?if?needed.????
  25. ????????????????if?(repeats?<?4)?{????
  26. ????????????????????changes?=?performLayoutLockedInner();????
  27. ????????????????????if?(changes?!=?0)?{????
  28. ????????????????????????continue;????
  29. ????????????????????}????
  30. ????????????????}?else?{????
  31. ????????????????????Slog.w(TAG,?"Layout?repeat?skipped?after?too?many?iterations");????
  32. ????????????????????changes?=?0;????
  33. ????????????????}????
  34. ????
  35. ????????????????//?SECOND?LOOP:?Execute?animations?and?update?visibility?of?windows.????
  36. ????????????????......????
  37. ????????????????????
  38. ????????????}?while?(changes?!=?0);????
  39. ????
  40. ????????????//?THIRD?LOOP:?Update?the?surfaces?of?all?windows.???
  41. ????????????......??
  42. ??
  43. ????????????//更新窗口的繪圖表面的操作包括:??
  44. ????????????//1.?設(shè)置窗口的大小??
  45. ????????????//2.?設(shè)置窗口在X軸和Y軸上的位置??
  46. ????????????//3.?設(shè)置窗口在Z軸上的位置??
  47. ????????????//4.?設(shè)置窗口的Alpha通道??
  48. ????????????//5.?設(shè)置窗口的變換矩陣??
  49. ????????????......??
  50. ?????????????????????
  51. ????????}?catch?(RuntimeException?e)?{????
  52. ????????????......????
  53. ????????}????
  54. ????
  55. ????????......????
  56. ????
  57. ????????Surface.closeTransaction();????
  58. ????
  59. ????????......????
  60. ????
  61. ????????//?Destroy?the?surface?of?any?windows?that?are?no?longer?visible.????
  62. ????????......????
  63. ????
  64. ????????//?Time?to?remove?any?exiting?tokens?????
  65. ????????......????
  66. ????
  67. ????????//?Time?to?remove?any?exiting?applications?????
  68. ????????......????
  69. ????}????
  70. ????
  71. ????......????
  72. }????

? ? ? ??這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

? ? ? ? 在前面Android窗口管理服務(wù)WindowManagerService計算Activity窗口大小的過程分析一 文中,我們已經(jīng)分析過WindowManagerService類的成員函數(shù) performLayoutAndPlaceSurfacesLockedInner的實(shí)現(xiàn)架構(gòu)了,其中,設(shè)置窗口的Z軸位置到 SurfaceFlinger服務(wù)中去是在更新窗口的繪圖表面的操作中進(jìn)行的,即是在THIRD LOOP中進(jìn)行的,同時設(shè)置的還包括窗口的大小、X軸和Y軸位置、Alpha通道和變換矩陣,這些代碼如下所示:

[java] view plaincopy
  1. //更新窗口的繪圖表面的操作包括:??
  2. //1.?設(shè)置窗口的大小??
  3. //2.?設(shè)置窗口在X軸和Y軸上的位置??
  4. //3.?設(shè)置窗口在Z軸上的位置??
  5. //4.?設(shè)置窗口的Alpha通道值??
  6. //5.?設(shè)置窗口的變換矩陣??
  7. final?int?N?=?mWindows.size();??
  8. ??
  9. for?(i=N-1;?i>=0;?i--)?{??
  10. ????WindowState?w?=?mWindows.get(i);???
  11. ????......??
  12. ??
  13. ????if?(w.mSurface?!=?null)?{??
  14. ????????......??
  15. ??
  16. ????????w.computeShownFrameLocked();??
  17. ????????......??
  18. ??
  19. ????????boolean?resize;??
  20. ????????int?width,?height;??
  21. ????????if?((w.mAttrs.flags?&?w.mAttrs.FLAG_SCALED)?!=?0)?{??
  22. ????????????resize?=?w.mLastRequestedWidth?!=?w.mRequestedWidth?||??
  23. ????????????w.mLastRequestedHeight?!=?w.mRequestedHeight;??
  24. ????????????//?for?a?scaled?surface,?we?just?want?to?use??
  25. ????????????//?the?requested?size.??
  26. ????????????width??=?w.mRequestedWidth;??
  27. ????????????height?=?w.mRequestedHeight;??
  28. ????????????w.mLastRequestedWidth?=?width;??
  29. ????????????w.mLastRequestedHeight?=?height;??
  30. ????????????w.mLastShownFrame.set(w.mShownFrame);??
  31. ????????????try?{??
  32. ????????????????......??
  33. ????????????????w.mSurfaceX?=?w.mShownFrame.left;??
  34. ????????????????w.mSurfaceY?=?w.mShownFrame.top;??
  35. ????????????????w.mSurface.setPosition(w.mShownFrame.left,?w.mShownFrame.top);??
  36. ????????????}?catch?(RuntimeException?e)?{??
  37. ????????????????......??
  38. ????????????????if?(!recoveringMemory)?{??
  39. ????????????????????reclaimSomeSurfaceMemoryLocked(w,?"position");??
  40. ????????????????}??
  41. ????????????}??
  42. ????????}?else?{??
  43. ????????????resize?=?!w.mLastShownFrame.equals(w.mShownFrame);??
  44. ????????????width?=?w.mShownFrame.width();??
  45. ????????????height?=?w.mShownFrame.height();??
  46. ????????????w.mLastShownFrame.set(w.mShownFrame);??
  47. ????????}??
  48. ??
  49. ????????if?(resize)?{??
  50. ????????????if?(width?<?1)?width?=?1;??
  51. ????????????if?(height?<?1)?height?=?1;??
  52. ????????????if?(w.mSurface?!=?null)?{??
  53. ????????????????try?{??
  54. ????????????????????......??
  55. ????????????????????w.mSurfaceResized?=?true;??
  56. ????????????????????w.mSurfaceW?=?width;??
  57. ????????????????????w.mSurfaceH?=?height;??
  58. ????????????????????w.mSurface.setSize(width,?height);??
  59. ????????????????????w.mSurfaceX?=?w.mShownFrame.left;??
  60. ????????????????????w.mSurfaceY?=?w.mShownFrame.top;??
  61. ????????????????????w.mSurface.setPosition(w.mShownFrame.left,??
  62. ????????????????????????????w.mShownFrame.top);??
  63. ????????????????}?catch?(RuntimeException?e)?{??
  64. ????????????????????......??
  65. ????????????????????if?(!recoveringMemory)?{??
  66. ????????????????????????reclaimSomeSurfaceMemoryLocked(w,?"size");??
  67. ????????????????????}??
  68. ????????????????}??
  69. ????????????}??
  70. ????????}??
  71. ??
  72. ????????......??
  73. ??
  74. ????????if?(w.mAttachedHidden?||?!w.isReadyForDisplay())?{??
  75. ????????????if?(!w.mLastHidden)?{??
  76. ????????????????w.mLastHidden?=?true;??
  77. ????????????????......??
  78. ??
  79. ????????????????if?(w.mSurface?!=?null)?{??
  80. ????????????????????w.mSurfaceShown?=?false;??
  81. ????????????????????try?{??
  82. ????????????????????????w.mSurface.hide();??
  83. ????????????????????}?catch?(RuntimeException?e)?{??
  84. ????????????????????????......??
  85. ????????????????????}??
  86. ????????????????}??
  87. ????????????}????
  88. ??
  89. ????????????......??
  90. ????????}?else?if?(w.mLastLayer?!=?w.mAnimLayer??
  91. ????????????????||?w.mLastAlpha?!=?w.mShownAlpha??
  92. ????????????????||?w.mLastDsDx?!=?w.mDsDx??
  93. ????????????????||?w.mLastDtDx?!=?w.mDtDx??
  94. ????????????????||?w.mLastDsDy?!=?w.mDsDy??
  95. ????????????????||?w.mLastDtDy?!=?w.mDtDy??
  96. ????????????????||?w.mLastHScale?!=?w.mHScale??
  97. ????????????????||?w.mLastVScale?!=?w.mVScale??
  98. ????????????????||?w.mLastHidden)?{??????
  99. ????????????......??
  100. ????????????w.mLastAlpha?=?w.mShownAlpha;??
  101. ????????????w.mLastLayer?=?w.mAnimLayer;??
  102. ????????????w.mLastDsDx?=?w.mDsDx;??
  103. ????????????w.mLastDtDx?=?w.mDtDx;??
  104. ????????????w.mLastDsDy?=?w.mDsDy;??
  105. ????????????w.mLastDtDy?=?w.mDtDy;??
  106. ????????????w.mLastHScale?=?w.mHScale;??
  107. ????????????w.mLastVScale?=?w.mVScale;??
  108. ????????????......??
  109. ????????????if?(w.mSurface?!=?null)?{??
  110. ???????????????try?{??
  111. ????????????????????w.mSurfaceAlpha?=?w.mShownAlpha;??
  112. ????????????????????w.mSurface.setAlpha(w.mShownAlpha);??
  113. ????????????????????w.mSurfaceLayer?=?w.mAnimLayer;??
  114. ????????????????????w.mSurface.setLayer(w.mAnimLayer);??
  115. ????????????????????w.mSurface.setMatrix(??
  116. ????????????????????????????w.mDsDx*w.mHScale,?w.mDtDx*w.mVScale,??
  117. ????????????????????????????w.mDsDy*w.mHScale,?w.mDtDy*w.mVScale);??
  118. ????????????????}?catch?(RuntimeException?e)?{??
  119. ????????????????????.....??
  120. ????????????????????if?(!recoveringMemory)?{??
  121. ????????????????????????reclaimSomeSurfaceMemoryLocked(w,?"update");??
  122. ????????????????????}??
  123. ????????????????}??
  124. ????????????}??
  125. ??
  126. ????????????if?(w.mLastHidden?&&?!w.mDrawPending??
  127. ????????????????????&&?!w.mCommitDrawPending??
  128. ????????????????????&&?!w.mReadyToShow)?{??
  129. ????????????????......??
  130. ????????????????if?(showSurfaceRobustlyLocked(w))?{??
  131. ????????????????????w.mHasDrawn?=?true;??
  132. ????????????????????w.mLastHidden?=?false;??
  133. ????????????????}???
  134. ????????}????
  135. ??
  136. ????????......??
  137. ????}??
  138. ??
  139. ????......????????????????????????????
  140. }??

? ? ? ? 這段代碼通過一個for循環(huán)來遍歷保存在窗口堆棧的每一個WindowState對象,以便可以對系統(tǒng)中的每一個窗口的繪圖表面進(jìn)行更新。注意,只有那些 成員變量mSurface的值不等于null的WindowState對象,它們所描述的窗口才具有繪圖表面,因此需要對它們進(jìn)行更新。

? ? ? ? 在更新WindowState對象w所描述的窗口的繪圖表面之前,首先要調(diào)用它的成員函數(shù)computeShownFrameLocked來確定該窗口實(shí)際要顯示的大小、位置、Alpha通道和變換矩陣等信息,其中:

? ? ? ? 1.?窗口實(shí)際要顯示的大小和X軸、Y軸位置保存在WindowState對象w的成員變量mShownFrame中。

? ? ? ? 2.?窗口實(shí)際要顯示的Alpha通道保存在WindowState對象w的成員變量mShownAlpha中。

? ? ? ? 3.?窗口實(shí)際要顯示的Z軸位置保存在WindowState對象w的成員變量mAnimLayer中。

? ? ? ? 4.?窗口實(shí)際要使用的變換矩陣保存在WindowState對象w的成員變量mDsDx、mDtDx、mDsDy和mDtDy中。

? ? ? ? 有了上述信息之后,我們就可以將WindowState對象w所描述的窗口實(shí)際要顯示的大小、位置、Alpha通道和變換矩陣等信息設(shè)置到SurfaceFlinger服務(wù)中去了。

? ? ? ? 我們首先分析WindowState對象w所描述的窗口實(shí)際要顯示的大小、X軸和Y軸位置的設(shè)置過程,接著再分析WindowState對象w所描述的窗口實(shí)際要顯示的Alpha通道、Z軸位置以及實(shí)際要使用的變換矩陣的設(shè)置過程。

? ? ? ? 在調(diào)用WindowState對象w的成員函數(shù)computeShownFrameLocked來計算它所描述的窗口的大小的時候,是沒有考慮該窗口的大小是否設(shè)置有縮放因子的。

? ? ? ? 當(dāng)WindowState對象w所描述的窗口的大小設(shè)置有縮放因子的時候,那么WindowState對象w的成員變量mAttrs所指向的一個 WindowManager.LayoutParams對象的成員變量flags的FLAG_SCALED位就會等于1,這時候WindowState對 象w所描述的窗口實(shí)際要顯示的大小是保存在它的成員變量mRequestedWidth和mRequestedHeight中的。在這種情況下,這段代碼 就會執(zhí)行以下操作:

? ? ? ? 1. 計算WindowState對象w所描述的窗口實(shí)際要顯示的大小是否發(fā)生了變化。如果發(fā)生了變化,那么就將變量resize的值設(shè)置為true。注 意,WindowState對象w所描述的窗口上一次實(shí)際要顯示的大小保存在成員變量mLastRequestedWidth和 mLastRequestedHeight中,因此,當(dāng)這兩個成員變量與其它兩個成員變量mRequestedWidth和 mRequestedHeight的值不相等于時,就說明WindowState對象w所描述的窗口實(shí)際要顯示的大小是否發(fā)生了變化。

? ? ? ? 2. 將WindowState對象w所描述的窗口實(shí)際要顯示的大小分別更新到成員變量mLastRequestedWidth和mLastRequestedHeight中,以及變量width和height中。

? ? ? ? 3. 將WindowState對象w的成員變量mShownFrame的值保存在另外一個成員變量mLastShownFrame中,以便可以記錄WindowState對象w所描述的窗口上一次實(shí)際要顯示的大小和X軸、Y軸位置。

? ? ? ? 4. 將WindowState對象w所描述的窗口的X軸和Y軸位置分別保存到成員變量mSurfaceX和mSurfaceY中,并且調(diào)用 WindowState對象w的成員變量mSurface所指向的一個Surface對象的成員函數(shù)setPosition來將這兩個位置值設(shè)置到 SurfaceFlinger服務(wù)中去。

? ? ? ? 5. 在設(shè)置WindowState對象w所描述的窗口的X軸和Y軸位置到SurfaceFlinger服務(wù)中去的過程中,如果出現(xiàn)了異常,那么就說明系統(tǒng)內(nèi)存 資源不足。在這種情況下,如果參數(shù)recoveringMemory的值等于false,那么就說明WindowManagerService服務(wù)目前不 是處于內(nèi)存資源的回收過程中,于是就會調(diào)用WindowManagerService類的成員函數(shù) reclaimSomeSurfaceMemoryLocked來執(zhí)行回收系統(tǒng)內(nèi)存資源的操作。

? ? ? ??當(dāng)WindowState對象w所描述的窗口的大小沒有設(shè)置有縮放因子的時候,那么WindowState對象w的成員變量mAttrs所指向的一個 WindowManager.LayoutParams對象的成員變量flags的FLAG_SCALED位就會等于0,這時候WindowState對 象w所描述的窗口實(shí)際要顯示的大小是保存在它的成員變量mShownFrame中的。在這種情況下,這段代碼就會執(zhí)行以下操作:

? ? ? ? 1.?計算WindowState對象w所描述的窗口實(shí)際要顯示的大小是否發(fā)生了變化。如果發(fā)生了變化,那么就將變量resize的值設(shè)置為true。注 意,這時候只要比較WindowState對象w的成員變量mLastShownFrame和mShownFrame所描述的兩個矩形區(qū)域的大小是否相 等,就可以知道WindowState對象w所描述的窗口實(shí)際要顯示的大小是否發(fā)生了變化,因?yàn)閃indowState對象w的成員變量 mLastShownFrame保存的是窗口上一次實(shí)際要顯示的大小。

? ? ? ? 2.?將WindowState對象w所描述的窗口實(shí)際要顯示的大小分別保存在變量width和height中。

? ? ? ? 3.?將WindowState對象w的成員變量mShownFrame的值保存在另外一個成員變量mLastShownFrame中,以便可以記錄WindowState對象w所描述的窗口上一次實(shí)際要顯示的大小和X軸、Y軸位置。

? ? ? ? 執(zhí)行完成以上操作之后,WindowState對象w所描述的窗口實(shí)際要顯示的X軸和Y軸位置就保存在成員變量mShownFrame所描述的一個 Rect對象的成員變量left和top中,而實(shí)際要顯示的大小就顯示在變量width和height中。這時候如果變量resize的值等于true, 那么就說明WindowState對象w所描述的窗口的大小發(fā)生了變化。在這種情況下,就需要執(zhí)行以下操作:

? ? ? ? 1. 重新設(shè)置WindowState對象w所描述的窗口的大小到SurfaceFlinger服務(wù)中去,這是通過調(diào)用WindowState對象w的成員變量 mSurface所指向的一個Surface對象的成員函數(shù)setSize來實(shí)現(xiàn)的。注意,如果前面計算得到WindowState對象w所描述的窗口的 寬度width和高度height的值小于1,那么就需要將它們的值設(shè)置為1,因?yàn)橐粋€窗口的寬度和高度值是不能小于1的。

? ? ? ? 2. 重新設(shè)置WindowState對象w所描述的窗口在X軸和Y軸上的位置到SurfaceFlinger服務(wù)中去,這是通過調(diào)用WindowState對 象w的成員變量mSurface所指向的一個Surface對象的成員函數(shù)setPosition來實(shí)現(xiàn)的。注意,在設(shè)置之前,還會將 WindowState對象w所描述的窗口在X軸和Y軸上的位置保存在成員變量mSurfaceX和mSurfaceY中。

? ? ? ? 3.?在設(shè)置WindowState對象w所描述的窗口的大小以及在X軸和Y軸上的位置到SurfaceFlinger服務(wù)中去的過程中,如果出現(xiàn)了異 常,那么同樣需要判斷參數(shù)recoveringMemory的值來決定是否需要WindowManagerService類的成員函數(shù) reclaimSomeSurfaceMemoryLocked來回收系統(tǒng)內(nèi)存資源。

? ? ? ? 設(shè)置好WindowState對象w所描述的窗口實(shí)際要顯示的大小、X軸和Y軸位置到SurfaceFlinger服務(wù)中去之后,接下來就要繼續(xù)設(shè)置它實(shí) 際要顯示的Alpha通道、Z軸位置以及實(shí)際要使用的變換矩陣了,不過只有當(dāng)WindowState對象w所描述的窗口當(dāng)前是處于可見狀態(tài)、并且這些值沒 有發(fā)生變化的情況下才需要這樣做。

? ? ? ? 當(dāng)WindowState對象w的成員函數(shù)isReadyForDisplay的返回值等于false時,就說明WindowState對象w所描述的窗 口當(dāng)前是處于不可見狀態(tài)的。還有另外一種情況,即當(dāng)WindowState對象w所描述的窗口是附加在另外一個窗口之上、并且這個被附加的窗口是不可見 時,即WindowState對象w的成員變量mAttachedHidden的值等于true時,也是說明WindowState對象w所描述的窗口當(dāng) 前是處于不可見狀態(tài)的。

? ? ? ? 在WindowState對象w所描述的窗口當(dāng)前是處于不可見狀態(tài)的情況下,如果該窗口在上一次系統(tǒng)UI刷新時是處于可見狀態(tài)的,即 WindowState對象w的成員變量mLastHidden的值等于true,那么這時候就需要將WindowState對象w所描述的窗口隱藏起 來,這是通過調(diào)用WindowState對象w的成員變量mSurface所指向的一個Surface對象的成員函數(shù)hide來實(shí)現(xiàn)的。注意,在調(diào)用 WindowState對象w的成員變量mSurface所指向的一個Surface對象的成員函數(shù)hide來隱藏窗口之前,需要分別將 WindowState對象w的成員變量mLastHidden和mSurfaceShown的值設(shè)置為true和false,以便可以正確描述窗口的不 可見狀態(tài)。

? ? ? ??在WindowState對象w所描述的窗口當(dāng)前是處于可見狀態(tài)的情況下,如果該窗口實(shí)際要顯示的Alpha通道、Z軸位置以及實(shí)際要使用的變換矩陣發(fā)生了變化,那么就需要將新的值設(shè)置到SurfaceFlinger服務(wù)中去,其中:

? ? ? ? 1.?WindowState對象w的成員變量mLastLayer與mAnimLayer的值不相等說明它描述的窗口的Z軸位置發(fā)生了變化。

? ? ? ? 2.?WindowState對象w的成員變量mLastAlpha與mShownAlpha的值不相等說明它描述的窗口的Alpha通道發(fā)生了變化。

? ? ? ? 3.?WindowState對象w的成員變量mLastDsDx、mLastDtDx、mLastDsDy、 mLastDtDy、mLastHScale、mLastVScale與成員變量mDsDx、mDtDx、mDsDy、?mDtDy、mHScale、 mVScale的值不相等說明它描述的窗口的變換矩陣發(fā)生了變化。

? ? ? ??在WindowState對象w所描述的窗口當(dāng)前是處于可見狀態(tài)的情況下,如果該窗口在上一次系統(tǒng)UI刷新時是處于可見狀態(tài)的,即 WindowState對象w的成員變量mLastHidden的值等于true,那么也是需要重新設(shè)置WindowState對象w所描述的窗口實(shí)際要 顯示的Alpha通道、Z軸位置以及實(shí)際要使用的變換矩陣到SurfaceFlinger服務(wù)中去的。

? ? ? ? 無論如何,當(dāng)需要重新設(shè)置WindowState對象w所描述的窗口實(shí)際要顯示的Alpha通道、Z軸位置以及實(shí)際要使用的變換矩陣到SurfaceFlinger服務(wù)中去時,就需要執(zhí)行以下操作:

? ? ? ? 1. 重新設(shè)置WindowState對象w所描述的窗口的Alpha通道到SurfaceFlinger服務(wù)中去,這是通過調(diào)用WindowState對象w 的成員變量mSurface所指向的一個Surface對象的成員函數(shù)setAlpha來實(shí)現(xiàn)的。在設(shè)置之前,還會將WindowState對象w的成員 變量mShownAlpha的值同時保存在成員變量mLastAlpha和mSurfaceAlpha中,以便可以記錄WindowState對象w所描 述的窗口上一次所使用的Alpha通道。

? ? ? ? 2.?重新設(shè)置WindowState對象w所描述的窗口的Z軸位置到SurfaceFlinger服務(wù)中去,這是通過調(diào)用WindowState對象w 的成員變量mSurface所指向的一個Surface對象的成員函數(shù)setLayer來實(shí)現(xiàn)的。在設(shè)置之前,還會將WindowState對象w的成員 變量mAnimLayer的值同時保存在成員變量mLastLayer和mSurfaceLayer中,以便可以記錄WindowState對象w所描述 的窗口上一次所使用的Z軸位置。

? ? ? ? 3.?重新設(shè)置WindowState對象w所描述的窗口的變換矩陣到SurfaceFlinger服務(wù)中去,這是通過調(diào)用WindowState對象w 的成員變量mSurface所指向的一個Surface對象的成員函數(shù)setMatrix來實(shí)現(xiàn)的。在設(shè)置之前,還會將WindowState對象w的成 員變量成員變量mDsDx、mDtDx、mDsDy、?mDtDy、mHScale、mVScale的值分別保存在成員變量mLastDsDx、 mLastDtDx、mLastDsDy、?mLastDtDy、mLastHScale、mLastVScale中,以便可以記錄 WindowState對象w所描述的窗口上一次所使用的變換矩陣。注意,WindowState對象的成員變量mHScale和mVScale描述的窗 口在寬度和高度上的縮放因子,因此,在設(shè)置窗口的變換矩陣時,需要乘以這些因子才可以得到正確的變換矩陣參數(shù)。

? ? ? ? 4.?在設(shè)置WindowState對象w所描述的窗口的Alpha通道、Z軸位置以及實(shí)際要使用的變換矩陣到SurfaceFlinger服務(wù)的過程 中,如果出現(xiàn)了異常,那么同樣需要判斷參數(shù)recoveringMemory的值來決定是否需要WindowManagerService類的成員函數(shù) reclaimSomeSurfaceMemoryLocked來回收系統(tǒng)內(nèi)存資源。

? ? ? ? 將WindowState對象w所描述的窗口實(shí)際要顯示的Alpha通道、Z軸位置以及實(shí)際要使用的變換矩陣設(shè)置到SurfaceFlinger服務(wù)之后,如果WindowState對象w所描述的窗口滿足以下條件:

? ? ? ? 1. 上一次處于不可見狀態(tài),即WindowState對象w的成員變量mLastHidden的值等于true;

? ? ? ? 2. UI已經(jīng)繪制完成,即WindowState對象w的成員變量mDrawPending和mCommitDrawPending值等于false;

? ? ? ? 3. 不是處于等待同一個窗口令牌的其它窗口的完成UI繪制的狀態(tài),即WindowState對象w的成員變量mReadyToShow的值等于false;

? ? ? ? 那么就說明現(xiàn)在就是時候要將WindowState對象w所描述的窗口顯示出來了,這是通過調(diào)用WindowManagerService類的成員函數(shù) showSurfaceRobustlyLocked來實(shí)現(xiàn)的。如果WindowManagerService類的成員函數(shù) showSurfaceRobustlyLocked的返回值等于true,那么就說明WindowManagerService服務(wù)已經(jīng)成功地通知 SurfaceFlinger服務(wù)將WindowState對象w所描述的窗口顯示出來,于是就會分別將WindowState對象w的成員變量 mHasDrawn和mLastHidden的值設(shè)置為true和false,以便可以表示W(wǎng)indowState對象w所描述的窗口的UI已經(jīng)繪制完 成,并且已經(jīng)顯示出來。

? ? ? ??WindowManagerService類的成員函數(shù)showSurfaceRobustlyLocked的實(shí)現(xiàn)如下所示:

[java] view plaincopy
  1. public?class?WindowManagerService?extends?IWindowManager.Stub????
  2. ????????implements?Watchdog.Monitor?{????
  3. ????......????
  4. ????
  5. ????boolean?showSurfaceRobustlyLocked(WindowState?win)?{??
  6. ????????try?{??
  7. ????????????if?(win.mSurface?!=?null)?{??
  8. ????????????????win.mSurfaceShown?=?true;??
  9. ????????????????win.mSurface.show();??
  10. ????????????????......??
  11. ????????????}??
  12. ????????????return?true;??
  13. ????????}?catch?(RuntimeException?e)?{??
  14. ????????????......??
  15. ????????}??
  16. ??
  17. ????????reclaimSomeSurfaceMemoryLocked(win,?"show");??
  18. ??
  19. ????????return?false;??
  20. ????}??
  21. ????
  22. ????......????
  23. }????

? ? ? ??這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/WindowManagerService.java中。

? ? ? ??WindowManagerService類的成員函數(shù)showSurfaceRobustlyLocked用來通知SurfaceFlinger服 務(wù)將參數(shù)win所描述的窗口顯示出來,這是通過調(diào)用WindowState對象win的成員變量mSurface所指向的一個Surface對象的成員函 數(shù)show來實(shí)現(xiàn)的。注意,在通知SurfaceFlinger服務(wù)將WindowState對象win所描述的窗口顯示出來之前,還會將它的成員變量 mSurfaceShown的值設(shè)置為true。

? ? ? ? 如果在通知SurfaceFlinger服務(wù)將WindowState對象win所描述的窗口顯示出來的過程出現(xiàn)了異常,那么 WindowManagerService類的成員函數(shù)showSurfaceRobustlyLocked就會調(diào)用另外一個成員函數(shù) reclaimSomeSurfaceMemoryLocked來回收系統(tǒng)內(nèi)存資源。

? ? ? ? 從上面分析可以知道,一個窗口的顯示和隱藏,以及大小、X軸和Y軸位置、Z軸位置、Alpha通道和變換矩陣設(shè)置,是通過調(diào)用Java層的Surface 類的成員函數(shù)show、hide、setSize、setPosition、setLayer、setAlpha和setMatrix來實(shí)現(xiàn)的,它們都是 一些JNI方法,定義在文件frameworks/base/core/java/android/view/Surface.java中,如下所示:

[java] view plaincopy
  1. public?class?Surface?implements?Parcelable?{??
  2. ????......??
  3. ??
  4. ????private?int?mSurfaceControl;??
  5. ????......??
  6. ??
  7. ????/**?
  8. ?????*?set?surface?parameters.?
  9. ?????*?needs?to?be?inside?open/closeTransaction?block?
  10. ?????*/??
  11. ????public?native???void?setLayer(int?zorder);??
  12. ????public?native???void?setPosition(int?x,?int?y);??
  13. ????public?native???void?setSize(int?w,?int?h);??
  14. ??
  15. ????public?native???void?hide();??
  16. ????public?native???void?show();??
  17. ????......??
  18. ????public?native???void?setAlpha(float?alpha);??
  19. ????public?native???void?setMatrix(float?dsdx,?float?dtdx,??
  20. ???????????????????????????????????float?dsdy,?float?dtdy);??
  21. ????......??
  22. ??
  23. }??

? ? ? ?這些JNI方法是由C++層中的函數(shù)Surface_show、Surface_hide、Surface_setSize、 Surface_setPosition、Surface_setLayer、Surface_setAlpha和Surface_setMatrix來 實(shí)現(xiàn)的,如下所示:

[cpp] view plaincopy
  1. static?void?Surface_setLayer(??
  2. ????????JNIEnv*?env,?jobject?clazz,?jint?zorder)??
  3. {??
  4. ????const?sp<SurfaceControl>&?surface(getSurfaceControl(env,?clazz));??
  5. ????if?(surface?==?0)?return;??
  6. ????status_t?err?=?surface->setLayer(zorder);??
  7. ????if?(err<0?&&?err!=NO_INIT)??
  8. ????????doThrow(env,?"java/lang/IllegalArgumentException",?NULL);??
  9. }??
  10. ??
  11. static?void?Surface_setPosition(??
  12. ????????JNIEnv*?env,?jobject?clazz,?jint?x,?jint?y)??
  13. {??
  14. ????const?sp<SurfaceControl>&?surface(getSurfaceControl(env,?clazz));??
  15. ????if?(surface?==?0)?return;??
  16. ????status_t?err?=?surface->setPosition(x,?y);??
  17. ????if?(err<0?&&?err!=NO_INIT)??
  18. ????????doThrow(env,?"java/lang/IllegalArgumentException",?NULL);??
  19. }??
  20. ??
  21. static?void?Surface_setSize(??
  22. ????????JNIEnv*?env,?jobject?clazz,?jint?w,?jint?h)??
  23. {??
  24. ????const?sp<SurfaceControl>&?surface(getSurfaceControl(env,?clazz));??
  25. ????if?(surface?==?0)?return;??
  26. ????status_t?err?=?surface->setSize(w,?h);??
  27. ????if?(err<0?&&?err!=NO_INIT)??
  28. ????????doThrow(env,?"java/lang/IllegalArgumentException",?NULL);??
  29. }??
  30. ??
  31. static?void?Surface_hide(??
  32. ????????JNIEnv*?env,?jobject?clazz)??
  33. {??
  34. ????const?sp<SurfaceControl>&?surface(getSurfaceControl(env,?clazz));??
  35. ????if?(surface?==?0)?return;??
  36. ????status_t?err?=?surface->hide();??
  37. ????if?(err<0?&&?err!=NO_INIT)??
  38. ????????doThrow(env,?"java/lang/IllegalArgumentException",?NULL);??
  39. }??
  40. ??
  41. static?void?Surface_show(??
  42. ????????JNIEnv*?env,?jobject?clazz)??
  43. {??
  44. ????const?sp<SurfaceControl>&?surface(getSurfaceControl(env,?clazz));??
  45. ????if?(surface?==?0)?return;??
  46. ????status_t?err?=?surface->show();??
  47. ????if?(err<0?&&?err!=NO_INIT)??
  48. ????????doThrow(env,?"java/lang/IllegalArgumentException",?NULL);??
  49. }??
  50. ??
  51. static?void?Surface_setAlpha(??
  52. ????????JNIEnv*?env,?jobject?clazz,?jfloat?alpha)??
  53. {??
  54. ????const?sp<SurfaceControl>&?surface(getSurfaceControl(env,?clazz));??
  55. ????if?(surface?==?0)?return;??
  56. ????status_t?err?=?surface->setAlpha(alpha);??
  57. ????if?(err<0?&&?err!=NO_INIT)??
  58. ????????doThrow(env,?"java/lang/IllegalArgumentException",?NULL);??
  59. }??
  60. ??
  61. static?void?Surface_setMatrix(??
  62. ????????JNIEnv*?env,?jobject?clazz,??
  63. ????????jfloat?dsdx,?jfloat?dtdx,?jfloat?dsdy,?jfloat?dtdy)??
  64. {??
  65. ????const?sp<SurfaceControl>&?surface(getSurfaceControl(env,?clazz));??
  66. ????if?(surface?==?0)?return;??
  67. ????status_t?err?=?surface->setMatrix(dsdx,?dtdx,?dsdy,?dtdy);??
  68. ????if?(err<0?&&?err!=NO_INIT)??
  69. ????????doThrow(env,?"java/lang/IllegalArgumentException",?NULL);??
  70. }??

? ? ? ? 這些JNI方法定義在文件frameworks/base/core/jni/android_view_Surface.cpp中。

? ? ? ? 這些JNI都有一個共同的特點(diǎn),即先調(diào)用函數(shù)getSurfaceControl來獲得與參數(shù)clazz所描述的一個Java層的Surface對象所對 應(yīng)的一個SurfaceControl對象。有了這個SurfaceControl對象之后,就可以分別調(diào)用它的成員函數(shù)show、hide、 setSize、setPosition、setLayer、setAlpha和setMatrix來通知SurfaceFlinger服務(wù)來顯示和隱藏 一個窗口,以及設(shè)置一個窗口大小、X軸和Y軸位置、Z軸位置、Alpha通道和變換矩陣。

? ? ? ? 從前面Android應(yīng)用程序窗口(Activity)的繪圖表面(Surface)的創(chuàng)建過程分析一 文可以知道,每一個Activity窗口在Java層都對應(yīng)有兩個Surface對象,其中一個位于應(yīng)用程序進(jìn)程這一側(cè),而另外一個位于 WindowManagerService服務(wù)這一側(cè)。每一個位于應(yīng)用程序進(jìn)程這一側(cè)的Java層的Surface對象在C++層中都對應(yīng)有一個 Surface對象,而每一個位于WindowManagerService服務(wù)這一側(cè)的Java層的Surface對象在C++層中都對應(yīng)有一個 SurfaceControl對象,這個C++層的SurfaceControl對象的地址就保存在Java層的Surface對象的成員變量 mSurfaceControl中。

? ? ? ?從上面的分析可以知道,我們目前正在操作的是正在位于WindowManagerService服務(wù)這一側(cè)的Java層的Surface對象,因此,通 過調(diào)用函數(shù)getSurfaceControl就可以在C++層中獲得一個對應(yīng)的SurfaceControl對象,而有了這個 SurfaceControl對象之后,就可以用來通知SurfaceFlinger服務(wù)更新一個窗口的屬性,這一點(diǎn)可以參考前面Android應(yīng)用程序與SurfaceFlinger服務(wù)的關(guān)系概述和學(xué)習(xí)計劃和Android系統(tǒng)Surface機(jī)制的SurfaceFlinger服務(wù)簡要介紹和學(xué)習(xí)計劃兩個系列的文章。

? ? ? ?至此,WindowManagerService服務(wù)計算窗口Z軸位置的過程就分析完成了,這個過程如下所示:

? ? ? ?1.?WindowManagerService服務(wù)將窗口排列在一個窗口堆棧中;

? ? ? ?2.?WindowManagerService服務(wù)根據(jù)窗口類型以及窗口在窗口堆棧的位置來計算得窗口的Z軸位置;

? ? ? ?3.?WindowManagerService服務(wù)通過Java層的Surface類的成員函數(shù)setLayer來將窗口的Z軸位置設(shè)置到SurfaceFlinger服務(wù)中去;

? ? ? ?4. Java層的Surface類的成員函數(shù)setLayer又是通過調(diào)用C++層的SurfaceControl類的成員函數(shù)setLayer來將窗口的Z軸位置設(shè)置到SurfaceFlinger服務(wù)中去的;

? ? ? ?通過這篇文章以及前面三篇文章(窗口組織、輸入法窗口、壁紙窗口) 的學(xué)習(xí),我們對WindowManagerService服務(wù)對窗口的管理就有一個比較深刻的認(rèn)識了,在接下來的文章中,我們還將繼續(xù)分析 ActivityWindowManager服務(wù)和WindowManagerService服務(wù)是如何協(xié)作來完成Activity窗口的顯示過程的,敬 請關(guān)注!

老羅的新浪微博:http://weibo.com/shengyangluo,歡迎關(guān)注!

轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/4143189.html

總結(jié)

以上是生活随笔為你收集整理的Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

国产精品无码永久免费888 | 98国产精品综合一区二区三区 | 色综合视频一区二区三区 | 精品国产av色一区二区深夜久久 | 日韩精品久久久肉伦网站 | 亚洲综合另类小说色区 | 18禁黄网站男男禁片免费观看 | 伊人久久大香线焦av综合影院 | 欧美黑人巨大xxxxx | 国产成人无码a区在线观看视频app | 日韩人妻系列无码专区 | 天天拍夜夜添久久精品大 | 亚洲欧美日韩国产精品一区二区 | 国产一区二区三区精品视频 | 国产又爽又猛又粗的视频a片 | 成 人 免费观看网站 | 国产人成高清在线视频99最全资源 | 麻豆成人精品国产免费 | 偷窥日本少妇撒尿chinese | 人人妻人人澡人人爽人人精品浪潮 | 99久久婷婷国产综合精品青草免费 | 国产亚洲tv在线观看 | 亚洲欧洲无卡二区视頻 | 欧美午夜特黄aaaaaa片 | 无人区乱码一区二区三区 | 色婷婷综合中文久久一本 | 国产午夜无码视频在线观看 | 国产精品a成v人在线播放 | 日本乱人伦片中文三区 | 欧美放荡的少妇 | 55夜色66夜色国产精品视频 | 无码任你躁久久久久久久 | 中国女人内谢69xxxxxa片 | 又黄又爽又色的视频 | 1000部啪啪未满十八勿入下载 | 国产内射爽爽大片视频社区在线 | 日日鲁鲁鲁夜夜爽爽狠狠 | 樱花草在线社区www | 成人性做爰aaa片免费看 | 麻豆国产97在线 | 欧洲 | 亚洲精品美女久久久久久久 | 久久国内精品自在自线 | 中文字幕乱码亚洲无线三区 | a片在线免费观看 | 国产尤物精品视频 | 东京无码熟妇人妻av在线网址 | 天天摸天天碰天天添 | 亚洲一区二区三区偷拍女厕 | 国产va免费精品观看 | 丁香啪啪综合成人亚洲 | 欧美三级不卡在线观看 | 欧美日韩在线亚洲综合国产人 | 无码国模国产在线观看 | 欧美阿v高清资源不卡在线播放 | 国产精品亚洲五月天高清 | 成年女人永久免费看片 | 国产成人人人97超碰超爽8 | 久久久亚洲欧洲日产国码αv | 狠狠综合久久久久综合网 | 国产内射爽爽大片视频社区在线 | 色婷婷香蕉在线一区二区 | 欧美性黑人极品hd | 亚洲伊人久久精品影院 | 亚洲人成网站在线播放942 | 婷婷六月久久综合丁香 | 男人的天堂2018无码 | 欧美人与禽zoz0性伦交 | 日韩人妻系列无码专区 | 人妻少妇精品久久 | 久久精品人人做人人综合试看 | 88国产精品欧美一区二区三区 | 亚洲国产午夜精品理论片 | 最近免费中文字幕中文高清百度 | 成人免费无码大片a毛片 | 熟妇人妻中文av无码 | 日本精品人妻无码77777 天堂一区人妻无码 | 青春草在线视频免费观看 | 高潮喷水的毛片 | 午夜嘿嘿嘿影院 | 国产精品二区一区二区aⅴ污介绍 | 国产熟女一区二区三区四区五区 | 成人欧美一区二区三区黑人免费 | 国产精品无码久久av | 99久久人妻精品免费一区 | 国产无套粉嫩白浆在线 | 亚洲欧美综合区丁香五月小说 | 国产精品99久久精品爆乳 | 女人被男人爽到呻吟的视频 | 少妇被粗大的猛进出69影院 | 国产午夜精品一区二区三区嫩草 | 无码人妻丰满熟妇区毛片18 | 日本大乳高潮视频在线观看 | 水蜜桃色314在线观看 | 蜜桃臀无码内射一区二区三区 | 欧美老妇交乱视频在线观看 | 99久久亚洲精品无码毛片 | 欧美日韩视频无码一区二区三 | 99久久精品午夜一区二区 | 日韩少妇内射免费播放 | 77777熟女视频在线观看 а天堂中文在线官网 | 97无码免费人妻超级碰碰夜夜 | 午夜精品一区二区三区的区别 | 青青草原综合久久大伊人精品 | 久久久亚洲欧洲日产国码αv | 国产农村乱对白刺激视频 | 国产成人无码a区在线观看视频app | 久久精品国产一区二区三区 | 亚洲高清偷拍一区二区三区 | 国产偷抇久久精品a片69 | 日本饥渴人妻欲求不满 | 乱码午夜-极国产极内射 | 无码精品人妻一区二区三区av | 激情五月综合色婷婷一区二区 | 国产精品嫩草久久久久 | 国产激情无码一区二区app | 成人性做爰aaa片免费看不忠 | 又大又硬又爽免费视频 | 国产偷自视频区视频 | 5858s亚洲色大成网站www | 日韩人妻系列无码专区 | 久久精品国产日本波多野结衣 | 亚洲精品国产第一综合99久久 | 久久久无码中文字幕久... | 一本久道久久综合婷婷五月 | 国产精品亚洲五月天高清 | 亚洲欧美日韩综合久久久 | 国产激情精品一区二区三区 | 午夜理论片yy44880影院 | 老太婆性杂交欧美肥老太 | 亚洲中文字幕乱码av波多ji | 亚洲日韩中文字幕在线播放 | 中文精品无码中文字幕无码专区 | 最新国产麻豆aⅴ精品无码 | 久久国产劲爆∧v内射 | 一二三四在线观看免费视频 | 97久久国产亚洲精品超碰热 | aⅴ亚洲 日韩 色 图网站 播放 | 精品乱子伦一区二区三区 | 狠狠色欧美亚洲狠狠色www | 2019nv天堂香蕉在线观看 | 国内精品久久毛片一区二区 | 亚洲中文字幕成人无码 | 欧美一区二区三区 | 九九久久精品国产免费看小说 | 精品国产青草久久久久福利 | 日本一卡二卡不卡视频查询 | 精品无码国产一区二区三区av | 欧美三级a做爰在线观看 | 国产精品久久久久7777 | 中文字幕av伊人av无码av | 少妇高潮一区二区三区99 | 久久99国产综合精品 | 牲交欧美兽交欧美 | 亚洲国产成人av在线观看 | 国产日产欧产精品精品app | 国产成人无码av在线影院 | 人妻少妇被猛烈进入中文字幕 | 久9re热视频这里只有精品 | 久久人妻内射无码一区三区 | 99久久久无码国产精品免费 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲国产一区二区三区在线观看 | 亚洲日韩一区二区 | 欧美xxxxx精品 | 国产sm调教视频在线观看 | 国产深夜福利视频在线 | 内射白嫩少妇超碰 | 啦啦啦www在线观看免费视频 | 一二三四社区在线中文视频 | 国产精品永久免费视频 | 麻豆国产97在线 | 欧洲 | 国产一精品一av一免费 | av人摸人人人澡人人超碰下载 | 女人被男人躁得好爽免费视频 | 欧洲极品少妇 | 亚洲综合色区中文字幕 | 一本久道久久综合婷婷五月 | 国产情侣作爱视频免费观看 | 国产97色在线 | 免 | 四虎国产精品免费久久 | 亚洲呦女专区 | 性生交大片免费看女人按摩摩 | 午夜精品久久久久久久久 | 男女作爱免费网站 | 国产成人无码a区在线观看视频app | 国产色xx群视频射精 | 4hu四虎永久在线观看 | 性色av无码免费一区二区三区 | 欧美乱妇无乱码大黄a片 | 欧美精品免费观看二区 | 99精品无人区乱码1区2区3区 | 亚洲国产精品久久久天堂 | 伊在人天堂亚洲香蕉精品区 | 久久精品女人天堂av免费观看 | 国产三级精品三级男人的天堂 | 又紧又大又爽精品一区二区 | 日韩欧美中文字幕公布 | 高清不卡一区二区三区 | 亚洲精品久久久久中文第一幕 | 亚洲人成网站在线播放942 | 国产成人无码专区 | 久久99国产综合精品 | 国产亚洲精品久久久久久大师 | 三上悠亚人妻中文字幕在线 | 天天做天天爱天天爽综合网 | 18禁黄网站男男禁片免费观看 | 日韩av无码中文无码电影 | 国产激情无码一区二区app | 亚洲色偷偷男人的天堂 | 久久国产36精品色熟妇 | 性欧美牲交xxxxx视频 | 黑森林福利视频导航 | 精品国产成人一区二区三区 | 国产精品自产拍在线观看 | 红桃av一区二区三区在线无码av | 日韩无套无码精品 | 国产在线无码精品电影网 | 日韩精品无码一区二区中文字幕 | 天天躁日日躁狠狠躁免费麻豆 | 色综合久久网 | 中文字幕无码av激情不卡 | 无码人妻少妇伦在线电影 | 小泽玛莉亚一区二区视频在线 | 日韩人妻少妇一区二区三区 | 亚洲人成网站在线播放942 | 2019nv天堂香蕉在线观看 | 无人区乱码一区二区三区 | 强伦人妻一区二区三区视频18 | 中文字幕av伊人av无码av | 日本在线高清不卡免费播放 | 国产午夜福利亚洲第一 | 四虎影视成人永久免费观看视频 | 国产香蕉97碰碰久久人人 | 国产精品久久久久久亚洲影视内衣 | 久久久av男人的天堂 | 亚洲午夜福利在线观看 | 亚洲国产精品成人久久蜜臀 | 久久国产精品萌白酱免费 | 国产精品美女久久久久av爽李琼 | 人妻天天爽夜夜爽一区二区 | 国产真实乱对白精彩久久 | 无码av最新清无码专区吞精 | 欧洲vodafone精品性 | 精品久久久中文字幕人妻 | 国产精品成人av在线观看 | 无码人妻黑人中文字幕 | 奇米影视7777久久精品 | 奇米影视7777久久精品人人爽 | 日韩人妻系列无码专区 | 国产疯狂伦交大片 | av人摸人人人澡人人超碰下载 | 亚洲成av人综合在线观看 | 久久久无码中文字幕久... | 国产熟妇高潮叫床视频播放 | 日韩无码专区 | 性生交大片免费看l | 国产99久久精品一区二区 | 性色欲网站人妻丰满中文久久不卡 | 熟妇人妻中文av无码 | 人人爽人人澡人人高潮 | 久久精品成人欧美大片 | 天天躁夜夜躁狠狠是什么心态 | www国产亚洲精品久久久日本 | 亚洲欧美日韩国产精品一区二区 | 内射巨臀欧美在线视频 | 真人与拘做受免费视频一 | 网友自拍区视频精品 | 麻豆成人精品国产免费 | 欧美性黑人极品hd | 亚洲成a人片在线观看无码3d | 99久久精品午夜一区二区 | 亚洲va中文字幕无码久久不卡 | 日韩欧美群交p片內射中文 | 特大黑人娇小亚洲女 | 又大又黄又粗又爽的免费视频 | 国产福利视频一区二区 | 97久久超碰中文字幕 | 久久久久久久久888 | 国产黄在线观看免费观看不卡 | 欧美一区二区三区视频在线观看 | 在线看片无码永久免费视频 | 啦啦啦www在线观看免费视频 | 无码人妻黑人中文字幕 | 任你躁国产自任一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 99久久亚洲精品无码毛片 | 日本乱偷人妻中文字幕 | 亚洲精品成人av在线 | 欧美性猛交内射兽交老熟妇 | 国产精品久久国产精品99 | 性啪啪chinese东北女人 | 国产精品无套呻吟在线 | 99精品国产综合久久久久五月天 | 成人欧美一区二区三区黑人 | 中国大陆精品视频xxxx | 国产综合在线观看 | 在线亚洲高清揄拍自拍一品区 | 亚洲国产精品成人久久蜜臀 | 成 人影片 免费观看 | 中文字幕无码免费久久9一区9 | 欧美自拍另类欧美综合图片区 | 麻豆果冻传媒2021精品传媒一区下载 | 国产精品久久久久久亚洲影视内衣 | 无码av最新清无码专区吞精 | 一本久久伊人热热精品中文字幕 | 中文字幕日产无线码一区 | 中文字幕乱码人妻二区三区 | 国产黄在线观看免费观看不卡 | 东北女人啪啪对白 | 一二三四在线观看免费视频 | 午夜精品久久久内射近拍高清 | 色综合久久久久综合一本到桃花网 | 国产精品久久国产精品99 | 国产午夜无码精品免费看 | a国产一区二区免费入口 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 暴力强奷在线播放无码 | 国产乱子伦视频在线播放 | 中文字幕色婷婷在线视频 | 小鲜肉自慰网站xnxx | 久久久久成人片免费观看蜜芽 | 99久久久无码国产aaa精品 | 亚洲欧美精品aaaaaa片 | 牲交欧美兽交欧美 | 老司机亚洲精品影院无码 | 亚洲高清偷拍一区二区三区 | 国产麻豆精品精东影业av网站 | 蜜桃视频韩日免费播放 | 2020久久超碰国产精品最新 | 欧美性猛交内射兽交老熟妇 | 欧美喷潮久久久xxxxx | 日韩av无码一区二区三区不卡 | 久久综合久久自在自线精品自 | 麻豆国产人妻欲求不满谁演的 | 亚洲七七久久桃花影院 | 免费无码av一区二区 | 亚洲毛片av日韩av无码 | 久久亚洲中文字幕无码 | 亚洲aⅴ无码成人网站国产app | 国产精品人人妻人人爽 | 亚洲精品www久久久 | 亚洲精品国产精品乱码不卡 | 成人女人看片免费视频放人 | 人人妻人人澡人人爽欧美精品 | 色一情一乱一伦一区二区三欧美 | 日日摸日日碰夜夜爽av | 狠狠亚洲超碰狼人久久 | 国产成人精品必看 | 国产亚洲精品久久久久久大师 | 亚洲 日韩 欧美 成人 在线观看 | 粉嫩少妇内射浓精videos | 一本加勒比波多野结衣 | 波多野结衣av一区二区全免费观看 | 日日天日日夜日日摸 | 亚洲春色在线视频 | 97夜夜澡人人爽人人喊中国片 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲人亚洲人成电影网站色 | 好屌草这里只有精品 | √天堂资源地址中文在线 | 久久国内精品自在自线 | 国产av无码专区亚洲awww | 蜜臀av无码人妻精品 | 亚洲娇小与黑人巨大交 | 亚洲国精产品一二二线 | 人人妻人人澡人人爽人人精品浪潮 | 中文字幕中文有码在线 | 久久国产精品二国产精品 | 精品无码国产一区二区三区av | 亚洲精品久久久久久一区二区 | 欧美日韩一区二区免费视频 | 18无码粉嫩小泬无套在线观看 | 天天做天天爱天天爽综合网 | 久久久久久a亚洲欧洲av冫 | 国产精品爱久久久久久久 | 国产亚洲精品久久久久久久久动漫 | 无码国产色欲xxxxx视频 | 成人精品视频一区二区三区尤物 | 在线成人www免费观看视频 | 国产在线一区二区三区四区五区 | 日本欧美一区二区三区乱码 | 99riav国产精品视频 | 97夜夜澡人人双人人人喊 | 呦交小u女精品视频 | 久久久精品456亚洲影院 | 性欧美videos高清精品 | a国产一区二区免费入口 | 老子影院午夜精品无码 | 亚洲国产精品久久久久久 | 女人被爽到呻吟gif动态图视看 | 色狠狠av一区二区三区 | 日韩亚洲欧美中文高清在线 | 波多野42部无码喷潮在线 | 特级做a爰片毛片免费69 | 日日碰狠狠躁久久躁蜜桃 | 男女超爽视频免费播放 | 女人被爽到呻吟gif动态图视看 | 少妇性荡欲午夜性开放视频剧场 | 无人区乱码一区二区三区 | 成人免费视频视频在线观看 免费 | 精品乱码久久久久久久 | 久久这里只有精品视频9 | 亚洲国产精品无码久久久久高潮 | 色婷婷综合激情综在线播放 | 久久久无码中文字幕久... | 精品无码av一区二区三区 | 俺去俺来也www色官网 | 久久亚洲精品成人无码 | 国产精品久久久一区二区三区 | 亚洲综合精品香蕉久久网 | 国产三级久久久精品麻豆三级 | 久久亚洲国产成人精品性色 | 国产又粗又硬又大爽黄老大爷视 | av人摸人人人澡人人超碰下载 | 日本大香伊一区二区三区 | 偷窥村妇洗澡毛毛多 | 精品久久久久久人妻无码中文字幕 | 午夜成人1000部免费视频 | 国产成人无码专区 | 18禁止看的免费污网站 | 国产精品永久免费视频 | 国产精品亚洲一区二区三区喷水 | 女人被男人爽到呻吟的视频 | 欧洲极品少妇 | 爽爽影院免费观看 | 免费无码午夜福利片69 | 黑人巨大精品欧美黑寡妇 | 骚片av蜜桃精品一区 | 亚洲精品国偷拍自产在线麻豆 | 国产亚洲视频中文字幕97精品 | 好男人社区资源 | 精品国产一区av天美传媒 | 婷婷五月综合缴情在线视频 | 亚洲 日韩 欧美 成人 在线观看 | 日韩av无码中文无码电影 | 男人的天堂av网站 | 久久天天躁狠狠躁夜夜免费观看 | 日欧一片内射va在线影院 | 爽爽影院免费观看 | 成人无码精品1区2区3区免费看 | 亚洲精品一区二区三区大桥未久 | 国产97人人超碰caoprom | 疯狂三人交性欧美 | 久久99国产综合精品 | 久久99久久99精品中文字幕 | 麻豆蜜桃av蜜臀av色欲av | 波多野结衣一区二区三区av免费 | 黑人粗大猛烈进出高潮视频 | 妺妺窝人体色www在线小说 | 成人精品视频一区二区 | av无码电影一区二区三区 | 亚洲理论电影在线观看 | 5858s亚洲色大成网站www | 国产精品福利视频导航 | 亚洲熟妇自偷自拍另类 | 亚洲精品www久久久 | 国产成人精品优优av | а√资源新版在线天堂 | 亚洲爆乳精品无码一区二区三区 | 激情爆乳一区二区三区 | 国产精品丝袜黑色高跟鞋 | 国产精品怡红院永久免费 | 成人动漫在线观看 | 蜜桃无码一区二区三区 | 国产精品无码一区二区三区不卡 | 精品无人国产偷自产在线 | 午夜不卡av免费 一本久久a久久精品vr综合 | 成熟妇人a片免费看网站 | 日日摸夜夜摸狠狠摸婷婷 | 男女超爽视频免费播放 | 久久国语露脸国产精品电影 | 好屌草这里只有精品 | 对白脏话肉麻粗话av | 综合激情五月综合激情五月激情1 | 久久久久久av无码免费看大片 | 俺去俺来也在线www色官网 | 国产精品高潮呻吟av久久4虎 | 亚洲一区二区三区 | 国内精品久久毛片一区二区 | 国产精品无码永久免费888 | 久久aⅴ免费观看 | 国产激情艳情在线看视频 | 未满成年国产在线观看 | 精品aⅴ一区二区三区 | 无码一区二区三区在线观看 | 久久视频在线观看精品 | 免费无码一区二区三区蜜桃大 | 国产精品人妻一区二区三区四 | 久久久亚洲欧洲日产国码αv | 国产办公室秘书无码精品99 | 荫蒂被男人添的好舒服爽免费视频 | 成 人 免费观看网站 | 亚洲综合无码一区二区三区 | 亚洲大尺度无码无码专区 | 亚洲人成人无码网www国产 | 成年美女黄网站色大免费全看 | 亚洲中文字幕va福利 | 国产成人综合美国十次 | 精品亚洲韩国一区二区三区 | 日本乱人伦片中文三区 | 成人女人看片免费视频放人 | 永久黄网站色视频免费直播 | 国产精品99久久精品爆乳 | 久久久久成人片免费观看蜜芽 | 荫蒂被男人添的好舒服爽免费视频 | 久久婷婷五月综合色国产香蕉 | 熟妇人妻无乱码中文字幕 | 亚洲欧美综合区丁香五月小说 | 激情国产av做激情国产爱 | 性欧美大战久久久久久久 | 日本一区二区更新不卡 | 国产超碰人人爽人人做人人添 | 无码人妻少妇伦在线电影 | 日日橹狠狠爱欧美视频 | 久久熟妇人妻午夜寂寞影院 | 欧美xxxx黑人又粗又长 | 思思久久99热只有频精品66 | 久久99热只有频精品8 | 久9re热视频这里只有精品 | 国产精品成人av在线观看 | 一本久久a久久精品vr综合 | 日韩人妻系列无码专区 | 婷婷六月久久综合丁香 | 99er热精品视频 | 亚洲小说图区综合在线 | 麻豆国产人妻欲求不满 | 午夜精品一区二区三区的区别 | 久久久久久国产精品无码下载 | 蜜臀av在线播放 久久综合激激的五月天 | 最近免费中文字幕中文高清百度 | 国产午夜亚洲精品不卡下载 | 国产亚洲精品久久久ai换 | 久久久久亚洲精品中文字幕 | 亚无码乱人伦一区二区 | 男人的天堂2018无码 | 国产精品亚洲lv粉色 | yw尤物av无码国产在线观看 | 天堂а√在线地址中文在线 | 国产舌乚八伦偷品w中 | 国精产品一品二品国精品69xx | 1000部夫妻午夜免费 | 国产成人精品无码播放 | 欧美放荡的少妇 | 六十路熟妇乱子伦 | 两性色午夜免费视频 | 久久久久久九九精品久 | 国产偷国产偷精品高清尤物 | 国内少妇偷人精品视频 | 婷婷综合久久中文字幕蜜桃三电影 | 无码午夜成人1000部免费视频 | 粉嫩少妇内射浓精videos | 免费无码一区二区三区蜜桃大 | a在线亚洲男人的天堂 | 亚洲色www成人永久网址 | 欧美日韩在线亚洲综合国产人 | 性欧美疯狂xxxxbbbb | 亚洲国产精品美女久久久久 | 西西人体www44rt大胆高清 | 国产成人综合色在线观看网站 | 国产精品香蕉在线观看 | 男人和女人高潮免费网站 | 免费人成网站视频在线观看 | 色婷婷综合中文久久一本 | 精品国产av色一区二区深夜久久 | 久久国产劲爆∧v内射 | 色婷婷欧美在线播放内射 | 国内精品一区二区三区不卡 | 亚洲国产精品无码久久久久高潮 | 久久久精品国产sm最大网站 | 国产高潮视频在线观看 | 亚洲色偷偷男人的天堂 | 国产成人综合色在线观看网站 | 国产成人亚洲综合无码 | 成人亚洲精品久久久久软件 | 中文字幕无码人妻少妇免费 | 伊人久久大香线蕉亚洲 | 人妻有码中文字幕在线 | 中文字幕久久久久人妻 | 成人欧美一区二区三区黑人免费 | 九九久久精品国产免费看小说 | 久久久久久九九精品久 | 自拍偷自拍亚洲精品被多人伦好爽 | aⅴ在线视频男人的天堂 | 欧美亚洲国产一区二区三区 | 伊在人天堂亚洲香蕉精品区 | 粉嫩少妇内射浓精videos | 正在播放东北夫妻内射 | 久久亚洲a片com人成 | 欧美黑人性暴力猛交喷水 | 男女超爽视频免费播放 | 国产成人综合色在线观看网站 | 精品午夜福利在线观看 | 欧洲极品少妇 | 欧美人妻一区二区三区 | 精品无码一区二区三区的天堂 | 少女韩国电视剧在线观看完整 | 粗大的内捧猛烈进出视频 | 国产两女互慰高潮视频在线观看 | 亚洲自偷自偷在线制服 | 天堂一区人妻无码 | 亚拍精品一区二区三区探花 | 国内综合精品午夜久久资源 | 乱人伦人妻中文字幕无码久久网 | 精品久久久久香蕉网 | 又大又硬又黄的免费视频 | 国产精品久久久久无码av色戒 | 日本又色又爽又黄的a片18禁 | 粗大的内捧猛烈进出视频 | 玩弄人妻少妇500系列视频 | 久久视频在线观看精品 | 久久精品国产大片免费观看 | 蜜桃视频插满18在线观看 | 无码成人精品区在线观看 | 亚洲 欧美 激情 小说 另类 | 亚洲国产成人a精品不卡在线 | 精品国产成人一区二区三区 | 国产又爽又黄又刺激的视频 | 成人欧美一区二区三区黑人免费 | 国产精品久久久久无码av色戒 | 特级做a爰片毛片免费69 | 国产av久久久久精东av | 日韩人妻系列无码专区 | 一本久道久久综合婷婷五月 | 亚洲中文字幕在线观看 | 成熟妇人a片免费看网站 | 人人妻人人澡人人爽欧美一区九九 | 欧美一区二区三区视频在线观看 | 亚洲成a人片在线观看无码3d | 性做久久久久久久免费看 | 国产高清不卡无码视频 | 欧美变态另类xxxx | 国产精品亚洲综合色区韩国 | 亚洲中文字幕在线无码一区二区 | 亚洲色大成网站www | 国产在线aaa片一区二区99 | 国产美女精品一区二区三区 | 男人扒开女人内裤强吻桶进去 | 国产人妻精品一区二区三区不卡 | 亚洲国产精品一区二区第一页 | 亚洲成av人片在线观看无码不卡 | 亚洲一区二区三区偷拍女厕 | 又大又硬又爽免费视频 | 一本久久a久久精品vr综合 | 大色综合色综合网站 | 亚洲 a v无 码免 费 成 人 a v | 亚洲色欲久久久综合网东京热 | 最近中文2019字幕第二页 | 久久亚洲中文字幕精品一区 | 久久久久久a亚洲欧洲av冫 | 人人澡人人妻人人爽人人蜜桃 | 色综合久久中文娱乐网 | 精品国精品国产自在久国产87 | 麻豆国产丝袜白领秘书在线观看 | 中文字幕日产无线码一区 | 在线精品国产一区二区三区 | 精品国产麻豆免费人成网站 | 久久精品人妻少妇一区二区三区 | 妺妺窝人体色www婷婷 | 亚洲精品久久久久久一区二区 | 亚洲毛片av日韩av无码 | 国内综合精品午夜久久资源 | 欧美日韩一区二区三区自拍 | 亚洲成在人网站无码天堂 | 中文亚洲成a人片在线观看 | 扒开双腿疯狂进出爽爽爽视频 | av在线亚洲欧洲日产一区二区 | 中国大陆精品视频xxxx | 自拍偷自拍亚洲精品被多人伦好爽 | 99精品国产综合久久久久五月天 | 1000部啪啪未满十八勿入下载 | 狂野欧美激情性xxxx | 国产精华av午夜在线观看 | 免费乱码人妻系列无码专区 | 亚洲色无码一区二区三区 | 久久精品人人做人人综合 | 日日鲁鲁鲁夜夜爽爽狠狠 | 免费人成网站视频在线观看 | 国产精品99爱免费视频 | 国产av无码专区亚洲a∨毛片 | 亚洲人亚洲人成电影网站色 | 漂亮人妻洗澡被公强 日日躁 | 欧美精品国产综合久久 | 欧美丰满老熟妇xxxxx性 | 少妇人妻av毛片在线看 | 荫蒂被男人添的好舒服爽免费视频 | 美女毛片一区二区三区四区 | 久久久久久av无码免费看大片 | 青青久在线视频免费观看 | 一个人看的www免费视频在线观看 | 1000部啪啪未满十八勿入下载 | 99久久久国产精品无码免费 | 呦交小u女精品视频 | 强辱丰满人妻hd中文字幕 | 国产精品丝袜黑色高跟鞋 | 亚洲爆乳精品无码一区二区三区 | 日本精品久久久久中文字幕 | 亚洲精品一区国产 | 久久精品一区二区三区四区 | 久久午夜夜伦鲁鲁片无码免费 | 国产性生大片免费观看性 | 国产成人午夜福利在线播放 | 国产日产欧产精品精品app | 亚洲色在线无码国产精品不卡 | 99久久精品午夜一区二区 | 十八禁视频网站在线观看 | 午夜无码人妻av大片色欲 | 午夜性刺激在线视频免费 | 久久国产精品萌白酱免费 | 久热国产vs视频在线观看 | 精品久久久无码人妻字幂 | 亚洲国产午夜精品理论片 | √天堂中文官网8在线 | 中文无码成人免费视频在线观看 | 牲欲强的熟妇农村老妇女 | 色综合视频一区二区三区 | 国产精品视频免费播放 | 国产精品久久久av久久久 | 亚洲精品美女久久久久久久 | 中文无码成人免费视频在线观看 | 午夜不卡av免费 一本久久a久久精品vr综合 | 久久国产精品精品国产色婷婷 | 国产人妻精品一区二区三区不卡 | 国语精品一区二区三区 | 精品无码国产一区二区三区av | 强伦人妻一区二区三区视频18 | 日韩av无码一区二区三区 | 国产激情艳情在线看视频 | 狠狠综合久久久久综合网 | 欧美亚洲国产一区二区三区 | 日本精品少妇一区二区三区 | 国产超级va在线观看视频 | 日韩精品无码免费一区二区三区 | 性欧美videos高清精品 | 中文字幕亚洲情99在线 | 任你躁国产自任一区二区三区 | 丝袜 中出 制服 人妻 美腿 | 成熟人妻av无码专区 | 免费无码午夜福利片69 | 狠狠亚洲超碰狼人久久 | 永久免费观看国产裸体美女 | 日欧一片内射va在线影院 | 性欧美大战久久久久久久 | 狠狠色丁香久久婷婷综合五月 | 日本xxxx色视频在线观看免费 | 免费看少妇作爱视频 | 美女张开腿让人桶 | 久久视频在线观看精品 | 日日摸夜夜摸狠狠摸婷婷 | 纯爱无遮挡h肉动漫在线播放 | 日韩少妇白浆无码系列 | 黑人巨大精品欧美一区二区 | 国产精品鲁鲁鲁 | 97人妻精品一区二区三区 | 在线观看国产午夜福利片 | 免费男性肉肉影院 | 亚洲国产日韩a在线播放 | 亚洲综合久久一区二区 | 亚洲国产成人a精品不卡在线 | 小sao货水好多真紧h无码视频 | 亚洲精品一区二区三区四区五区 | 欧美老妇与禽交 | 中文字幕乱妇无码av在线 | 女人被男人躁得好爽免费视频 | 国产又粗又硬又大爽黄老大爷视 | 中文久久乱码一区二区 | 日本熟妇人妻xxxxx人hd | 国产精品久久久久影院嫩草 | 亚洲成熟女人毛毛耸耸多 | 亚洲の无码国产の无码影院 | 久久99热只有频精品8 | 亚洲狠狠色丁香婷婷综合 | 日本熟妇人妻xxxxx人hd | 久久久无码中文字幕久... | 樱花草在线播放免费中文 | 久久久久久久女国产乱让韩 | 国产精品va在线播放 | 久久伊人色av天堂九九小黄鸭 | 亚洲爆乳无码专区 | 亚洲成av人综合在线观看 | 久久久久亚洲精品中文字幕 | 欧美午夜特黄aaaaaa片 | 人人澡人人透人人爽 | 自拍偷自拍亚洲精品10p | 在线观看欧美一区二区三区 | 午夜精品一区二区三区的区别 | 内射老妇bbwx0c0ck | 精品乱子伦一区二区三区 | 欧美丰满少妇xxxx性 | 特黄特色大片免费播放器图片 | 国产色精品久久人妻 | 亚洲精品无码国产 | 亚洲中文字幕成人无码 | 日韩精品无码免费一区二区三区 | 青青久在线视频免费观看 | 少妇无码一区二区二三区 | 久久久久久久久888 | 欧美老妇与禽交 | 99久久精品日本一区二区免费 | 国产国语老龄妇女a片 | 中文无码精品a∨在线观看不卡 | 欧美日韩人成综合在线播放 | 国内精品久久久久久中文字幕 | 丝袜美腿亚洲一区二区 | 欧美35页视频在线观看 | 99久久人妻精品免费二区 | 中文字幕日产无线码一区 | 黄网在线观看免费网站 | 人人妻人人澡人人爽欧美一区 | 日本精品少妇一区二区三区 | 欧美国产日韩久久mv | 亚洲日韩av一区二区三区中文 | 久久久www成人免费毛片 | 久久国内精品自在自线 | 人人澡人人透人人爽 | 中文字幕 人妻熟女 | 在线 国产 欧美 亚洲 天堂 | 欧美人与牲动交xxxx | 色综合视频一区二区三区 | 国产免费久久久久久无码 | 日本护士xxxxhd少妇 | 99精品视频在线观看免费 | 精品日本一区二区三区在线观看 | 国产亚洲精品精品国产亚洲综合 | 在线成人www免费观看视频 | 国产莉萝无码av在线播放 | 伊人久久婷婷五月综合97色 | 免费人成网站视频在线观看 | 成人无码视频免费播放 | 久久久精品欧美一区二区免费 | 国产午夜亚洲精品不卡下载 | 99精品无人区乱码1区2区3区 | 国产精品久久久久久亚洲毛片 | 成 人影片 免费观看 | 亚洲无人区午夜福利码高清完整版 | 国产亚洲精品久久久久久国模美 | 波多野结衣一区二区三区av免费 | 国产精品无码永久免费888 | 少妇无码av无码专区在线观看 | 久久久久久九九精品久 | 搡女人真爽免费视频大全 | 国产精品无码一区二区桃花视频 | 无码人妻久久一区二区三区不卡 | 色综合久久久无码中文字幕 | 日本免费一区二区三区最新 | 精品久久久久久人妻无码中文字幕 | 国产亚洲日韩欧美另类第八页 | 少妇高潮喷潮久久久影院 | 国产午夜精品一区二区三区嫩草 | 鲁鲁鲁爽爽爽在线视频观看 | 帮老师解开蕾丝奶罩吸乳网站 | 国产乱人伦偷精品视频 | v一区无码内射国产 | 国产精品无套呻吟在线 | 亚洲日韩一区二区三区 | 精品国产精品久久一区免费式 | 丰满人妻一区二区三区免费视频 | 蜜桃视频插满18在线观看 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲成色www久久网站 | 亚洲精品成a人在线观看 | 婷婷六月久久综合丁香 | 色婷婷综合激情综在线播放 | 久久久久人妻一区精品色欧美 | 正在播放老肥熟妇露脸 | 人人妻人人澡人人爽欧美一区九九 | 欧美性生交xxxxx久久久 | 亚洲自偷自偷在线制服 | 丰满少妇女裸体bbw | 亚洲精品综合一区二区三区在线 | 亚洲国产成人av在线观看 | 天堂亚洲免费视频 | 成人精品天堂一区二区三区 | 激情内射亚州一区二区三区爱妻 | 久久久www成人免费毛片 | 福利一区二区三区视频在线观看 | 欧美一区二区三区 | 久久亚洲中文字幕无码 | 成人免费视频视频在线观看 免费 | 俺去俺来也在线www色官网 | 少妇人妻偷人精品无码视频 | www国产亚洲精品久久网站 | 日韩欧美中文字幕在线三区 | 中文字幕日产无线码一区 | 亚洲高清偷拍一区二区三区 | 捆绑白丝粉色jk震动捧喷白浆 | 黑人巨大精品欧美黑寡妇 | 国产成人无码av一区二区 | 婷婷综合久久中文字幕蜜桃三电影 | 中文字幕精品av一区二区五区 | 久久国语露脸国产精品电影 | 亚洲自偷自拍另类第1页 | 久久熟妇人妻午夜寂寞影院 | 色妞www精品免费视频 | 精品无码av一区二区三区 | 国产精品久久久午夜夜伦鲁鲁 | 欧美精品一区二区精品久久 | 国产精品国产自线拍免费软件 | 久久亚洲精品中文字幕无男同 | 曰韩少妇内射免费播放 | 日韩少妇白浆无码系列 | 一本久道久久综合婷婷五月 | 精品欧美一区二区三区久久久 | 日韩精品一区二区av在线 | 国内揄拍国内精品人妻 | 国产色视频一区二区三区 | 精品一区二区不卡无码av | 亚洲日本在线电影 | 国产精品爱久久久久久久 | 四虎国产精品一区二区 | 久久亚洲中文字幕精品一区 | 无码国产乱人伦偷精品视频 | 动漫av一区二区在线观看 | 日韩欧美成人免费观看 | 亚洲日韩乱码中文无码蜜桃臀网站 | 久久 国产 尿 小便 嘘嘘 | 中文字幕乱码人妻无码久久 | 国产成人精品三级麻豆 | 日韩亚洲欧美精品综合 | 无码毛片视频一区二区本码 | 久久五月精品中文字幕 | 久久久久久国产精品无码下载 | 亚洲精品欧美二区三区中文字幕 | 久久精品国产日本波多野结衣 | 精品国产一区二区三区四区在线看 | 无遮挡国产高潮视频免费观看 | 青草视频在线播放 | 色一情一乱一伦一区二区三欧美 | 高清国产亚洲精品自在久久 | 国产小呦泬泬99精品 | 日本爽爽爽爽爽爽在线观看免 | 欧美三级不卡在线观看 | 一区二区三区高清视频一 | 国产精品香蕉在线观看 | 丰满护士巨好爽好大乳 | 欧美丰满老熟妇xxxxx性 | 天堂无码人妻精品一区二区三区 | 小sao货水好多真紧h无码视频 | 日韩av无码一区二区三区 | 午夜精品久久久内射近拍高清 | 中文字幕无码av波多野吉衣 | 免费国产黄网站在线观看 | 18精品久久久无码午夜福利 | 久久久久久av无码免费看大片 | 鲁鲁鲁爽爽爽在线视频观看 | 中文字幕亚洲情99在线 | 日本一区二区更新不卡 | 亚洲 日韩 欧美 成人 在线观看 | 精品无人国产偷自产在线 | 成熟女人特级毛片www免费 | 日本xxxx色视频在线观看免费 | 99久久久无码国产aaa精品 | 丰满人妻一区二区三区免费视频 | 国产无套粉嫩白浆在线 | 国产精品毛多多水多 | 国产免费久久精品国产传媒 | 精品夜夜澡人妻无码av蜜桃 | 图片区 小说区 区 亚洲五月 | 国产内射老熟女aaaa | 国产精品香蕉在线观看 | 亚洲国产精品久久久天堂 | 精品无人区无码乱码毛片国产 | 亚洲va欧美va天堂v国产综合 | 中文字幕人成乱码熟女app | 国产精品内射视频免费 | 白嫩日本少妇做爰 | 日本爽爽爽爽爽爽在线观看免 | 亚洲精品成人av在线 | 搡女人真爽免费视频大全 | 色偷偷人人澡人人爽人人模 | 午夜免费福利小电影 | 久久久国产精品无码免费专区 | 欧美日韩综合一区二区三区 | 无码人妻丰满熟妇区毛片18 | 日韩精品无码一区二区中文字幕 | 少妇性俱乐部纵欲狂欢电影 | 亚洲精品成人福利网站 | 小泽玛莉亚一区二区视频在线 | 无码任你躁久久久久久久 | 亚洲乱码日产精品bd | 久久国产自偷自偷免费一区调 | 无码任你躁久久久久久久 | 亚洲熟妇自偷自拍另类 | 国产一精品一av一免费 | 捆绑白丝粉色jk震动捧喷白浆 | 欧美色就是色 | 国产农村乱对白刺激视频 | 欧美人与物videos另类 | 色偷偷人人澡人人爽人人模 | 欧美激情一区二区三区成人 | 亚洲精品一区三区三区在线观看 | 性色av无码免费一区二区三区 | 麻豆精品国产精华精华液好用吗 | 大肉大捧一进一出好爽视频 | 久久精品国产亚洲精品 | 成人免费视频视频在线观看 免费 | 国产内射爽爽大片视频社区在线 | 好男人社区资源 | а√天堂www在线天堂小说 | 88国产精品欧美一区二区三区 | 熟妇人妻中文av无码 | 免费人成网站视频在线观看 | 午夜精品一区二区三区在线观看 | 亚洲成av人影院在线观看 | 亚洲狠狠色丁香婷婷综合 | 欧洲欧美人成视频在线 | 久久久精品欧美一区二区免费 | 国产熟女一区二区三区四区五区 | 久久久亚洲欧洲日产国码αv | 麻豆精品国产精华精华液好用吗 | 免费国产成人高清在线观看网站 | 精品久久久无码中文字幕 | 国产 浪潮av性色四虎 | 亚洲日韩av片在线观看 | 国内精品久久久久久中文字幕 | 领导边摸边吃奶边做爽在线观看 | 国产美女极度色诱视频www | 久久久国产精品无码免费专区 | 夜夜高潮次次欢爽av女 | 国产特级毛片aaaaaa高潮流水 | 亚洲春色在线视频 | 日本一区二区三区免费播放 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲国产精品无码久久久久高潮 | 女人被男人爽到呻吟的视频 | 青春草在线视频免费观看 | 亚洲一区av无码专区在线观看 | 亚洲精品一区国产 | 少妇性俱乐部纵欲狂欢电影 | 97精品人妻一区二区三区香蕉 | 日韩亚洲欧美精品综合 | 中文字幕av伊人av无码av | 国产小呦泬泬99精品 | 久久午夜无码鲁丝片午夜精品 | 色婷婷香蕉在线一区二区 | 亚洲成熟女人毛毛耸耸多 | 免费乱码人妻系列无码专区 | 日日碰狠狠躁久久躁蜜桃 | 两性色午夜视频免费播放 | 在线a亚洲视频播放在线观看 | 精品水蜜桃久久久久久久 | 色一情一乱一伦一区二区三欧美 | 国语自产偷拍精品视频偷 | 日本乱人伦片中文三区 | 精品夜夜澡人妻无码av蜜桃 | 国内精品九九久久久精品 | 在线视频网站www色 | 欧美成人免费全部网站 | 国产精品高潮呻吟av久久4虎 | 三级4级全黄60分钟 | 国产色精品久久人妻 | 丝袜美腿亚洲一区二区 | 国产午夜精品一区二区三区嫩草 | 日本精品高清一区二区 | 国产舌乚八伦偷品w中 | 少妇被粗大的猛进出69影院 | 国产亚洲精品久久久久久国模美 | 国产亚洲精品久久久久久大师 | 婷婷综合久久中文字幕蜜桃三电影 | 色情久久久av熟女人妻网站 | 国产色xx群视频射精 | 少女韩国电视剧在线观看完整 | 日本va欧美va欧美va精品 | 无码人妻av免费一区二区三区 | 亚洲欧美综合区丁香五月小说 | 四虎永久在线精品免费网址 | 国产熟妇另类久久久久 | 亚洲日韩精品欧美一区二区 | 国产亚洲美女精品久久久2020 | 国精产品一品二品国精品69xx | 久久精品国产一区二区三区肥胖 | 中文字幕av日韩精品一区二区 | 亚洲一区二区三区国产精华液 | 1000部啪啪未满十八勿入下载 | 久久精品女人天堂av免费观看 | 色欲人妻aaaaaaa无码 | 在线观看欧美一区二区三区 | 少妇愉情理伦片bd | 欧洲美熟女乱又伦 | 国产三级久久久精品麻豆三级 | 精品一区二区三区波多野结衣 | 久久国产劲爆∧v内射 | 成人无码精品一区二区三区 | 亚洲国产精品久久人人爱 | 国产性生交xxxxx无码 | 国产99久久精品一区二区 | 国产农村乱对白刺激视频 | 自拍偷自拍亚洲精品10p | 美女黄网站人色视频免费国产 | 人妻少妇精品久久 | 蜜桃视频韩日免费播放 | 粉嫩少妇内射浓精videos | 国产偷抇久久精品a片69 | 国内精品久久久久久中文字幕 | 2019午夜福利不卡片在线 | 国产亚洲tv在线观看 | 老熟女乱子伦 | 日韩人妻无码一区二区三区久久99 | 亚洲天堂2017无码中文 | 欧美亚洲国产一区二区三区 | 蜜臀av无码人妻精品 | 国产九九九九九九九a片 | ass日本丰满熟妇pics | 鲁鲁鲁爽爽爽在线视频观看 | 久久久精品456亚洲影院 | 国产精品久久久久无码av色戒 | 国产成人一区二区三区在线观看 | 午夜理论片yy44880影院 | 久久国产36精品色熟妇 | 东京热一精品无码av | 鲁一鲁av2019在线 | 亚洲一区二区三区四区 | 中文字幕人妻无码一区二区三区 | 久久久久免费精品国产 | 欧美国产日韩久久mv | 亚洲欧美中文字幕5发布 | 美女毛片一区二区三区四区 | 亚洲a无码综合a国产av中文 | 国内精品久久久久久中文字幕 | 欧美日韩人成综合在线播放 | 美女张开腿让人桶 | 全黄性性激高免费视频 | 九九热爱视频精品 | 日产精品99久久久久久 | 中文毛片无遮挡高清免费 | 5858s亚洲色大成网站www | 亚洲国产av精品一区二区蜜芽 | 人妻互换免费中文字幕 | 成年美女黄网站色大免费视频 | 欧美 丝袜 自拍 制服 另类 | 荫蒂被男人添的好舒服爽免费视频 | 久久国产精品萌白酱免费 | 国产成人精品必看 | 熟妇人妻无码xxx视频 | 国产黄在线观看免费观看不卡 | 无码吃奶揉捏奶头高潮视频 | 婷婷五月综合激情中文字幕 | 欧美国产亚洲日韩在线二区 | 国产激情艳情在线看视频 | 又大又黄又粗又爽的免费视频 | 久久精品女人的天堂av | 亚洲爆乳无码专区 | 99久久久无码国产精品免费 | 成年女人永久免费看片 | 久久精品国产一区二区三区肥胖 | 亚洲熟熟妇xxxx | 国产成人午夜福利在线播放 | 蜜桃视频插满18在线观看 | 人妻少妇精品视频专区 | 大色综合色综合网站 | 麻豆果冻传媒2021精品传媒一区下载 | 精品国产av色一区二区深夜久久 | 亚洲欧洲中文日韩av乱码 | 人妻无码αv中文字幕久久琪琪布 | 亚洲精品久久久久中文第一幕 | 免费网站看v片在线18禁无码 | 领导边摸边吃奶边做爽在线观看 | 国内揄拍国内精品人妻 | 国产人妖乱国产精品人妖 | 日韩av无码一区二区三区不卡 | 亚洲最大成人网站 | 国产精品人妻一区二区三区四 | 久久亚洲精品成人无码 | 真人与拘做受免费视频一 | 久久99热只有频精品8 | 国产亚洲精品久久久久久国模美 | 国产高潮视频在线观看 | 国产成人精品一区二区在线小狼 | 欧美丰满老熟妇xxxxx性 | 精品少妇爆乳无码av无码专区 | 小泽玛莉亚一区二区视频在线 | 纯爱无遮挡h肉动漫在线播放 | 国产午夜视频在线观看 | 久久亚洲精品成人无码 | 熟女少妇在线视频播放 | 一区二区三区乱码在线 | 欧洲 | 国产乡下妇女做爰 | 国产手机在线αⅴ片无码观看 | 日本一卡2卡3卡四卡精品网站 | 成人欧美一区二区三区黑人 | 国产黑色丝袜在线播放 | 亚洲色偷偷男人的天堂 | 亚洲中文字幕无码一久久区 | 久久zyz资源站无码中文动漫 | 无码播放一区二区三区 | 无码人妻黑人中文字幕 | 成人无码视频在线观看网站 | 亚洲欧美国产精品专区久久 | 一本大道久久东京热无码av | 少妇无码一区二区二三区 | 日日麻批免费40分钟无码 | 精品国产一区二区三区av 性色 | 亚洲精品中文字幕 | 亚洲色www成人永久网址 | 亚洲中文字幕无码中文字在线 | 野狼第一精品社区 | 久久精品视频在线看15 | 欧美猛少妇色xxxxx | 一本久道久久综合婷婷五月 | 国产亲子乱弄免费视频 | 国产两女互慰高潮视频在线观看 | 色综合视频一区二区三区 | 熟女少妇人妻中文字幕 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲中文字幕久久无码 | 久久久中文字幕日本无吗 | 中文字幕色婷婷在线视频 | 久久精品国产99久久6动漫 | 亚洲精品综合一区二区三区在线 | 啦啦啦www在线观看免费视频 | 清纯唯美经典一区二区 | 少妇被黑人到高潮喷出白浆 | 思思久久99热只有频精品66 | 久久综合网欧美色妞网 | 狂野欧美性猛交免费视频 | 亚洲の无码国产の无码步美 | 99久久精品无码一区二区毛片 | 色狠狠av一区二区三区 | 国产精品理论片在线观看 | 久久精品国产99久久6动漫 | 无遮挡啪啪摇乳动态图 | 九九综合va免费看 | 精品人妻av区 | 亚洲国产精品无码久久久久高潮 | 中文字幕乱妇无码av在线 | 人妻无码久久精品人妻 | 欧美一区二区三区视频在线观看 | 欧美性猛交xxxx富婆 | 欧美野外疯狂做受xxxx高潮 | 久久精品视频在线看15 | 西西人体www44rt大胆高清 | 波多野结衣av一区二区全免费观看 | 午夜福利电影 | 国产精品.xx视频.xxtv | 亚洲综合另类小说色区 | 国产成人无码av片在线观看不卡 | 无码乱肉视频免费大全合集 | 国产精品亚洲lv粉色 | 久久精品国产大片免费观看 | 欧美老熟妇乱xxxxx | 一本一道久久综合久久 | 日韩人妻少妇一区二区三区 | 国产精品怡红院永久免费 | 国产香蕉尹人视频在线 | 99er热精品视频 | 无码人妻精品一区二区三区不卡 | 女人高潮内射99精品 | 乱中年女人伦av三区 | 国产特级毛片aaaaaa高潮流水 | 色偷偷人人澡人人爽人人模 | 亚洲精品一区二区三区在线观看 | 国产97人人超碰caoprom | 精品无人国产偷自产在线 | 麻豆国产丝袜白领秘书在线观看 | 日本www一道久久久免费榴莲 | 精品无人区无码乱码毛片国产 | 久久精品丝袜高跟鞋 | 草草网站影院白丝内射 | 十八禁真人啪啪免费网站 | 小sao货水好多真紧h无码视频 | 图片区 小说区 区 亚洲五月 | 国产特级毛片aaaaaa高潮流水 | 东京一本一道一二三区 | 伊人久久婷婷五月综合97色 | 成人综合网亚洲伊人 | 欧美黑人乱大交 | 在线a亚洲视频播放在线观看 | 国产激情无码一区二区 | 少妇无码av无码专区在线观看 | 亚洲欧美国产精品专区久久 | 中文字幕中文有码在线 | 中文字幕无码av波多野吉衣 | 秋霞成人午夜鲁丝一区二区三区 | 初尝人妻少妇中文字幕 | 麻豆果冻传媒2021精品传媒一区下载 | 国产午夜手机精彩视频 | 丰满妇女强制高潮18xxxx | 欧美zoozzooz性欧美 | 亚洲日本一区二区三区在线 | 国产极品视觉盛宴 | 亚洲国产一区二区三区在线观看 | 国产人妻精品一区二区三区不卡 | 性欧美疯狂xxxxbbbb | 国产精品手机免费 | 日本xxxx色视频在线观看免费 | 精品亚洲韩国一区二区三区 | 7777奇米四色成人眼影 | 国产精品无码mv在线观看 | 亚洲日韩一区二区 | 日日麻批免费40分钟无码 | 国产av人人夜夜澡人人爽麻豆 | 97夜夜澡人人爽人人喊中国片 | 中文字幕av伊人av无码av | 久青草影院在线观看国产 | 亚洲精品一区二区三区在线 | 精品久久久中文字幕人妻 | 强伦人妻一区二区三区视频18 | 中文字幕乱码中文乱码51精品 | 在线a亚洲视频播放在线观看 | 99久久人妻精品免费一区 | 久久久中文字幕日本无吗 | 亚洲精品一区二区三区四区五区 | 性色av无码免费一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 日韩人妻系列无码专区 | 妺妺窝人体色www在线小说 | 人人澡人人妻人人爽人人蜜桃 | 荫蒂被男人添的好舒服爽免费视频 | 无码午夜成人1000部免费视频 | 久久久久久久女国产乱让韩 | 少妇厨房愉情理9仑片视频 | 欧美日韩在线亚洲综合国产人 | 中文字幕人妻丝袜二区 | 99久久精品日本一区二区免费 | 奇米影视7777久久精品人人爽 | 99久久婷婷国产综合精品青草免费 | 性欧美牲交xxxxx视频 | 免费无码肉片在线观看 | 小泽玛莉亚一区二区视频在线 | 久久亚洲国产成人精品性色 | 国产亚av手机在线观看 | 日本高清一区免费中文视频 | 国产成人精品无码播放 | 亚洲精品成人福利网站 | 日日躁夜夜躁狠狠躁 | 亲嘴扒胸摸屁股激烈网站 | 一本一道久久综合久久 | 国产69精品久久久久app下载 | 99麻豆久久久国产精品免费 | 天天躁日日躁狠狠躁免费麻豆 | 黄网在线观看免费网站 | 欧美xxxxx精品 | 九月婷婷人人澡人人添人人爽 | 久久精品人人做人人综合 | 人人妻人人澡人人爽欧美一区 | 久久久无码中文字幕久... | 女人被男人躁得好爽免费视频 | 日日碰狠狠丁香久燥 | 成人精品视频一区二区三区尤物 | 国产精品久久久午夜夜伦鲁鲁 | 国产97在线 | 亚洲 | 无码一区二区三区在线观看 | 国产又爽又猛又粗的视频a片 | 午夜嘿嘿嘿影院 | 亚洲日韩一区二区三区 | 18禁黄网站男男禁片免费观看 | 欧美肥老太牲交大战 | 老熟妇仑乱视频一区二区 | 亚洲色偷偷偷综合网 | 国色天香社区在线视频 | 免费乱码人妻系列无码专区 | 日本爽爽爽爽爽爽在线观看免 | 国产明星裸体无码xxxx视频 | 特黄特色大片免费播放器图片 | 国产人妻精品午夜福利免费 | 国内精品一区二区三区不卡 | 女人被爽到呻吟gif动态图视看 | 日本精品久久久久中文字幕 | 日韩在线不卡免费视频一区 | 日本精品人妻无码免费大全 | 最新国产麻豆aⅴ精品无码 | 午夜福利电影 | 无码av岛国片在线播放 | 东京一本一道一二三区 | 激情内射亚州一区二区三区爱妻 | 国产乱人伦av在线无码 | 日韩精品无码一区二区中文字幕 | 亚洲乱码中文字幕在线 | 粉嫩少妇内射浓精videos | 乱中年女人伦av三区 | 成人无码精品1区2区3区免费看 | 人妻少妇精品无码专区动漫 | 少女韩国电视剧在线观看完整 | 成人无码视频在线观看网站 | 久久精品人人做人人综合试看 | 无码午夜成人1000部免费视频 | 99视频精品全部免费免费观看 | 亚洲性无码av中文字幕 | 无码毛片视频一区二区本码 | 300部国产真实乱 | 亚洲欧美日韩成人高清在线一区 | 又色又爽又黄的美女裸体网站 | 激情内射亚州一区二区三区爱妻 | 人人澡人人妻人人爽人人蜜桃 | 精品久久综合1区2区3区激情 | 欧美日本日韩 | 熟妇人妻激情偷爽文 | 国模大胆一区二区三区 | www国产亚洲精品久久久日本 | 成人av无码一区二区三区 | 一区二区传媒有限公司 | 日本饥渴人妻欲求不满 | 精品欧洲av无码一区二区三区 | 国产精品二区一区二区aⅴ污介绍 | 色综合久久久久综合一本到桃花网 | 中文字幕乱码人妻二区三区 | 婷婷丁香五月天综合东京热 | 国内揄拍国内精品人妻 | 日韩精品无码一本二本三本色 | 牲欲强的熟妇农村老妇女视频 | 久青草影院在线观看国产 | 四虎国产精品一区二区 | 日本丰满熟妇videos | 麻豆国产丝袜白领秘书在线观看 | 中文精品久久久久人妻不卡 | 一区二区三区乱码在线 | 欧洲 | 久久五月精品中文字幕 | 天堂亚洲2017在线观看 | 99久久人妻精品免费二区 | 亚洲精品久久久久久一区二区 | 牲欲强的熟妇农村老妇女视频 | 国产欧美亚洲精品a | aⅴ在线视频男人的天堂 | 国产精品亚洲专区无码不卡 | 精品久久8x国产免费观看 | 精品国产一区二区三区av 性色 | 麻豆精品国产精华精华液好用吗 | 亚洲区小说区激情区图片区 | 亚洲毛片av日韩av无码 | 中文字幕无码视频专区 | 高清国产亚洲精品自在久久 | 国产又爽又黄又刺激的视频 | 欧美人与禽zoz0性伦交 | 亚洲精品综合五月久久小说 | 国产无遮挡又黄又爽免费视频 | 久久久婷婷五月亚洲97号色 | 中文无码成人免费视频在线观看 | 国产亚洲精品久久久久久大师 | 久久zyz资源站无码中文动漫 | 狠狠色欧美亚洲狠狠色www | 欧美人与禽zoz0性伦交 | 俄罗斯老熟妇色xxxx | 亚洲综合色区中文字幕 | 四虎永久在线精品免费网址 | 丰满岳乱妇在线观看中字无码 | 久久国产精品偷任你爽任你 | 亚洲大尺度无码无码专区 | 久久午夜无码鲁丝片午夜精品 | 国产9 9在线 | 中文 | 久久久精品成人免费观看 | 无码人妻出轨黑人中文字幕 | 国产精品国产自线拍免费软件 | 中文字幕无码热在线视频 | 骚片av蜜桃精品一区 | 国产无遮挡吃胸膜奶免费看 | 两性色午夜视频免费播放 | 荡女精品导航 | 无码精品国产va在线观看dvd | 国产精品久久久一区二区三区 | 伊人久久大香线焦av综合影院 | 国产精品igao视频网 | 国产凸凹视频一区二区 | 成人无码精品一区二区三区 | 高潮毛片无遮挡高清免费 | 久久精品中文闷骚内射 | 图片小说视频一区二区 | 精品偷拍一区二区三区在线看 | 国产色视频一区二区三区 | 国产乱人无码伦av在线a | 国产av无码专区亚洲awww | 亚洲精品美女久久久久久久 | 丰满肥臀大屁股熟妇激情视频 | 中文字幕人妻丝袜二区 | 偷窥村妇洗澡毛毛多 | 丰满人妻精品国产99aⅴ | 波多野结衣高清一区二区三区 | 亚洲乱码国产乱码精品精 | 亚洲成av人在线观看网址 | 亚洲色大成网站www国产 | 国产精品第一国产精品 | 日韩人妻少妇一区二区三区 | 亚洲精品无码国产 | 国产美女极度色诱视频www | 久久久久免费精品国产 | 欧美熟妇另类久久久久久不卡 | 永久免费精品精品永久-夜色 | 少妇太爽了在线观看 | 精品一区二区三区无码免费视频 | 国内老熟妇对白xxxxhd | 无码人妻丰满熟妇区五十路百度 | 精品一二三区久久aaa片 | 久久天天躁夜夜躁狠狠 | 大地资源网第二页免费观看 | 精品国产福利一区二区 | 荡女精品导航 | 亚洲一区av无码专区在线观看 | 亚洲第一无码av无码专区 | √天堂资源地址中文在线 | 国产成人无码区免费内射一片色欲 | 性欧美大战久久久久久久 | 久久精品无码一区二区三区 | 亚洲一区av无码专区在线观看 | 日本熟妇乱子伦xxxx | 欧美国产日韩亚洲中文 | 国产精品福利视频导航 | 国产又粗又硬又大爽黄老大爷视 | 麻豆人妻少妇精品无码专区 | 亚洲第一无码av无码专区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 亚洲人成网站免费播放 | 久久97精品久久久久久久不卡 | 天天av天天av天天透 | 欧美黑人巨大xxxxx | 欧美日韩一区二区三区自拍 | 2020最新国产自产精品 | 久久精品女人天堂av免费观看 | 97资源共享在线视频 | 国产真实乱对白精彩久久 | 亚洲欧美国产精品久久 | 亚洲第一网站男人都懂 | 国产午夜无码视频在线观看 | 国产av剧情md精品麻豆 | 国产熟妇另类久久久久 | 一本久道高清无码视频 | 骚片av蜜桃精品一区 | 精品日本一区二区三区在线观看 | 国产真人无遮挡作爱免费视频 | 麻豆av传媒蜜桃天美传媒 | 福利一区二区三区视频在线观看 | 狂野欧美性猛xxxx乱大交 | 无遮挡国产高潮视频免费观看 | 日日麻批免费40分钟无码 | 精品成在人线av无码免费看 | 扒开双腿吃奶呻吟做受视频 | 久在线观看福利视频 | 老熟妇仑乱视频一区二区 | 成人一区二区免费视频 | 亚洲熟妇自偷自拍另类 | 久久99精品国产麻豆 | 久精品国产欧美亚洲色aⅴ大片 | 国产精品igao视频网 | 亚洲综合无码一区二区三区 | 国精品人妻无码一区二区三区蜜柚 | 欧美性猛交内射兽交老熟妇 | 对白脏话肉麻粗话av | 午夜精品一区二区三区在线观看 | 国产乱人偷精品人妻a片 | 日本va欧美va欧美va精品 | 呦交小u女精品视频 | 欧美老妇交乱视频在线观看 | 国产超碰人人爽人人做人人添 | 国产无遮挡又黄又爽又色 | 亚洲第一网站男人都懂 | 亚洲国产成人av在线观看 | 国产精品99爱免费视频 | 亚洲午夜久久久影院 | 久久久精品国产sm最大网站 | 国产成人精品必看 | 亚洲区小说区激情区图片区 | 日本在线高清不卡免费播放 | 丰满少妇女裸体bbw | 国产黄在线观看免费观看不卡 | 日韩无套无码精品 | 日日躁夜夜躁狠狠躁 | 十八禁真人啪啪免费网站 | 欧美老人巨大xxxx做受 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 久久精品丝袜高跟鞋 | 狠狠色噜噜狠狠狠7777奇米 | 日韩av无码一区二区三区 | 在线播放亚洲第一字幕 | 精品人妻人人做人人爽 | 天堂亚洲免费视频 | 亚洲欧美精品伊人久久 | 久久久精品456亚洲影院 | 无码人妻丰满熟妇区毛片18 | 成人免费视频一区二区 | 无人区乱码一区二区三区 | 人人妻人人澡人人爽人人精品 | 无码福利日韩神码福利片 | 日本丰满熟妇videos | 中文字幕日产无线码一区 | 网友自拍区视频精品 | 成人欧美一区二区三区黑人免费 | 性色欲情网站iwww九文堂 | 水蜜桃色314在线观看 | 亚洲国产精品美女久久久久 | 正在播放老肥熟妇露脸 | 亚洲天堂2017无码中文 | 午夜福利电影 | 99久久久无码国产精品免费 | 最近的中文字幕在线看视频 | 无码人妻久久一区二区三区不卡 | 亚洲日韩av一区二区三区四区 | 久久久精品欧美一区二区免费 | 亚洲热妇无码av在线播放 | 波多野结衣 黑人 | 狠狠躁日日躁夜夜躁2020 | 亚洲七七久久桃花影院 | 天天摸天天碰天天添 | 国产乱人伦av在线无码 | 精品国产成人一区二区三区 | 亚洲精品中文字幕久久久久 | 色老头在线一区二区三区 | 一个人看的视频www在线 | 亚洲日韩精品欧美一区二区 | 国产精品久久精品三级 | 国产乱人无码伦av在线a | 九九久久精品国产免费看小说 | 成人欧美一区二区三区黑人免费 | 久久久久成人片免费观看蜜芽 | 国产乱子伦视频在线播放 | 国产特级毛片aaaaaaa高清 | 人人妻人人澡人人爽人人精品 | 纯爱无遮挡h肉动漫在线播放 | 久久午夜无码鲁丝片午夜精品 | 人人澡人人透人人爽 | 久久午夜无码鲁丝片 | www国产亚洲精品久久久日本 | 无码人妻出轨黑人中文字幕 | 精品人妻人人做人人爽 | 国产亚洲tv在线观看 | 奇米影视888欧美在线观看 | 中文字幕av无码一区二区三区电影 | 欧美刺激性大交 | 麻豆av传媒蜜桃天美传媒 | 中文字幕无码免费久久9一区9 | 日日天日日夜日日摸 | 欧美亚洲国产一区二区三区 | 久久精品中文字幕大胸 | 中文无码伦av中文字幕 | 玩弄中年熟妇正在播放 | 蜜臀av无码人妻精品 | 久久综合香蕉国产蜜臀av | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲色www成人永久网址 | 久久亚洲中文字幕精品一区 | 性做久久久久久久久 | 国产精品沙发午睡系列 | av人摸人人人澡人人超碰下载 | 无码福利日韩神码福利片 | 成人精品视频一区二区三区尤物 | 宝宝好涨水快流出来免费视频 | 亚洲国产日韩a在线播放 | 亚洲一区二区三区播放 | 婷婷色婷婷开心五月四房播播 | 亚洲一区二区三区偷拍女厕 | 又湿又紧又大又爽a视频国产 | 奇米影视7777久久精品人人爽 | 水蜜桃亚洲一二三四在线 | 狠狠色噜噜狠狠狠7777奇米 | 国产亚洲精品久久久久久久久动漫 | 精品欧洲av无码一区二区三区 | 国产熟妇另类久久久久 | 成人无码精品1区2区3区免费看 | 国产另类ts人妖一区二区 | 国产亚洲日韩欧美另类第八页 | 欧美精品一区二区精品久久 | 最近中文2019字幕第二页 | 精品国产成人一区二区三区 | 国产真人无遮挡作爱免费视频 | 久久久久久久久888 | 一本色道久久综合亚洲精品不卡 | 亚洲日韩一区二区三区 | 国产小呦泬泬99精品 | 日本熟妇大屁股人妻 | 国产av无码专区亚洲a∨毛片 | 熟女俱乐部五十路六十路av | 18黄暴禁片在线观看 | 2020久久超碰国产精品最新 | 国产成人无码一二三区视频 | av无码电影一区二区三区 | 网友自拍区视频精品 | 水蜜桃色314在线观看 | www成人国产高清内射 | 东京一本一道一二三区 | 麻豆国产97在线 | 欧洲 | 亚洲人成人无码网www国产 | 又色又爽又黄的美女裸体网站 | 大肉大捧一进一出视频出来呀 | 少女韩国电视剧在线观看完整 | 亚洲精品无码国产 | 亚洲a无码综合a国产av中文 | 亚洲男人av天堂午夜在 | 国产精品久久精品三级 | 精品偷拍一区二区三区在线看 |