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

Jetpack Compose布局優化實踐

開發 項目管理
在項目開發中列表布局占多數,在 Compose? 中實現列表使用延時布局它包含了 LazyColumn、LazyRow?等布局,比如上一節使用 LazyColumn實現了一個客戶列表。

01、前言

我們內部團隊使用 Jetpack Compose 開發項目已近一年,經歷了簡單布局到復雜布局的應用,對 Compose 的使用越來越成熟,構造了很多易用的基礎組合,提升了項目的開發效率,與此同時 Compose 布局的一些性能問題也慢慢凸顯出來,因此專門對 Compose 布局優化進行了調研工作,旨在減少重組提高性能,規避負面效應,提高應用穩定性。結合具體場景來具體分析。

02、使用 remember 減少計算

我們構造一個客戶列表,代碼如下:

@Composable
fun ClientList(list: MutableList<ClientInfo>, modifier: Modifier) {
    LazyColumn(modifier = modifier) {
        items(list) {
            ClientItem(it)
        }
    }
}

接著增加一個需求,將客戶列表按照年齡排序,我們改動一下代碼:

@Composable
fun ClientList(list: MutableList<ClientInfo>, modifier: Modifier) {
    LazyColumn(modifier = modifier) {
        items(list.sortedBy { it.age }) {
            ClientItem(it)
        }
    }
}

上面代碼能夠正確運行,只不過會有一點問題,就是每次重組都會對 list 執行排序操作。眾所周知在 Compose 中可組合項可能會非常頻繁的重組,也就意味著排序操作可能會非常頻繁的執行,這顯然是不行的,因為排序可能會占用較多的資源,導致布局卡頓。最理想的狀態應該是數據變動或者排序規則變動才會觸發排序,達到這種狀態我們可以使用 remember或者將排序操作放到 ViewModel 當中:

@Composable
fun ClientList(list: MutableList<ClientInfo>, modifier: Modifier) {
    // 通過remember方法,將list的排序結果緩存起來,當list發生變化時,才會重新排序
    val sortList = remember(key1 = list) {
        list.sortedBy { it.age }
    }
    LazyColumn(modifier = modifier) {
        items(sortList) {
            ClientItem(it)
        }
    }
}

在開發過程中應該謹記一條規則:重組可能會頻繁的執行,因此盡量避免在組合內寫一些會引起副作用的代碼。

03、Lazy布局使用key

在項目開發中列表布局占多數,在 Compose 中實現列表使用延時布局它包含了 LazyColumn、LazyRow等布局,比如上一節使用 LazyColumn實現了一個客戶列表。

接上繼續以客戶列表布局為例,如果對客戶列表進行增加或者刪除,列表布局是如何重組的呢?為了探究這個問題,稍微改下代碼,增加一個添加客戶的按鈕:

Column {
    Row(modifier = Modifier.fillMaxWidth()) {
        Text(text = "添加新客戶", modifier = Modifier.clickable {
            Log.d("compose demo", "添加新客戶")
            //手動插入一條數據 
            list.add(5, ClientInfo("新添加客戶", 5))
        })
    }
    ClientList(...)
}

然后在 LazyColumn作用域以及ClientItem中加上日志信息:

@Composable
fun ClientList(list: SnapshotStateList<ClientInfo>, modifier: Modifier) {
    LazyColumn(modifier = modifier) {
        Log.d("compose demo", "LazyColumn update")
        itemsIndexed(list) { _, item ->
            ClientItem(item)
        }
    }
}

@Composable
fun ClientItem(info: ClientInfo) {
    Log.d("compose demo", "item  name=${info.name} 重組")
    Text(text = "${info.name} ${info.age}", modifier = Modifier.height(44.dp))
}

接下來運行一次,并點擊添加新客戶按鈕,控制臺輸出如下:

com.czx.demo       D  添加新客戶
com.czx.demo       D  LazyColumn update
com.czx.demo       D  item  name = 添加新客戶 重組
com.czx.demo       D  item  name = name ---- 5 重組
com.czx.demo       D  item  name = name ---- 6 重組
com.czx.demo       D  item  name = name ---- 7 重組
com.czx.demo       D  item  name = name ---- 8 重組
com.czx.demo       D  item  name = name ---- 9 重組
com.czx.demo       D  item  name = name ---- 10 重組
com.czx.demo       D  item  name = name ---- 11 重組
com.czx.demo       D  item  name = name ---- 12 重組
com.czx.demo       D  item  name = name ---- 13 重組
com.czx.demo       D  item  name = name ---- 14 重組

