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

得物App安卓冷啟動優化-Application篇

移動開發 Android
對于通過點擊圖標啟動的普通場景,默認會在Application執行完整的初始化工作,但是一些層級比較深的功能,例如客服中心,編輯收貨地址這類,即使用戶以最快速度直接進入這些頁面,也是需要至少1s以上的操作時間,所以這些功能相關的初始化工作也是可以推遲到Application之后的,甚至改為懶加載,視具體功能的重要性而定。

前言

冷啟動指標是App體驗中相當重要的指標,在電商App中更是對用戶的留存意愿有著舉足輕重的影響。通常是指App進程啟動到首頁首幀出現的耗時,但是在用戶體驗的角度來看,應當是從用戶點擊App圖標,到首頁內容完全展示結束。

將啟動階段工作分配為任務并構造出有向無環圖的設計已經是現階段組件化App的啟動框架標配,但是受限于移動端的性能瓶頸,高并發度的設計使用不當往往會讓鎖競爭、磁盤IO阻塞等耗時問題頻繁出現。如何百尺竿頭更進一步,在啟動階段有限的時間里,將有限的資源最大化利用,在保障業務功能穩定的前提下盡可能壓縮主線程耗時,是本文將要探討的主題。

本文將介紹我們是如何通過對啟動階段的系統資源做統一管控,按需分配和錯峰加載等手段將得物App的線上啟動指標降低10%,線下指標降低34%,并在同類型的電商App中提升至Top3。

一、指標選擇

傳統的性能監控指標,通常是以Application的attachBaseContext回調作為起點,首頁decorView.postDraw任務執行作為結束時間點,但是這樣并不能統計到dex加載以及contentProvider初始化的耗時。

因此為了更貼近用戶真實體驗,在啟動速度監控指標的基礎上,我們添加了一個線下的用戶體感指標,通過對錄屏文件逐幀分析,找到App圖標點擊動畫開始播放(圖標變暗)作為起始幀,首頁內容出現的第一幀作為結束幀,計算出結果作為啟動耗時。

例:啟動過程為03:00 - 03:88,故啟動耗時為880ms。

圖片圖片

圖片圖片

二、Application優化

App在不同的業務場景下可能會落到不同的首頁(社區/交易/H5),但是Application運行的流程基本是固定的,且很少變更,因此Application優化是我們的首要選擇。

得物App的啟動框架任務在近幾年已經先后做過多輪優化,常規的抓trace尋找耗時點并異步化已經不能帶來明顯的收益,得從鎖競爭,CPU利用率的角度去挖掘優化點,這類優化可能短期收益不會特別明顯,但從長遠來看能夠提前規避很多劣化問題。

1.WebView優化

App在首次調用webview的構造方法時會拉起系統對webview的初始化流程,一般會耗時200+ms,如此耗時的任務常規思路都是直接丟到子線程去執行,但是chrome內核中加入了非常多的線程檢查,使得webview只能在構造它的線程中使用。

圖片圖片

為了加速H5頁面的啟動,App通常會選擇在Application階段就初始化webview并緩存,但是webview的初始化涉及跨進程交互和讀文件,因此CPU時間片,磁盤資源和binder線程池中任何一種不足都會導致其耗時膨脹,而Application階段任務繁多,恰恰很容易出現以上資源短缺的情況。

圖片圖片

因此我們將webview拆分成三個步驟,分散到啟動的不同階段來執行,這樣可以降低因為競爭資源導致的耗時膨脹問題,同時還可以大幅度降低出現ANR的幾率。

圖片圖片

1.1 任務拆分

    a. provider預加載

WebViewFactoryProvider是用于和webview渲染進程交互的接口類,webview初始化的第一步就是加載系統webview的apk文件,構建出classloader并反射創建了WebViewFactoryProvider的靜態實例,這一操作并沒有涉及線程檢查,因此我們可以直接將其交給子線程執行。

圖片圖片

    b. 初始化webview渲染進程

這一步對應著chrome內核中的WebViewChromiumAwInit.ensureChromiumStartedLocked()方法,是webview初始化最耗時的部分,但是和第三步是連續執行的。走碼分析發現WebViewFactoryProvider暴露給應用的接口中,getStatics這個方法會正好會觸發ensureChromiumStartedLocked方法。

