精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android 兼容 Java 8 語法特性的原理分析

企業動態
本文主要闡述了Lambda表達式及其底層實現(invokedynamic指令)的原理、Android第三方插件RetroLambda對其的支持過程、Android官方最新的dex編譯器D8對其的編譯支持。

 本文主要闡述了Lambda表達式及其底層實現(invokedynamic指令)的原理、Android第三方插件RetroLambda對其的支持過程、Android官方最新的dex編譯器D8對其的編譯支持。通過對這三個方面的跟蹤分析,以Java 8的代表性特性——Lambda表達式為著眼點,將Android如何兼容Java8的過程分享給大家。

[[326076]]

Java 8概述

Java 8是Java開發語言非常重要的一個版本。Oracle從2014年3月18日發布Java 8,從該版本起,Java開始支持函數式編程。特別是吸收了運行在JVM上的Scala、Groovy等動態腳本語言的特性之后,Java 8在語言的表達力、簡潔性兩個方面有了很大的提高。

Java 8的主要語言特性改進概括起來包括以下幾點:

  • Lambda表達 (函數閉包)
  • 函數式接口 (@FunctionalInterface)
  • Stream API (通過流式調用支持map、filter等高階函數)
  • 方法引用(使用::關鍵字將函數轉化為對象)
  • 默認方法(抽象接口中允許存在default修飾的非抽象方法)
  • 類型注解和重復注解

其中Lambda表達、函數式接口、方法引用三個特性為Java帶來了函數式編程的風格;而Stream實現了map、filter、reduce等常見的高階函數,數據源囊括了數組、集合、IO通道等,這些又為Java帶來了流式編程或者說鏈式編程的風格,以上這些風格讓Java變得越來越現代化和易用。

Android和Java關系

其實Java在Android的快速發展過程中扮演著非常重要的角色,無論是作為開發語言(Java)、開發Framework(Android-SDK引用了80%的JDK-API),還是開發工具(Eclipse or Android Studio)。這些都和Java有著千絲萬縷的關系。不過可能是受到與Oracle的法律訴訟的影響,Google在Android上針對Java的升級一直都不是很積極:

  • Android 從1.0 一直升級到4.4,迭代了將近19個Android版本,才在4.4版本中支持了Java 7。
  • 然后從Android 4.4版本開始算起,一直到Android N(7.0)共4個Android版本,才在Jack/Jill工具鏈勉強支持了Java 8。但由于Jack/Jill工具鏈在構建流程中舍棄了原有Java字節碼的體系,導致大量既有的技術沉淀無法應用,致使許多App工程放棄了接入。
  • 最后直到Android P(9.0)版本, Google 才在Android Studio 3.x中通過新增的D8 dex編譯器正式支持了Java 8,但部分API并不能全版本支持。

可謂”歷經坎坷“。特別是Rx大行其道的今天,Rx配合Java 8特性Lambda帶來簡潔、高效的開發體驗,更是讓Android Developer望眼欲穿。

接下來,本文將從技術原理層面,來分析一下Android是如何支持Java 8的。

Lambda 表達式

想要更好的理解Android對Java 8的支持過程,Lambda表達式這一代表性的”語法糖“是一個非常不錯的切入點。所以,我們首先需要搞清楚Lambda表達式到底是什么?其底層的實現原理又是什么?

Lambda表達式是Java支持函數式編程的基礎,也可以稱之為閉包。簡單來說,就是在Java語法層面允許將函數當作方法的參數,函數可以當做對象。任一Lambda表達式都有且只有一個函數式接口與之對應,從這個角度來看,也可以說是該函數式接口的實例化。

Lambda表達式

通用格式:

 

簡單范例:

 

說明:

  • Lambda表達式中 () 對應的是函數式接口-run方法的參數列表。
  • Lambda表達式中 System.out.println(“xixi”) / System.out.println(“haha”),在運行時會是具體的run方法實現。

Lambda表達式原理

針對實例中的代碼,我們來看下編譯之后的字節碼:

  1. javac J8Sample.java  ->  J8Sample.class 
  2. javap -c -p J8Sample.class  