我們發現除了新添加的客戶項之外,在此位置之后的所有可見的客戶項都觸發了不必要的重組。如果想讓列表只重組新增項,那么這里就要使用 key參數來避免這些不必要的重組,key參數是一個任意類型的值,用于標識布局,并確保 Compose 框架在重新計算布局時正確地處理它們。改動代碼加上key參數:

@Composable
fun ClientList(list: SnapshotStateList<ClientInfo>, modifier: Modifier) {
    LazyColumn(modifier = modifier) {
        Log.d("compose demo", "LazyColumn update")
        //key參數指定
        itemsIndexed(list, key = { _, item -> item.id }) { _, item ->
            ClientItem(item)
        }
    }
}

需要注意的是 key參數要保證唯一性這樣才能確保 Compose 框架能夠正確地計算和更新列表項,加上 key參數代碼運行后臺輸出如下:

com.czx.demo       D  添加新客戶
com.czx.demo       D  LazyColumn update
com.czx.demo       D  item  name = 添加新客戶 重組

之前的不必要重組沒有了,只重組了添加項,符合預期。

Tips: 這里一定要保證 key參數的唯一性,否則會出現不必要的重組,影響性能。

04、使用derivedStateOf限制重組

繼續使用上面的客戶列表,新增一個需求當第一個可見項大于0的時候,展示回到頂部的按鈕,按照需求我們對代碼做如下改動:

1.增加listState來監聽列表狀態:

val listState = rememberLazyListState()

2.通過listState獲取當前可見項,判斷是否展示回到頂部 button :

val showButton = listState.firstVisibleItemIndex > 0

3.回到頂部按鈕顯隱:

if (showButton){
    ScrollToTopButton()
 }

再將列表包裹一層布局整體代碼如下:

Box {
    val listState = rememberLazyListState()

    ClientList(...)

    val showButton = listState.firstVisibleItemIndex > 0

     if (showButton){
       Log.d("compose demo", "button 重組")
       ScrollToTopButton()
    }
}

運行代碼并上下滑動列表,控制臺輸出:

com.czx.demo       D  item  name = name ---- 17 重組
com.czx.demo       D  item  name = name ---- 18 重組
com.czx.demo       D  item  button 重組
com.czx.demo       D  item  button 重組

可以看到觸發了多次重組,雖然 showButton只關心 firstVisibleItemIndex是否是從 0 變為非 0 ,但是這種寫法當 firstVisibleItemIndex大于 0 時會一直被觸發,從而引起了不必要的重組。要想規避這種情況可以使用 derivedStateOf()函數來處理頻繁變更的數據:

val showButton by remember {
    derivedStateOf {
        listState.firstVisibleItemIndex > 0
    }
}

控制臺輸出:

com.czx.demo       D  item  name = name ---- 17 重組
com.czx.demo       D  item  name = name ---- 18 重組
com.czx.demo       D  item  button 重組
com.czx.demo       D  item  name = name ---- 19 重組
com.czx.demo       D  item  name = name ---- 20 重組
com.czx.demo       D  item  name = name ---- 21 重組
com.czx.demo       D  item  name = name ---- 22 重組

連續滑動只會觸發一次重組。

05、延遲讀取 

Compose 有三個階段 組合、布局和繪制 ,可以通過盡可能的跳過三個步驟中的一個或者多個來提高性能。

06、場景一

val color by animateColorBetween(Color.Red, Color.Blue)
Box(modifier = Modifier.fillMaxSize().background(color))

代碼能夠運行并且滿足我們的要求,如果足夠細心可以發現這里隱藏著一個優化點,上面提到 Compose 的三個階段組合、布局和繪制,對于示例代碼而言,僅僅是改變背景顏色,不需要重組和布局,那么我們對代碼進行優化。

val color by animateColorBetween(Color.Red, Color.Blue)
Box(modifier = Modifier.fillMaxSize().drawBehind {  
    drawRect(color = color)
})

我們使用了 drawBehind()函數,該函數發生在繪制時期,由于僅改變背景顏色,所以這里改變方框的背景顏色使用 drawRect達到一樣的效果,這樣繪制就成了唯一重復執行的階段,進而提高性能。

07、場景二

@Composable
fun SnackDetail() {
    //...
    Box(Modifier.fillMaxSize()) {  // Recomposition Scope Start
        val scroll = rememberScrollState(0)
        // ...
        Title(snack, scroll.value) //1.狀態讀取
        // ...
    } //Recomposition Scope End
}