至此,我們就可以通過執行WebSettings.getDefaultUserAgent()來達到僅初始化webview渲染進程的目的。

圖片圖片

圖片圖片

圖片圖片

    c. 構造webview

即new Webview()

1.2 任務分配

為了最大程度縮短主線程耗時,我們的任務安排如下:

    a. provider預加載,可以異步執行,且沒有任何前置依賴,因此放在Application階段最早的時間點異步執行即可。

    b. 初始化webview渲染進程,必須在主線程,因此放到首頁首幀結束之后。

    c. 構造webview,必須在主線程,在第二步完成時post到主線程執行。這樣可以確保和第二步不在同一個消息中,降低ANR的幾率。

圖片圖片

1.3 小結

盡管我們已經將webview初始化拆分為了三個部分,但是耗時占比最高的第二步在低端機或者極端情況還是可能觸達ANR的閾值,因此我們做了一些限制,例如當前設備會統計并記錄webview完整初始化的耗時,僅當耗時低于配置下發的閾值時,開啟上述的分段執行優化。

App如果是通過推送、投放等渠道打開,一般打開的頁面大概率是H5營銷頁,因此這類場景不適用于上述的分段加載,所以需要hook主線程的messageQueue,解析出啟動頁面的intent信息,再做判斷。

受限于開屏廣告功能,我們目前只能對無開屏廣告的啟動場景開啟此優化,后續將計劃利用廣告倒計時的間隙執行步驟2,來覆蓋有開屏廣告的場景。

圖片圖片

2.ARouter優化

在當下組件化流行的時代,路由組件已經幾乎是所有大型安卓App必備的基礎組件,目前得物使用的是開源的ARouter框架。

ARouter 框架的設計是它默認會將注解中注冊path路徑中第一個路由層級 (例如 "/trade/homePage"中的trade)作為該路由信息所的Group,  相同Group路徑的路由信息會合并到最終生成的同一個類 的注冊函數中進行同步注冊。在大型項目中,對于復雜業務線同一個Group下可能包含上百個注冊信息,注冊邏輯執行過程耗時較長,以得物為例,路由最多的業務線在初始化路由上的耗時已經來到了150+ms。

圖片圖片

路由的注冊邏輯本身是懶加載的,即對應Group之下的首個路由組件被調用時會觸發路由注冊操作。然而ARouter通過SPI(服務發現)機制來幫助業務組件對外暴露一些接口,這樣不需要依賴業務組件就可以調用一些業務層的視線,在開發這些服務時,開發者一般會習慣性的按照其所屬的組件為其設置路由path,這使得首次構造這些服務的時候也會觸發同一個Group下的路由加載。

而在Application階段肯定需要用到業務模塊的服務中的一些接口,這就會提前觸發路由注冊操作,雖然這一操作可以在異步線程執行,但是Application階段的絕大部分工作都需要訪問這些服務,所以當這些服務在首次構造的耗時增大時,整體的啟動耗時勢必會隨之增長。

2.1 ARouter Service路由分離

ARouter采用SPI設計的本意是為了解耦,Service的作用也應該只是提供接口,所以應當新增一個空實現的Service專門用于觸發路由加載,而原先的Service則需要更換一個Group,后續只用于提供接口,如此一來Application階段的其他任務就不需要等待路由加載任務的完成。

圖片圖片

2.2 ARouter支持并發裝載路由

我們在實現了路由分離之后,發現現有的熱點路由裝載耗時總和是大于Application耗時,而為了保證在進入閃屏頁之前完成對路由的加載,主線程不得不sleep等待路由裝載完畢。

分析可知ARouter的路由裝載方法加了類鎖,因為他需要將路由裝載到倉庫類中的map,這些map是線程不安全的HashMap,相當于所有的路由裝載操作其實都是在串行執行,而且存在鎖競爭的情況,最終導致耗時累加大于Application耗時。

圖片圖片

圖片圖片

分析trace可知耗時主要來自頻繁調用裝載路由的loadInto操作,再分析這里鎖的作用,可知加類鎖是主要是為了確保對倉庫WareHouse中map操作的線程安全。

圖片圖片