從字節碼中我們可以看到:

  • 實例中 Lambda表達式1變成了字節碼代碼塊中 Line 11的 0: invokedynamic #2, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable。
  • 實例中 Lambda表達式2變成了字節碼代碼塊中 Line 20的 21: invokedynamic #6, 0 // InvokeDynamic #1:run:()Ljava/lang/Runnable。

可見,Lambda表達式在虛擬機層面上,是通過一種名為invokedynamic字節碼指令來實現的。那么invokedynamic又是何方神圣呢?

invokedynamic 指令解讀

invokedynamic指令是Java 7中新增的字節碼調用指令,作為Java支持動態類型語言的改進之一,跟invokevirtual、invokestatic、invokeinterface、invokespecial四大指令一起構成了虛擬機層面各種Java方法的分配調用指令集。區別在于:

  • 后四種指令,在編譯期間生成的class文件中,通過常量池(Constant Pool)的MethodRef常量已經固定了目標方法的符號信息(方法所屬者及其類型,方法名字、參數順序和類型、返回值)。虛擬機使用符號信息能直接解釋出具體的方法,直接調用。
  • 而invokedynamic指令在編譯期間生成的class文件中,對應常量池(Constant Pool)的Invokedynamic_Info常量存儲的符號信息中并沒有方法所屬者及其類型 ,替代的是BootstapMethod信息。在運行時,通過引導方法BootstrapMethod機制動態確定方法的所屬者和類型。這一特點也非常契合動態類型語言只有在運行期間才能確定類型的特征。

那么,invokedynamic如何通過引導方法找到所屬者及其類型?我們依然結合前面的J8Sample實例:

  1. javap -v J8Sample.class  

結合J8Sample.class字節碼,并對invokedynamic指令調用過程進行跟蹤分析。總結如下:

 

 

依據上圖invokedynamic調用步驟,我們一步一步做一個分析講解。

步驟1 選取J8Sample.java源碼中Lambda表達式1:

Runnable runnable = () -> System.out.println("xixi"); // lambda表達式1

步驟2 通過javac J8Sample.java編譯得到J8Sample.class之后,

Lambda表達式1變成:0: invokedynamic #2, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable;

對應在J8Sample.class中發現了新增的私有靜態方法:


步驟3 針對表達式1的字節碼分析 #2 對應的是class文件中的常量池:

#2 = InvokeDynamic #0:#35 // #0:run:()Ljava/lang/Runnable;

注意,這里InvokeDynamic不是指令,代表的是Constant_InvokeDynamic_Info結構。

步驟4 結構后面緊跟的 #0 標識的是class文件中的BootstrapMethod區域中引導方法的索引:


步驟5 引導方法中的 java/lang/invoke/LambdaMetafactory.metafactory才是invokedynamic指令的關鍵:


該方法會在運行時,在內存中動態生成一個實現Lambda表達式對應函數式接口的實例類型,并在接口的實現方法中調用步驟2中新增的靜態私有方法。

步驟6 使用java -Djdk.internal.lambda.dumpProxyClasses J8Sample.class運行一下,可以內存中動態生成的類型輸出到本地:


步驟7 通過javap -p -c J8Sample\$\$Lambda\$1.class反編譯一下,可以看到生成類的實現:

 

在run方法中使用了invokestatic指令,直接調用了J8Sample.lambda$main$0這個在編譯期間生成的靜態私有方法。

至此,上面7個步驟就是Lambda表達式在Java的底層的實現原理。Android 針對這些實現會怎么處理呢?

Android不能直接支持

回到Android系統上,Java-Bytecode(JVM字節碼)是不能直接運行在Android系統上的,需要轉換成Android-Bytecode(Dalvik/ART 字節碼)。

如圖:

 

 

通過Lambda這節,我們知道Java底層是通過invokedynamic指令來實現,由于Dalvik/ART并沒有支持invokedynamic指令或者對應的替代功能。簡單的來說,就是Android的dex編譯器不支持invokedynamic指令,導致Android不能直接支持Java 8。