@Composable
private fun Title(snack: Snack, scroll: Int) {
    //...
    val offset = with(LocalDensity.current) { scroll.toDp() }

    Column(
        modifier = Modifier
            .offset(y = offset) //2.狀態使用
    ) {
        //...
    }
}

對 scroll.value的讀取會使 Box()發生重組,但是 scroll的使用卻不是在 Box()中,這種讀取與使用位置不一致的情況,往往會有性能優化的空間。對于這種情況我們將讓讀取和使用位置一致:

@Composable
fun SnackDetail() {
    // ...

    Box(Modifier.fillMaxSize()) { // Recomposition Scope Start
        val scroll = rememberScrollState(0)
        // ...
        Title(snack) { scroll.value } 
        // ...
    } 
    // Recomposition Scope end
}

@Composable
private fun Title(snack: Snack, scrollProvider: () -> Int) {
    // ...
    val offset = with(LocalDensity.current) { scrollProvider().toDp() }
    Column(
        modifier = Modifier
            .offset(y = offset) // 狀態讀取+使用
    ) {
    // ...
    }
}

這樣當 scroll.value()變化時不會觸發重組,也就是在滑動中唯二執行的階段只有布局和繪制。

08、避免向后寫入

Compose中有個核心       假設:您永遠不會向已被讀取的狀態寫入數據。如果破壞了這個假設也就是向后寫入,可能會造成一些不必要的重組。

舉個例子:

@Composable
fun BadComposable() {
    var count by remember { mutableStateOf(0) }

    // Causes recomposition on click
    Button(onClick = { count++ }, Modifier.wrapContentSize()) {
        Text("Recompose")
    }

    Text("$count") //1
    count++ // Backwards write, writing to state after it has been read
}

點擊按鈕后會 count++執行,注釋1處讀取了 count因此會觸發重組,但是同時末尾處的 count++也會執行,最終導致之前狀態過期,注釋 1 繼續讀取,然后陷入循環,count++一直執行,每一幀都在重組。這會造成嚴重的性能問題,所以應該避免在組合中進行狀態寫入,盡量在響應事件中寫入狀態。

07、發布模式&R8優化

Compose并不是 Android 系統庫,而是作為獨立的庫進行引入。這樣做的好處就是可以兼容舊的安卓版本以及頻繁的更新功能,但是也會產生性能上的開銷,導致首次啟動或者首次使用一個庫功能時變得比較慢。

下圖是冷啟動耗時對比(單位:ms):

圖片圖片

可以看到發布模式 +R8+Profile 下的冷啟動耗時是最短的。發布模式一般默認開啟了 R8 優化,具體優化細節,這里不做展開。另外值得一提的是Profile,它是 Compose 官方定義的基準配置文件,專門用來提高性能。

基準配置文件中定義關鍵用戶歷程所需的類和方法,并與應用的 APK 一起分發。在應用安裝期間,ART 會預先編譯該關鍵代碼,以確保在應用啟動時可供使用。要定義一個良好的基準配置文件并不容易,因而此 Compose 隨帶了一個默認的基準配置文件。您無需執行任何操作即可直接使用該配置文件。但是,如果選擇定義自己的配置文件,則可能會生成一個無法實際提升應用性能的配置文件。

10、總結

以上結合代碼示例介紹了 Jetpack Compose中的布局優化手段,總結下來就是在應用開發中,應盡量減少不必要的重組來提高性能。因此我們需要合理的使用 remember、 Lazy布局的key, derivedStateOf等手段,來遵循最佳性能實踐。

11、引用

Jetpack Compose 官方文檔:https://developer.android.com/jetpack/compose

本文轉載自微信公眾號「 搜狐技術產品」,作者「 蔡志學」,可以通過以下二維碼關注。

轉載本文請聯系「 搜狐技術產品」公眾號。

責任編輯:武曉燕 來源: 搜狐技術產品
相關推薦

2025-08-29 08:28:13

2025-05-26 08:24:45

2024-03-06 08:25:31

Compose開發界面

2021-02-25 18:22:34

AndroidGoogle 移動系統

2025-05-28 01:20:00

JetpackCompose元素

2014-07-29 15:23:06

Android

2025-05-29 02:20:00

2020-12-04 14:32:33

AndroidJetpackKotlin

2012-05-08 16:37:23

android

2013-03-27 09:17:17