因此我們可以將類鎖降級對GroupMeta這個class對象加鎖(這個class是ARouter apt生成的類,對應apk中的ARouter$$Provider$$xxx類),來確保路由裝載過程中的線程安全,至于在此之前對map操作的線程安全問題,則完全可以通過將這些map替換為concurrentHashMap解決,在極端并發情況下會有一些線程安全問題,也可以按照圖中添加判空來解決。

圖片圖片

圖片圖片

至此,我們就實現了路由的并發裝載,隨后我們根據木桶效應對要預載的service進行合理分組,再放到協程中并發執行,確保最終整體耗時最短。

圖片圖片

圖片圖片

3.鎖優化

Application階段執行的任務多為基礎SDK的初始化,其運行的邏輯通常相對獨立,但是SDK之間會有依賴關系(例如埋點庫會依賴于網絡庫),且大部分都會涉及讀文件,加載so庫等操作,Application階段為了壓縮主線程的耗時,會盡可能地將耗時操作放到子線程中并發運行,充分利用CPU時間片,但是這也不可避免的會導致一些鎖競爭的問題。

3.1 Load so鎖

System.loadLibrary()方法用于加載當前apk中的so庫,這個方法對Runtime對象加了鎖,相當于一個類鎖。

基礎SDK在設計上通常會將load so的操作寫到類的靜態代碼塊中,確保在SDK初始化代碼執行之前就準備好了so庫。如果這個基礎SDK恰巧是網絡庫這類基礎庫,會被很多其他SDK調用,就會出現多個線程同時競爭這個鎖的情況。那么在最壞的情況下,此時IO資源緊張,讀so文件變慢,并且主線程是鎖等待隊列中最后一個,那么啟動耗時將遠超預期。

圖片圖片

為此,我們需要將loadSo的操作統一管控并收斂到一個線程中執行,強制他們以串行的方式運行,這樣就可以避免以上情況的出現。值得一提的是,前面webview的provider預加載的過程中也會加載webview.apk中的so文件,因此需要確保preloadProvider的操作也放到這個線程。

so的加載操作會觸發native層的JNI_onload方法,一些so可能會在其中執行一些初始化工作,因此我們不能直接調用System.loadLibrary()方法來進行so加載,否則可能會重復初始化出現問題。

我們最終采用了類加載的方式,即將這些so加載的代碼全部挪到相關類的靜態代碼塊中,然后再去觸發這些類的加載即可,利用類加載的機制確保這些so的加載操作不會重復執行,同時這些類加載的順序也要按照這些so使用的順序來編排。

圖片圖片

除此之外,so的加載任務不建議和其他需要IO資源的任務并發執行,在得物App中實測這兩種情況下該任務的耗時相差巨大。

4.啟動框架優化

目前常見的啟動框架設計是將啟動階段的工作分配到一組任務節點中,再由這些任務節點的依賴關系構造出一個有向無環圖,但是隨著業務迭代,一些歷史遺留的任務依賴已經沒有存在的必要,但是他會拖累整體的啟動速度。

啟動階段大部分工作都是基礎SDK的初始化,他們之間往往有著復雜的依賴關系,而我們在做啟動優化時為了壓縮主線程的耗時,通常都會找出主線程的耗時任務并丟到子線程去執行,但是在依賴關系復雜的Application階段,如果只是將其丟到異步執行未必能有預期的收益。

圖片

我們在做完webview優化之后發現啟動耗時并沒有和預期一樣直接減少了webview初始化的耗時,而是只有預期的一半左右,經分析發現我們的主線程任務依賴著子線程的任務,所以當子線程任務沒有執行完時,主線程會sleep等待。

并且webview之所以放在這個時間點初始化不是因為有依賴限制這它,而是因為這段時間主線程正好有一段比較長的sleep時間可以利用起來,但是異步的任務工作量是遠大于主線程的,即便是七個子線程并發在跑,其耗時也是大于主線程的任務。

因此想進一步擴大收益,就得對啟動框架中的任務依賴關系做優化。

圖片圖片

圖片圖片

以上第一張圖為優化之前得物App啟動階段任務的有向無環圖,紅框表示該任務在主線程執行。我們著重關注阻塞主線程任務執行的任務。