Android間接支持

既然不能直接支持,那就只能在Java-Bytecode轉換到Android-Bytecode這一過程中想辦法,間接支持。這個間接支持的過程我們統稱為Desugar(脫糖)過程。

官方流程圖:


當前,無論是RetroLambda,還是Google的Jack & Jill 工具,還是最新的D8 dex編譯器:

  • 流程方面:都是按照如上圖所示的官方流程進行Desugar的。
  • 原理方面:卻是參照Lambda在Java底層的實現,并將這些實現移至到RetroLambda插件或者Jack、D8編譯器工具中。

下面我們逐個分析解讀一下。

Android 間接支持之RetroLambda

 

 

如圖所示,RetroLambda 的Desugar過程發生在javac將源碼編譯完成之后,dx工具進行dex編譯之前。

RetroLambda Desugar

其實就是參照invokedynamic指令解讀一節中的步驟5,根據java/lang/invoke/LambdaMetafactory.metafactory方法,直接將原本在運行時生成在內存中的J8Sample\$\$Lambda\$1.class,在javac編譯結束之后,dx編譯dex之前,直接生成到本地,并使用生成的J8Sample\$\$Lambda\$1類修改J8Sample.class字節碼文件,將J8Sample.class中的invokedynamic指令替換成invokestatic指令。

將實例中的J8Sample.java放到一個配置了Retrolambda的Android工程中:

 

 

AndroidStudio -> Build -> make project 編譯之后:

 

 

app:transformClassesWithRetrolambdaForDebug任務發生在app:compileDebugJavaWithJavac(對應javac)之后,和app:transformDexArchiveWithDexMergerForDebug(對應dx)之前,同時在build/intermediates/transforms/retrolambda下面生產如圖所示的class文件。

J8Sample.class和J8Sample$$Lambda$1.class反編譯之后的代碼如下:

 

 

通過反編譯代碼,可以看出J8Sample.class中Lambda表達式已經被我們熟悉的1.7or1.6的語句所替代。

注意:右圖中J8Sample.lambda$main$0()方法在左圖中沒有顯示出來,但是J8Sample.class字節碼確實是存在的。

Android間接支持之Jack&Jill工具

 

 

Jack是基于Eclipse的ecj編譯開發的, Jill是基于ASM4開發的。Jack&Jill工具鏈是Google在Android N(7.0)發布的,用于替換javac&dx的工具鏈,并且在jack過程內置了Desugar過程。

但是在Android P(9.0) 的時候將Jack&Jill工具鏈廢棄了,被 javac&D8工具鏈替代了。這里就不做Desugar具體分析了。


D8是Android P(9.0)新增的dex編譯器。并在Android Studio 3.1版本中默認使用D8作為dex的默認編譯器。

D8 Desugar

如圖所示,Desugar過程放在了D8的內部,由Android Studio這個IDE來實現這個轉換,原理基本和RetroLambda是一樣。

本質上也是參照java/lang/invoke/LambdaMetafactory.metafactory方法直接將原本在運行時生成在內存中的J8Sample\$\$Lambda\$1.class,在D8的編譯dex期間,直接生成并寫入到dex文件中。

同樣,將實例中的J8Sample.java放到支持D8的Android工程中:


同樣,AndroidStudio -> Build -> make project編譯之后:


javac編譯之后的J8Sample.class還是使用invokedynamic指令,即這一步并沒有Desugar:


在app:transformDexArchiveWithDexMergerForDebug(對應dx)任務之后,再對應build/intermediates/transforms/dexMerger目錄找第0個classex.dex。

執行$ANDROID_HOME/build-tools/28.0.3/dexdump -d classes.dex >> dexInfo.txt拿到dex信息。

還是選取實例中Lambda表達式1 :Runnable runnable = () -> System.out.println("xixi");來進行分析。

這個dexIno.txt文件非常大,有1.4M,我們通過com.J8Smaple2.J8Sample找到我們J8Sample在dex中位置。

 

新增方法:


J8Sample.main方法:


圖中選中部分,對應就是Lambda表達式1 desugar之后的內容。