Android開發AndroidList

2020-03-23 15:15:57

MySQL性能優化數據庫

2025-06-03 05:00:00

JetpackCompose技巧

2025-06-13 08:26:08

JetpackCompose按鈕

2009-12-31 15:21:48

Silverlight

2013-09-17 10:17:39

Android布局

2010-01-05 13:16:59

2010-07-06 09:07:09

2014-12-17 09:46:30

AndroidListView最佳實踐

2020-07-17 19:55:50

Vue前端性能優化

2017-01-23 21:05:00

AndroidApp啟動優化
點贊
收藏

51CTO技術棧公眾號

欧美丰满一区二区免费视频| 成人免费观看男女羞羞视频| 中文字幕免费精品一区高清| 特黄特黄一级片| av免费在线视| 日本一二三不卡| av资源一区二区| 波多野结衣高清在线| 欧美久久一区| 中文日韩在线观看| 国产精品一区二区人妻喷水| 国产69精品久久久久9999人| 亚洲成av人影院在线观看网| 亚洲午夜精品一区二区| 日本高清视频www| 国产在线播精品第三| 日av在线播放中文不卡| 国产黄色片在线免费观看| 欧美亚洲高清| 精品偷拍一区二区三区在线看| 国产三级精品三级在线| 欧美亚洲韩国| 香蕉影视欧美成人| 日本a级片在线观看| av中文在线| 久久久一区二区三区| 国产精品美女诱惑| 国产成人精品亚洲精品色欲| 免费观看日韩电影| 日本午夜人人精品| 国产成人精品一区二三区| 女同性一区二区三区人了人一| 永久免费看mv网站入口亚洲| 日本黄色特级片| 国产精品45p| 欧美videossexotv100| 国产无遮挡猛进猛出免费软件 | 中文字幕一区日韩精品| 欧美丝袜丝交足nylons| 北条麻妃在线一区| 周于希免费高清在线观看| 亚洲成av人片在www色猫咪| 2021国产视频| 欧美1—12sexvideos| 亚洲激情五月婷婷| 18视频在线观看娇喘| 欧美天天影院| 亚洲私人影院在线观看| 亚洲一区二区在线看| 99免在线观看免费视频高清| 亚洲国产精品精华液ab| 一区二区冒白浆视频| 成人高潮成人免费观看| 中文字幕精品一区| 视频一区二区三| av在线免费播放网站| 日本一区二区高清| 亚洲精品成人a8198a| 在线国产情侣| 亚洲人吸女人奶水| 日本xxx免费| 日本中文字幕中出在线| 亚洲一区中文日韩| 国内外成人免费激情视频| 在线黄色的网站| 在线精品视频一区二区三四| 性欧美videossex精品| 久久人人视频| 日韩欧美在线综合网| 日本精品一二三| 欧美日韩一本| 深夜福利日韩在线看| 亚洲 欧美 变态 另类 综合| 国语精品一区| 欧美伊久线香蕉线新在线| 日韩在线播放中文字幕| 麻豆高清免费国产一区| 91九色蝌蚪嫩草| 少妇精品高潮欲妇又嫩中文字幕| 91麻豆.com| 亚洲欧洲另类精品久久综合| 欧美aaaxxxx做受视频| 日韩欧美亚洲范冰冰与中字| xx欧美撒尿嘘撒尿xx| 亚洲网址在线观看| 亚洲免费av电影| 国产成人免费在线观看视频| 黄色精品免费| 国产精品久久久久免费a∨| 国产露脸91国语对白| 不卡一区二区中文字幕| 日韩欧美在线一区二区| www红色一片_亚洲成a人片在线观看_| 亚洲成精国产精品女| 午夜激情在线观看视频| 亚洲成人五区| 亚洲一区二区精品| 久草视频中文在线| 日韩影院免费视频| av一本久道久久波多野结衣| 成人综合影院| 性做久久久久久| 999这里有精品| 中文精品一区二区| 欧美成人精品激情在线观看| 国产污视频网站| 国产91丝袜在线观看| 日韩欧美在线电影| 亚洲精品日产| 欧美第一区第二区| 99成人在线观看| 久久久久久自在自线| caoporen国产精品| 欧美一级二级三级区| 欧美日韩在线影院| 蜜桃视频无码区在线观看| 欧美日中文字幕| 清纯唯美亚洲综合| 亚洲黄色小说网址| 国产精品九色蝌蚪自拍| 无遮挡又爽又刺激的视频 | 欧美日韩成人一区| 国产三级视频网站| 激情综合视频| 99蜜桃在线观看免费视频网站| h视频在线免费| 色欧美88888久久久久久影院| 在线观看免费视频黄| 亚洲天天综合| 91午夜在线播放| 欧美精品电影| 欧美日韩国产美女| 一区二区三区久久久久| 性8sex亚洲区入口| 精品国产二区在线| 华人av在线| 亚洲国产精品va在线看黑人动漫| 日韩a级片在线观看| 另类中文字幕网| 亚洲精品一品区二品区三品区| 中文字幕一区久| 日韩大陆毛片av| 九九热在线视频播放| 9久草视频在线视频精品| 成年人看的毛片| 九九热hot精品视频在线播放 | 久久久久久久久久一区二区三区| 国内不卡的二区三区中文字幕| 亚洲日本精品| av在线亚洲一区| 不卡av在线播放| 亚洲国产精品国自产拍久久| 一区二区三区小说| 看全色黄大色黄女片18| 国产精品人人爽人人做我的可爱| 久久久久久99| 国产精品亚洲d| 俺去了亚洲欧美日韩| av中文字幕免费| 一区二区三区不卡在线观看 | 国产欧美一区二区精品婷婷| 久久精品影视大全| 久久精品国内一区二区三区水蜜桃| 成人羞羞国产免费| 欧美伦理免费在线| 日韩精品视频在线观看网址 | 日本午夜精品一区二区三区电影| 日韩欧美亚洲v片| 国产电影一区二区| 韩国v欧美v日本v亚洲| 深夜福利视频在线观看| 欧美性猛交一区二区三区精品| 欧美一区二区三区观看| 国产精品一区专区| 免费一级特黄特色毛片久久看| 久久99国产精品视频| 成人精品在线观看| av免费不卡国产观看| 国产一区二区三区日韩欧美| 国产精品自偷自拍| 五月婷婷久久综合| 69xxx免费| 成人v精品蜜桃久久一区| 久久久久久香蕉| 亚洲综合自拍| 久久久久综合一区二区三区| 国产成人精选| 午夜精品一区二区三区在线视频| 欧美日本网站| 欧美一级午夜免费电影| 精品国产免费观看| 亚洲欧洲美洲综合色网| 日批在线观看视频| 久久激情五月激情| 无码人妻精品一区二区三区在线| 日韩a一区二区| 精品免费日产一区一区三区免费| 狂野欧美性猛交xxxx| 久久免费成人精品视频| 思思99re6国产在线播放| 亚洲电影在线看| 一级特黄aaa大片| 色综合天天综合| 九九视频在线免费观看| 欧美韩国日本综合| 在线视频 日韩| 国产馆精品极品| 日韩肉感妇bbwbbwbbw| 亚洲精品视频啊美女在线直播| 一本一生久久a久久精品综合蜜| 欧美一区自拍| 99九九视频| 日本欧美在线| 51久久精品夜色国产麻豆| av大大超碰在线| 中文字幕欧美视频在线| 四虎影视精品成人| 精品处破学生在线二十三| 国产女人18毛片水18精| 欧美熟乱第一页| 五月天婷婷导航| 欧美视频在线观看免费网址| 国产在线一二区| 一区二区三区加勒比av| wwwav国产| 中文字幕一区二区三区在线播放 | 91精品国产综合久久久久久久久| 亚洲精品日产| 538国产精品视频一区二区| 欧美性猛片xxxxx免费中国| 久久国内精品一国内精品| av中文天堂在线| 一本一本久久a久久精品牛牛影视| 涩爱av在线播放一区二区| 亚洲国产精品yw在线观看| 黄色成人一级片| 亚洲精品在线免费播放| 亚洲精品久久久久久无码色欲四季 | 久久久久久久久久久电影| 色呦呦一区二区| 99在线视频精品| 荫蒂被男人添免费视频| 99精品欧美一区二区三区小说 | 亚洲成人在线免费| 欧美日韩三级在线观看| 一区二区三区四区蜜桃| 久久国产精品二区| 亚洲一区二区三区四区的| 久草视频免费在线| 亚洲成av人在线观看| 欧美三日本三级少妇99| 欧美午夜精品久久久久久浪潮| 成年人免费高清视频| 一本久久a久久免费精品不卡| 五月激情六月丁香| 色域天天综合网| 亚洲天天综合网| 91精品国产入口| 亚洲精品久久久久久无码色欲四季| 精品日韩欧美在线| 污污的视频网站在线观看| 亚洲精品视频久久| 成人网视频在线观看| 另类天堂视频在线观看| 678在线观看视频| 国产99在线|中文| 日本免费在线一区| 国产精品swag| 国产一区二区三区不卡视频网站| 亚洲人成77777| 欧美视频官网| 激情网站五月天| 国产美女精品一区二区三区| 无码国产精品一区二区免费式直播| 99久久精品国产导航| 国产精品国产三级国产专业不| 成人免费小视频| 国产精品99无码一区二区| 日韩欧美在线看| 91久久久久国产一区二区| 欧美成人女星排名| 你懂的在线网址| 久久国产天堂福利天堂| 欲香欲色天天天综合和网| 国产精品网站视频| av成人资源| 五月天色一区| 激情偷拍久久| 中文字幕在线综合| jiyouzz国产精品久久| 婷婷综合在线视频| 亚洲成av人**亚洲成av**| 国产精品无码一区| 亚洲国产精品女人久久久| 欧美三级电影一区二区三区| 国内揄拍国内精品少妇国语| 久久精品国产福利| 国产精品裸体一区二区三区| 久久一本综合| 毛片一区二区三区四区| 国产精品亚洲人在线观看| 性猛交娇小69hd| 午夜伊人狠狠久久| 国产极品久久久| 中文字幕亚洲一区| 樱花草涩涩www在线播放| av蓝导航精品导航| 欧美va久久久噜噜噜久久| 成年人观看网站| 粉嫩av亚洲一区二区图片| 亚洲精品天堂网| 色偷偷一区二区三区| 亚洲美女综合网| 久热精品视频在线| 欧美成人黄色| 日韩国产高清一区| 男女精品网站| 国产精品无码网站| 亚洲 欧美综合在线网络| 国产成a人亚洲精v品无码| 自拍视频国产精品| 欧美人体一区二区三区| 黑人中文字幕一区二区三区| 国产精品久久| 亚洲av无一区二区三区久久| 亚洲欧洲日韩av| 91tv国产成人福利| 中文字幕欧美日韩在线| 第四色男人最爱上成人网| 久久精品中文字幕一区二区三区| 在线精品一区| 无码成人精品区在线观看| 亚洲综合成人在线视频| 国产高潮流白浆喷水视频| 久久综合伊人77777| 亚洲一区导航| 亚洲第一精品区| 精品综合免费视频观看| 在线观看天堂av| 欧美精品丝袜中出| 免费在线观看av| 国产欧美一区二区三区在线看| 成人亚洲一区| 欧美成年人视频在线观看| 国产精品成人午夜| 国产在成人精品线拍偷自揄拍| 精品国产一区久久久| 999精品嫩草久久久久久99| 亚洲 欧洲 日韩| 国产精品亚洲综合一区在线观看| 免费中文字幕视频| 亚洲国产精品悠悠久久琪琪| 日韩欧美精品一区二区三区| 久久久久久一区| 日本欧美一区二区三区乱码| 亚洲精品电影院| 日韩一级二级三级| 91九色porn在线资源| 蜜桃成人在线| 蜜桃久久久久久| wwwav国产| 精品视频久久久久久| 性感美女一区二区在线观看| 亚洲精品日韩成人| 国产成人精品一区二区三区四区 | 青青青视频在线播放| 91精品婷婷国产综合久久竹菊| 天堂av在线电影| 久久久影院一区二区三区| 日本欧美久久久久免费播放网| 999精品视频在线观看播放| 精品久久久久久综合日本欧美| 国产网站在线| 亚洲高清乱码| 成人小视频免费在线观看| av图片在线观看| 色偷偷噜噜噜亚洲男人| 亚洲一区二区三区中文字幕在线观看 | 欧美激情免费| 久久av免费观看| 久久电影网站中文字幕| 久久免费在线观看视频| 亚洲欧洲免费视频| 国产aⅴ精品一区二区四区| 国产男女在线观看| 国产精品国模大尺度视频| 狠狠躁夜夜躁av无码中文幕| 国产成人一区二| 欧美私人啪啪vps| 激情五月深爱五月| 亚洲黄色有码视频| 日韩精品第二页| 97视频在线免费播放| 夜色激情一区二区| yw在线观看| 狠狠爱一区二区三区| 国内精品免费**视频| 伊人中文字幕在线观看| 欧美激情视频一区| 欧美电影《轻佻寡妇》|