可以觀察到主線程任務的依賴鏈路上存在幾個出口和入口特別多的任務,出口多表明這類任務通常是非常重要的基礎庫(例如圖中的網絡庫),而入口多表明這個任務的前置依賴太多,他開始執行的時間點波動較大。這兩點結合起來就說明這個任務執行結束的時間點很不穩定,并且將直接影響到后續主線程的任務。

這類任務優化的思路主要是:

拆解任務自身,將可以提前執行或者延后執行的操作分出去,但是分出去之前要考慮到對應的時間段還有沒有時間片余量,或者會不會加重IO資源競爭的情況出現;

優化該任務的前置任務,讓該任務執行結束的時間點盡可能提早,就可以降低后續任務等待該任務的耗時;

移除非必要的依賴關系,例如埋點庫初始化只是需要注冊一個監聽器到網絡庫,并非發起網絡請求。(推薦)

可以看到我們在優化之后的第二張有向無環圖里,任務的依賴層級明顯變少,入口和出口特別多的任務也都基本不再出現。

圖片圖片

圖片圖片

對比優化前后的trace,也可以看到子線程的任務并發度明顯提高,但是任務并發度并不是越高越好,在時間片本身就不足的低端機上并發度越高表現可能會越差,因為更容易出鎖競爭,IO等待之類的問題,因此要適當留下一定空隙,并在中低端機上進行充分的性能測試之后再上線,或者針對高中低端機器使用不同的任務編排。

三、首頁優化

1.通用布局耗時優化

系統解析布局是通過inflate方法讀取布局xml文件并解析構建出view樹,這一過程涉及IO操作,很容易受到設備狀態影響,因此我們可以在編譯期通過apt解析布局文件生成對應的view構建類。然后在運行時提前異步執行這些類的方法來構建并組裝好view樹,這樣可以直接優化掉頁面inflate的耗時。

圖片圖片

圖片圖片

2.消息調度優化

在啟動階段我們通常會注冊一些ActivityLifecycleListener來監聽頁面生命周期,或者是往主線程post了一些延時任務,如果這些任務中有耗時操作,將會影響到啟動速度,因此可以通過hook主線程的消息隊列,將頁面生命周期回調和頁面繪制相關的msg移動到消息隊列的隊頭,這樣就可以加快首頁首幀內容展示的速度。

圖片圖片

詳情可期待本系列后續內容。

四、穩定性

性能優化對App只能算作錦上添花,穩定性才是生命紅線,而啟動優化改造的又都是執行時機非常早的Application階段,穩定性風險程度非常高,因此務必要在準備好崩潰防護的前提下做優化,即便有不可避免的穩定性問題,也要將負面影響降到最低。

1.崩潰防護

由于啟動階段執行的任務都是重要的基礎庫初始化,因此發生崩潰時將異常識別并吃掉的意義不大,因為大概率會導致后續崩潰或功能異常,因此我們主要的防護工作都是發生問題之后的止血。

配置中心SDK的設計通常都是從本地文件中讀出緩存的配置使用,待接口請求成功后再刷新。所以如果當啟動階段命中了配置之后發生了crash,是拉不到新配置的。這種情況下只能清空App緩存或者卸載重裝,會造成非常嚴重的用戶流失。

圖片圖片

  • 崩潰回退

對所有改動點加上try-catch保護,捕捉到異常之后上報埋點并往MMKV中寫入崩潰標記位,這樣該設備在當前版本下都不會再開啟啟動優化相關的變更,隨后再拋出原異常讓他崩潰掉。至于native crash則是在Crash監控的native崩潰回調里執行同樣操作即可。

圖片圖片

  • 運行狀態檢測

Java Crash我們可以通過注冊unCaughtExceptionHandler來捕捉到,但是native crash則需要借助crash監控SDK來捕捉,但是crash監控未必能在啟動最早的時間點初始化,例如Webview的Provider的預加載,以及so庫的預加載都是早于crash監控,而這些操作都涉及native層的代碼。

為了規避這種場景下的崩潰風險,我們可以在Application的起始點埋入MMKV標記位,在結束點改為另一個狀態,這樣一些執行時間早于配置中心的代碼就可以通過獲取這個標記位來判斷上一次運行是否正常,如果上次啟動發生了一些未知的崩潰(例如發生在crash監控初始化之前的native崩潰),那么通過這個標記位就可以及時關閉掉啟動優化的變更。