翻譯成Java的話就變成了:new Lcom/j8sample2/-$$Lambda$J8Sample$jWmuYH0zEF070TKXrjBFgnnqOKc這個生成類的一個對象。

類Lcom/j8sample2/-$$Lambda$J8Sample$jWmuYH0zEF070TKXrjBFgnnqOKc對應前面的生成的J8Sample$$Lambda$1類型,只不過數字1變成了Hash值。


實現Interface Ljava/lang/Runnable。 Lcom/j8sample2/-$$Lambda$J8Sample$jWmuYH0zEF070TKXrjBFgnnqOKc.run方法:


到這里,是不是和前面RetroLambda就一樣了。

總結

至此,Lambda及其invokedynamic指令、RetroLambda插件、D8編譯器各自的原理分析都已經結束了。

相比較Lambda在Java8自己內部的實現:即運行時,在內存中動態生成關聯的函數式接口的實例類型,通過BSM-引導方法找到該內存類(字節碼層面的反射)。

在Android上的其他三種Desugar方式,原理都是一樣的,區別在于時機不同:

RetroLambda將函數式接口對應的實例類型的生產過程,放在javac編譯之后,dx編譯之前,并動態修改了表達式所屬的字節碼文件。

Jack&Jill是直接將接口對應的實例類型,直接jack過程中生成,并編譯進了dex文件。

D8的過程是在dex編譯過程中,直接在內存生成接口對應的實例類型,并將生成的類型直接寫入生成的dex文件中。

探討

無論是RetroLambda,還是D8,對Java8的特性也不是全都支持。

Java8新增的許多API(例如:新的DataAPI),就D8編譯器而言,只有在Android P(9.0)版本中能直接運行。低于9.0就不行了。如何能夠全版本支持Java 8。D8還有很長的一段路要走。

如果我們在低版本需要使用新的API,目前可以采取將這些API打包進去的臨時辦法。

寫到這里,肯定有人要提出,為什么不直接使用Kotlin呢?確實Kotlin對Lambda表達式、函數引用等特性都做了很好的支持,但是現實的情況中,Kotlin很難取代Android中的Java。新業務、新工程還相對容易,對老業務來說,尤其是經過多年沉淀,工程結構復雜,遷移改造帶來的收益,往往遠遠小于遷移改造帶來的成本和不可控之風險。Kotlin和Java同時存在的情況,長期來看是一個必然的結果。

至于Java 8的其他特性呢,D8是如何實現的,也可以按照上面類似的方式去分析,甚至可以結合Kotlin實現的方式,一探究竟。

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2021-02-22 11:51:15

Java開發代碼

2014-04-16 07:43:31

Java 8JRE

2023-10-10 08:39:25

Java 7Java 8

2014-05-05 09:58:01

2013-05-02 09:14:19

Java 8Java 8的新特性

2016-09-12 14:33:20

javaHashMap

2014-10-20 13:57:59

JavaFX 8Java 8

2014-07-15 14:12:17

Java8

2015-11-02 10:13:41

iOSObjective-C語法

2013-04-09 12:59:21

WindowsPhon

2014-07-15 14:48:26

Java8

2010-09-15 17:05:33

CSS display

2013-11-05 09:47:12

Android 4.4特性

2023-02-07 09:17:19

Java注解原理

2015-06-15 10:12:36

Java原理分析

2017-10-25 11:05:14

Java

2014-03-19 11:04:14

Java 8Java8特性

2014-04-15 15:45:22

Java8Java8教程

2011-02-21 10:18:58

2020-07-30 11:40:06

云計算云平臺
點贊
收藏

51CTO技術棧公眾號