結合崩潰之后自動重啟的操作,在用戶視角其實是觀察不到閃退的,只是會感覺到啟動的耗時約是平時的1-2倍。

圖片圖片

  • 配置有效期

線上的技改變更通常都會配置采樣率,結合隨機數實現逐漸放量,但是配置下發SDK的設計通常都是默認取上次的本地緩存,在發生線上崩潰等故障時,盡管及時回滾了配置,但是緩存的設計會導致用戶還會因為緩存遭遇至少一次的崩潰。

為此,我們可以為每一個開關配置加一個配套的過期時間戳,限制當前放量的開關只在該時間戳之前生效,這樣在遇到線上崩潰等故障時確保可以及時止血,而且時間戳的設計也可以避免線上配置生效的滯后性導致的crash。

圖片圖片

用戶視角下,添加配置有效期前后對比:

圖片圖片

五、總結

至此,我們已經對安卓App中比較通用的冷啟動耗時案例做了分析,但是啟動優化最大的痛點往往還是App自身的業務代碼,應當結合業務需求合理的進行任務分配,如果一味的靠預加載,延遲加載和異步加載是不能從根本上解決耗時問題的,因為耗時并沒有消失只是轉移,隨之而來的可能是低端機啟動劣化或功能異常。

做性能優化不僅需要站在用戶的視角,還要有全局觀,如果因為啟動指標算是首頁首幀結束就把耗時任務都丟到首幀之后,勢必會造成用戶后續的體驗有卡頓甚至ANR。所以在拆分任務時不僅需要考慮是否會和與其并發的任務競爭資源,還需要考慮啟動各個階段以及啟動后一段時間內的功能穩定性和性能是否會受之影響,并且需要在高中低端機器上都驗證下,至少要確保都沒有劣化的表現。

1.防劣化

啟動優化絕不是一次性的工作,它需要長時間的維護和打磨,基礎庫的一次技改可能就會讓指標一夜回到解放前,因此防劣化必須要盡早落地。

通過在關鍵點添加埋點,可以做到在發現線上指標劣化時迅速定位到劣化代碼大概位置(例如xxActivity的onCreate)并告警,這樣不僅可以幫助研發迅速定位問題,還可以避免線上特定場景指標劣化線下無法復現的情況,因為單次啟動的耗時波動范圍最高能有20%,如果直接去抓trace分析可能連劣化的大概范圍都難以定位。

例如兩次啟動做trace對比時,其中一次因為遇到IO阻塞導致某次讀文件的操作都明顯變慢,而另一次IO正常,這就會誤導開發者去分析這些正常的代碼,而實際導致劣化的代碼可能因為波動正好被掩蓋。

2.展望

對于通過點擊圖標啟動的普通場景,默認會在Application執行完整的初始化工作,但是一些層級比較深的功能,例如客服中心,編輯收貨地址這類,即使用戶以最快速度直接進入這些頁面,也是需要至少1s以上的操作時間,所以這些功能相關的初始化工作也是可以推遲到Application之后的,甚至改為懶加載,視具體功能的重要性而定。

通過投放,push來做召回/拉新的啟動場景通常占比較少,但是其業務價值要遠大于普通場景。由于目前啟動耗時主要來源于webview初始化以及一些首頁預載相關的任務,如果啟動落地頁并不需要所有基礎庫(例如H5頁面),那么這些我們就可以將它不需要的任務統統延遲加載,這樣啟動速度可以得到大幅度增長,做到真正意義上的秒開。

責任編輯:武曉燕 來源: 得物技術
相關推薦

2024-09-03 16:09:59

2024-08-13 15:26:44

2023-05-10 18:34:49

推薦價格體驗優化UV

2025-04-02 02:10:00

2018-12-07 12:54:22

App美團外賣iOS客戶端

2023-07-19 22:17:21

Android資源優化

2022-11-14 14:53:14

架構技術編輯工具

2019-06-20 17:39:12

Android啟動優化

2022-03-02 10:58:33

系統優化實踐

2021-11-23 10:25:35

性能優化iOS App 啟動優化

2017-01-23 21:05:00

AndroidApp啟動優化

2023-05-19 18:35:37

2023-05-15 18:33:09

得物前端巡檢

2013-11-04 14:49:34

安卓

2018-12-27 13:11:04