亚洲小说欧美另类激情| 欧美一区二区三区免费观看| 蜜臀av免费观看| 在线观看a视频| 久久国产精品第一页| 久久精品视频亚洲| 免费不卡的av| 精品网站在线| 亚洲综合一区二区精品导航| 欧美大香线蕉线伊人久久| 在线视频免费观看一区| 99久久婷婷这里只有精品 | 久久久蜜臀国产一区二区| 国产精品久久久久久久7电影| 中文字幕人妻一区二| 给我免费播放日韩视频| 欧美性生活久久| www.在线观看av| av网站在线免费播放| 成人激情av网| 成人国产精品久久久久久亚洲| 日韩 欧美 亚洲| 欧美大片aaaa| 亚洲伦理中文字幕| 色哟哟网站在线观看| 波多野结衣亚洲| 亚洲一区二区三区四区五区中文| 日韩精彩视频| 午夜性色福利视频| 激情亚洲综合在线| 日韩免费在线播放| 国产大片aaa| 亚洲澳门在线| 伊人av综合网| 亚洲一区二区观看| 久久久伦理片| 日韩欧美高清一区| 日韩欧美理论片| 丁香婷婷久久| 91成人免费网站| 欧美 日韩 激情| 三级资源在线| 亚洲精选视频免费看| 日韩.欧美.亚洲| 天堂在线视频免费观看| 风间由美一区二区三区在线观看| 国产日韩欧美黄色| 国产又粗又猛又黄视频| 欧美亚洲三级| 欧美亚洲第一区| 青青操免费在线视频| 激情综合亚洲| 久久免费国产视频| 日本一区二区不卡在线| 欧美精品观看| 欧美激情xxxxx| 午夜69成人做爰视频| 99视频精品全部免费在线视频| 国产香蕉一区二区三区在线视频| 欧美熟妇一区二区| 亚洲最好看的视频| 亚洲欧美日韩精品| 熟女高潮一区二区三区| 精品国产乱码久久久久久蜜坠欲下| 日韩精品在线视频美女| 在线 丝袜 欧美 日韩 制服| 中文有码一区| 亚洲人成在线免费观看| 中文字幕在线观看二区| 我不卡神马影院| 久久久久999| 免费网站看av| 日韩一级网站| 国产91色在线| 国产精品区在线观看| 国产一级精品在线| 国产精品制服诱惑| 天堂资源中文在线| 国产三级欧美三级日产三级99| 神马影院我不卡| 美女羞羞视频在线观看| 亚洲综合一二区| 两根大肉大捧一进一出好爽视频| 香蕉视频亚洲一级| 欧美高清www午色夜在线视频| 国产精品久久久久野外| 国产精品毛片av| 亚洲色无码播放| 久久国产高清视频| 欧美日韩国产在线一区| 欧日韩在线观看| 在线观看毛片av| 国产成人午夜精品影院观看视频 | www.久久成人| www.久久精品| 亚洲欧美久久234| 日韩免费影院| 在线看日本不卡| 99精品视频国产| 欧美性生活一级片| xxxx性欧美| 日韩欧美视频在线免费观看| 秋霞电影网一区二区| 国产91精品入口17c| 韩国中文字幕2020精品| 亚洲欧美日韩系列| 可以在线看的黄色网址| 中文成人在线| 亚洲免费精彩视频| 麻豆一区产品精品蜜桃的特点 | 亚洲欧美激情小说另类| 国内自拍在线观看| 日本免费一区二区三区视频| 亚洲天堂av在线免费观看| 中文字幕电影av| 久久一二三区| 成人91免费视频| www.亚洲资源| 精品毛片三在线观看| 想看黄色一级片| 欧美人与牛zoz0性行为| 欧美激情精品久久久久久久变态 | 丁香花在线电影| 欧美人牲a欧美精品| 香港三级日本三级| 欧美三级第一页| 国产精品一区av| 全色精品综合影院| 午夜激情一区二区三区| 黄色三级视频在线播放| 日韩理论电影大全| 国产精品白嫩初高中害羞小美女 | 草久视频在线观看| 福利一区福利二区| 国产成人免费高清视频| 欧美成人免费全部网站| 国产一区二区三区在线免费观看| 青青草成人av| av不卡一区二区三区| 成人小视频在线观看免费| 伊人久久大香伊蕉在人线观看热v| 亚洲欧美成人一区二区在线电影| 国产精品 欧美 日韩| 国产毛片一区二区| 午夜啪啪福利视频| 超碰国产精品一区二页| 日韩在线视频免费观看高清中文| 日本三级一区二区三区| 久久色.com| 日韩视频第二页| 色橹橹欧美在线观看视频高清| 久久免费视频观看| 成人爽a毛片一区二区| 亚洲一区二区三区在线播放| 人妻 丝袜美腿 中文字幕| 欧美粗暴jizz性欧美20| 91传媒视频在线观看| caoporn免费在线| 日韩一区二区电影在线| 免费在线视频观看| www..com久久爱| 免费看又黄又无码的网站| 欧美日韩导航| 日韩美女视频中文字幕| 成人性生交大片免费看午夜| 欧美亚洲愉拍一区二区| 日本中文在线视频| 国产成人综合亚洲网站| 日韩av新片网| 免费看日本一区二区| 国产精品v日韩精品| 91美女视频在线| 欧美久久一二三四区| 国产一二三区精品| 成人aaaa免费全部观看| 99精品视频在线看| 日韩电影在线视频| 亚洲在线免费看| 少妇淫片在线影院| 中文字幕av一区中文字幕天堂| 国产又粗又大又黄| 亚洲综合成人在线视频| 国产中文字幕一区二区| 全国精品久久少妇| 九九久久九九久久| 欧美黄色影院| 成人黄色激情网| av免费不卡国产观看| 国产亚洲美女久久| 国产色综合视频| 日韩欧美亚洲国产一区| 天堂av免费在线| aa级大片欧美| www.久久av.com| 宅男噜噜噜66国产日韩在线观看| 神马影院午夜我不卡| 国产精品中文字幕制服诱惑| 国产精品久久久久久久电影| 性欧美ⅴideo另类hd| 亚洲人成网站在线播| 亚洲av综合色区无码一二三区| 色播五月激情综合网| 美女福利视频在线观看| 久久久久久久免费视频了| 少妇愉情理伦片bd| 欧美亚洲自偷自偷| 毛片在线视频观看| 俺要去色综合狠狠| 精品国产91亚洲一区二区三区www| 欧美成人家庭影院| 欧美最近摘花xxxx摘花| gogogogo高清视频在线| 在线观看中文字幕亚洲| 无码国产伦一区二区三区视频| 欧美日本一区二区| 亚洲国产成人精品女人久久| 亚洲国产精品一区二区www在线| 欧美老女人性生活视频| av一区二区久久| 又黄又爽又色的视频| 免费看欧美女人艹b| 日韩中文字幕三区| 激情一区二区| 99亚洲国产精品| 欧美电影一区| 日韩和欧美的一区二区| 久操成人av| 韩国成人av| 国产乱论精品| av一区二区三区在线观看| av日韩在线免费观看| 国产精品久久网| 性高爱久久久久久久久| 欧美一级大片视频| 麻豆免费在线| 久久久久日韩精品久久久男男| www在线免费观看视频| 日韩亚洲一区二区| 在线观看黄色av| 国产亚洲综合久久| 国产中文在线视频| 亚洲欧美www| 国产天堂素人系列在线视频| 日韩电影中文字幕av| 亚洲AV成人无码一二三区在线 | 黄色美女网站在线观看| 日韩精品黄色网| 完全免费av在线播放| 狼人综合视频| 97在线免费观看视频| 爱啪啪综合导航| 午夜精品福利电影| 国产高清中文字幕在线| 97国产精品久久| 中文字幕人成乱码在线观看| 欧美一级成年大片在线观看| 97久久香蕉国产线看观看| 国产精品r级在线| 国产第一亚洲| 91在线观看免费高清| 免费看日产一区二区三区 | 精品国产乱码一区二区三| 91精品国产欧美一区二区| 国产欧美日韩综合精品一区二区三区| 欧美一区二区三区色| 精品人妻一区二区三区含羞草 | 国产精品精品视频| 国产一区二区三区四区五区3d| 国产日韩精品视频| 麻豆视频久久| 精品蜜桃传媒| 波多野结衣在线观看一区二区三区 | 精品视频在线观看免费观看| 国产传媒一区二区| 亚洲黄色录像| 色婷婷精品国产一区二区三区| 天天射—综合中文网| 丁香六月激情婷婷| 性色一区二区三区| jizz18女人| 懂色av一区二区在线播放| av无码av天天av天天爽| 国产精品女主播av| 国产一级二级三级| 一本高清dvd不卡在线观看| 美女黄页在线观看| 日韩三级电影网址| 日av在线播放| 欧美成年人视频网站欧美| 麻豆视频在线看| 成人免费看片视频| 欧美韩一区二区| 老司机av福利| 99伊人成综合| 五月天婷婷影视| 9i在线看片成人免费| 林心如三级全黄裸体| 亚洲高清免费观看| 亚洲午夜精品久久久| 亚洲第一福利网| 欧美激情视频在线播放| 51ⅴ精品国产91久久久久久| 亚洲欧美一级| 欧美精品欧美精品| 狠狠综合久久av一区二区老牛| 人妻无码视频一区二区三区| 国产精品 欧美精品| 99精品全国免费观看| 亚洲一线二线三线久久久| 中文字幕在线观看免费| 亚洲国产成人精品电影| 黄色一级片在线观看| 国产91精品网站| 精品少妇3p| 老司机午夜网站| 久久99久久99| 久久久久久国产精品无码| 亚洲一区二区综合| 国产精品久久久国产盗摄| 亚洲欧美www| 国产欧洲在线| 国产99视频精品免费视频36| 91精品久久久久久久蜜月| 欧美性猛交xxx乱久交| av色综合久久天堂av综合| 中文字幕av免费在线观看| 欧美日韩高清在线播放| 国产高清自拍视频在线观看| 97香蕉超级碰碰久久免费软件| 视频在线观看免费影院欧美meiju| 亚洲欧美日韩精品在线| 久久久亚洲一区| 极品粉嫩小仙女高潮喷水久久| 亚洲成人午夜电影| 亚洲成人77777| 欧美精品中文字幕一区| 成人亚洲精品| 在线观看精品视频| 免费观看久久久4p| 日本黄区免费视频观看| 欧美日韩在线不卡| 97在线观看免费观看高清 | 一级片免费在线播放| 国产偷亚洲偷欧美偷精品| 天天综合av| 久久久久久久有限公司| 亚洲一区二区免费看| 一级特级黄色片| 偷拍日韩校园综合在线| 香蕉久久一区二区三区| 91精品国产91久久久久久吃药 | 精品一区二区三区欧美| 免费一级suv好看的国产网站 | 三级a三级三级三级a十八发禁止| 国产日韩欧美电影| 在线视频精品免费| 国产一区二区三区18| 狠狠久久综合| 一区二区视频在线观看| 九九**精品视频免费播放| 性色av无码久久一区二区三区| 欧美一区二区免费| h片视频在线观看| 激情五月综合色婷婷一区二区 | 精品在线播放视频| 日韩亚洲欧美高清| 91高清视频在线观看| 精品国产电影| 日本中文在线一区| 国产色无码精品视频国产| 日韩一二三四区| av中文在线资源库| 色噜噜色狠狠狠狠狠综合色一 | 国产欧美日韩精品专区| 亚洲国产精品日韩专区av有中文| 亚洲成人激情小说| 欧美日韩国产一区中文午夜| 高清在线观看av| 亚洲综合精品一区二区| 99在线观看免费视频精品观看| 日本美女xxx| 欧美一二三区在线观看| 男人av在线播放| 亚洲最大色综合成人av| 国产ts人妖一区二区| 好吊色在线视频| 裸体女人亚洲精品一区| 西瓜成人精品人成网站| 黄大色黄女片18第一次| 亚洲高清免费视频| 午夜视频成人| 国产伦精品一区二区三区视频孕妇| 午夜综合激情| 欧美在线视频第一页| 岛国视频午夜一区免费在线观看| 午夜不卡视频| 精品视频在线观看| 激情深爱一区二区| 久久国产精品免费看| 欧美成人激情在线|