愛奇藝APP優化

2025-11-11 01:55:00

2023-03-30 18:39:36

2020-06-05 10:17:58

安全漏洞LG

2022-12-12 18:56:04

點贊
收藏

51CTO技術棧公眾號

日韩**中文字幕毛片| 色哟哟日韩精品| 国产精品区二区三区日本| 国产一区二区三区影院| 国内亚洲精品| 这里只有精品免费| 成年人网站免费视频| 国产精品二线| 高清不卡一区二区在线| 欧美专区第一页| 国产黄色小视频网站| 欧美大片网址| 欧美一区二区三区在线看| 男人日女人逼逼| 黄色小网站在线观看| 97精品国产露脸对白| 91九色视频导航| 蜜臀精品一区二区三区| 欧美日韩1区| 在线电影av不卡网址| youjizz.com国产| 亚洲欧洲专区| 色婷婷香蕉在线一区二区| 久久www视频| 91av资源在线| 久久久久久久综合日本| 国产精品国产精品| 国产精品一级视频| 日韩av在线发布| 97不卡在线视频| 麻豆chinese极品少妇| 日韩欧美高清| 日韩成人小视频| 国产精品欧美性爱| 一区二区三区| 91国偷自产一区二区三区观看| 久艹在线免费观看| 久草资源在线观看| 国产精品国产自产拍高清av | 国产精品久久婷婷| 日本特黄久久久高潮| 热99精品里视频精品| 日产精品久久久久| 激情另类综合| 欧美国产在线视频| 久久久久久久久久久97| 亚洲色图网站| 久久艳片www.17c.com | 91精品精品| 精品国产欧美一区二区五十路| 亚洲精品91在线| 精品国产乱码久久久| 亚洲天堂av高清| 欧美偷拍一区二区三区| 精品高清久久| 在线播放国产一区二区三区| 公肉吊粗大爽色翁浪妇视频| 精品不卡一区| 日韩中文字幕精品视频| 免费在线观看黄色小视频| 91欧美在线| 免费av一区二区| 免费在线一区二区三区| 亚洲图片在线| 欧美亚洲第一页| 波多野结衣电车痴汉| 日韩va亚洲va欧美va久久| 国产精品日韩专区| 国产精品一区二区免费视频| 国产精品自拍一区| 亚洲一区二区少妇| 欧美亚洲精品在线观看| 91视视频在线观看入口直接观看www | 欧美a级黄色大片| 日本动漫理论片在线观看网站| 亚洲国产精品久久久男人的天堂| 伊人成色综合网| 日韩久久一区二区三区| 欧美日韩免费观看一区二区三区 | 亚洲视频专区在线| 成人在线观看免费完整| 伊人激情综合| 国产精品电影观看| 国产精品熟女久久久久久| 国产91精品一区二区麻豆网站| 国产一区福利视频| 成年人视频在线看| 亚洲精品v日韩精品| 欧美综合在线播放| 久久精品嫩草影院| 欧美精品一区二区久久久| 亚洲一区二区三区蜜桃| 99热国内精品永久免费观看| 国模叶桐国产精品一区| 中文字幕一区二区三区波野结| 国产精品自拍毛片| 欧美日韩三区四区| 在线网址91| 91久久人澡人人添人人爽欧美| 午夜免费一级片| 日韩三区视频| 操91在线视频| 香蕉污视频在线观看| 国产乱子伦视频一区二区三区| 国产伦精品一区二区三| 97电影在线| 午夜精品123| 午夜大片在线观看| 精品国产91久久久久久浪潮蜜月| 欧美激情在线观看视频| 最近中文字幕免费观看| 99久久久久久| 穿情趣内衣被c到高潮视频| 香蕉视频亚洲一级| 亚洲高清久久久久久| 韩国一级黄色录像| 视频一区中文字幕国产| 国产伦精品一区二区三区高清| 欧美一级二级三级区| 欧美日韩国产中文精品字幕自在自线 | 丁香花在线高清完整版视频| 欧美日韩亚洲综合一区| aaaaa一级片| 欧美私人啪啪vps| 国产欧洲精品视频| 番号在线播放| 一本大道久久精品懂色aⅴ| 国产精品91av| 亚洲精品888| 91精品久久久久久久久| shkd中文字幕久久在线观看| 欧美午夜影院在线视频| 国产高清成人久久| 韩国欧美一区| 成人免费视频视频在| av片在线观看永久免费| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 一级国产黄色片| 亚洲高清自拍| 岛国视频一区| 波多野结衣中文字幕久久| 欧美一级免费观看| 日日骚一区二区三区| 久久99精品久久久久| 亚洲国产精品日韩| 日韩经典一区| 一夜七次郎国产精品亚洲| 国产一级淫片a视频免费观看| 99国产精品久久| www.com毛片| 你懂的一区二区三区| 日本精品久久久| 青青草免费在线| 色狠狠av一区二区三区| 免费观看a级片| 日韩av二区在线播放| 天天综合色天天综合色hd| 欧美国产日韩电影| 日韩中文第一页| 国产av无码专区亚洲av| 亚洲最快最全在线视频| 蜜臀视频在线观看| 亚洲小说欧美另类社区| 国产精品久久九九| 午夜av不卡| 在线免费看av不卡| 国产精品一区二区免费视频| 亚洲影院久久精品| 国产国语性生话播放| 亚洲欧美卡通另类91av| 色综合影院在线观看| 3d动漫一区二区三区在线观看| 久久精品视频在线| 黄色aaa大片| 日韩欧美中文字幕在线观看| 欧美人妻一区二区三区| 国产一区二区久久| 又粗又黑又大的吊av| 国产精品午夜一区二区三区| 国产日韩精品在线播放| 麻豆蜜桃在线| 亚洲人成77777在线观看网| 国产精品久久久久久久免费看| 亚洲精品v日韩精品| 丰满少妇一区二区| 美女视频黄频大全不卡视频在线播放| 玖玖精品在线视频| 男男gay无套免费视频欧美| 国产日韩在线看片| 密臀av在线播放| 色av中文字幕一区| 无码精品在线观看| 欧美裸体bbwbbwbbw| 久久精品人妻一区二区三区| 国产三级精品视频| 国产精品日日摸夜夜爽| 久久资源在线| 99在线观看视频免费| 欧美天天综合| 国产女人水真多18毛片18精品| 日韩在线免费| 97热在线精品视频在线观看| 92国产在线视频| 亚洲国产福利在线| 97国产成人无码精品久久久| 天天综合网 天天综合色| 粉嫩精品久久99综合一区| 成人高清免费观看| 亚洲欧美日本一区二区| 麻豆久久精品| 国产精品一线二线三线| 欧美色女视频| 国产亚洲一本大道中文在线| 亚洲成人天堂网| 亚洲国内欧美| 在线看视频不卡| 要久久电视剧全集免费| 97netav| 欧美精品高清| 亚洲2020天天堂在线观看| 欧美边添边摸边做边爱免费| 日韩av网站导航| 精品国产av鲁一鲁一区| 欧美在线观看18| 久久精品视频5| 亚洲成av人片一区二区三区 | 亚洲专区**| 国产欧美精品一区二区| 欧美香蕉视频| 欧美在线激情网| 多野结衣av一区| 欧美激情视频播放| 欧美人与牲禽动交com| 久久精品成人动漫| 午夜在线视频| 色综合久久88色综合天天6| 日本黄色片一级片| 亚洲啊v在线观看| 亚洲激情一区二区| 欧美特黄一级大片| 欧美自拍偷拍午夜视频| 全网免费在线播放视频入口| 国产精品福利一区| 女人黄色一级片| 国产日韩欧美不卡| 亚洲精品国产熟女久久久| 久久综合色8888| 国产精品815.cc红桃| 26uuu精品一区二区| 97人妻天天摸天天爽天天| 99精品视频在线免费观看| 日韩免费高清一区二区| 99在线精品一区二区三区| 天堂www中文在线资源| 成人黄色a**站在线观看| 黄色性视频网站| 99久久精品国产一区| 一区二区视频观看| 久久久www成人免费无遮挡大片| 日韩一区二区a片免费观看| 国产人成亚洲第一网站在线播放 | 99久久精品99国产精品| 色天使在线视频| 久久日一线二线三线suv| 国产亚洲精品自在久久| 伊人久久亚洲| 国产精品一区二区三区免费| 国产精品丝袜在线播放| 久久久久资源| 日本欧美肥老太交大片| 一区二区三区欧美在线| 外国成人免费视频| 欧美性猛交内射兽交老熟妇| 伊人久久大香线蕉av超碰演员| 国产精品国产亚洲精品看不卡| 999在线观看精品免费不卡网站| 欧美日韩性生活片| 日本成人在线视频网站| 国产乱叫456| 成人h动漫精品| 成年人在线观看av| 中文字幕一区二区三区蜜月| 久久精品www人人爽人人| 欧美日韩免费观看中文| 国产在线一级片| 欧美va亚洲va香蕉在线| 青青草av免费在线观看| www国产精品视频| 精精国产xxxx视频在线野外 | 欧美日韩一级大片| 欧美日韩另类视频| 国产精品自偷自拍| 日韩激情视频在线播放| 欧美激情午夜| 91精品国产乱码久久久久久久久| 高清av一区二区三区| 粉嫩av一区二区三区免费观看| 天天躁日日躁狠狠躁欧美| 亚洲一区三区电影在线观看| 好看的av在线不卡观看| 午夜免费一区二区| 成人免费精品视频| 小嫩苞一区二区三区| 偷拍与自拍一区| 国产精品女人久久久| 日韩精品中文字幕在线播放| 国产区在线看| 国产精品18久久久久久首页狼 | av成人 com a| 成人在线国产精品| 免费短视频成人日韩| 特级西西444| 青青草国产成人av片免费| 欧美在线一级片| 亚洲激情图片qvod| 中文字幕人妻一区二区在线视频| 亚洲国产高潮在线观看| fc2ppv国产精品久久| 国产精品 欧美在线| 亚洲图片久久| 毛片在线播放视频| 国产精品一区二区你懂的| 我不卡一区二区| 欧美午夜片在线免费观看| 黄色一级大片在线免费看国产一| 色婷婷综合成人av| 国产极品一区| 日韩欧美一区二区在线观看| 一本色道久久综合亚洲精品不| 丰满人妻一区二区三区大胸| 中文字幕日韩一区| 正在播放亚洲精品| 亚洲桃花岛网站| 欧美性理论片在线观看片免费| 好看的日韩精品视频在线| 国一区二区在线观看| 亚洲性图第一页| 尤物视频一区二区| 国产黄a三级三级看三级| 久久综合色影院| 精品成人18| 中文字幕一区二区三区最新| 精品在线播放午夜| 日本女人性生活视频| 欧美日韩色综合| 91在线导航| 成人av在线网址| 午夜精品一区二区三区国产 | 在线免费观看一区二区| 永久免费看mv网站入口亚洲| 爱情电影社保片一区| 蜜桃av噜噜一区二区三| 久久成人亚洲| 性の欲びの女javhd| 欧美在线免费观看亚洲| av电影在线网| 成人国产精品一区二区| 99久久久久国产精品| 国产三级精品三级在线| 亚洲视频免费在线观看| 国产黄色一级大片| 久久人人爽人人爽人人片av高请| 高清日韩欧美| 欧美日韩亚洲第一| 国产农村妇女毛片精品久久麻豆 | 久久影院午夜精品| 欧美在线日韩精品| 麻豆精品一区二区三区| 亚洲一二三在线观看| 日韩三级视频在线看| а√在线中文网新版地址在线| 精品国产一区二区三区麻豆免费观看完整版 | 国产精品久久久久久影院8一贰佰| 中国黄色片一级| 亚洲一区二区视频在线| 九色蝌蚪在线| 亚洲va码欧洲m码| 亚洲青涩在线| 亚洲无人区码一码二码三码的含义 | 日韩在线观看网址| 欧美精品影院| 噜噜噜久久亚洲精品国产品麻豆| 久久蜜臀中文字幕| 99久久一区二区| 欧美性视频精品| 性欧美欧美巨大69| 风间由美一二三区av片| 欧美喷潮久久久xxxxx| 国内在线视频| 亚洲精品人成| caoporm超碰国产精品| 伊人成人在线观看| 97久久精品在线| 久久国产电影| 无码精品一区二区三区在线播放 | 亚洲国产欧美另类| 国产精品成人播放| 亚洲精选在线| 天天色天天综合| 亚洲视频欧洲视频|