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

一觸即發(fā)App啟動優(yōu)化實踐

移動開發(fā) Android
其實最早的時候,閃屏是用來在App未完全啟動的時候,讓用戶不至于困惑App是否啟動而加入的一個設計。而現在的很多App,基本上都把閃屏當做一個廣告、宣傳的頁面了,貌似已經失去了原本的意義,但閃屏,不管怎么說,在一個App啟動的時候,都是非常重要的,設計的事情,交給UE吧,開發(fā)要做的,就是讓App的啟動體驗,做到最好。

文中的很多圖都是Google性能優(yōu)化指南第六季中的一些截圖

Google給出的優(yōu)化指南來鎮(zhèn)樓

https://developer.android.com...

閃屏定義

Android官方的性能優(yōu)化典范,從第六季開始,發(fā)起了一系列針對App啟動的優(yōu)化實踐,地址如下:

https://www.youtube.com/watch...

可想而知,App的啟動性能是非常重要的。同時,Google針對App閃屏,也給出了非常詳細的設計定義,如下所示。

https://material.google.com/p... 

 

 

其實最早的時候,閃屏是用來在App未完全啟動的時候,讓用戶不至于困惑App是否啟動而加入的一個設計。而現在的很多App,基本上都把閃屏當做一個廣告、宣傳的頁面了,貌似已經失去了原本的意義,但閃屏,不管怎么說,在一個App啟動的時候,都是非常重要的,設計的事情,交給UE吧,開發(fā)要做的,就是讓App的啟動體驗,做到***。

App啟動流程

App啟動的整個過程,可以分解成下面幾個過程:

  1. 用戶在Launcher上點擊App Icon
  2. 系統(tǒng)為App創(chuàng)建進程,顯示啟動窗口
  3. App在進程中創(chuàng)建自己的組件

這個過程可以用下面這幅圖來描述: 

 

 

而我們能夠優(yōu)化的,也就是下面Application的創(chuàng)建部分,系統(tǒng)的進程分配以及一些窗口切換的動畫效果等,都是跟ROM相關的,我們無法處理。所以,我們需要把重點放到Application的創(chuàng)建過程。

上面是官方的說明,下面我們用更加通俗的語言來解釋一遍。

當用戶點擊桌面icon的時候,系統(tǒng)準備好了,給App分配進程空間,就好像去酒店開房,但是你又不能直接進入房間,你得坐電梯去房間,那么你坐電梯的這個時間,實際上就是系統(tǒng)的準備時間,那么系統(tǒng)的這個準備時間一般來說不會太長,但假如的開的是一個總統(tǒng)套房呢,系統(tǒng)就得花不少時間來打理,所以系統(tǒng)給所有用戶都準備了一個過渡界面,這個界面,就是啟動時的黑屏白屏,也就是你坐電梯里面看的小廣告,看完小廣告,你就到房間了,然后你想干嘛都可以了,這個想干嘛的速度,就完全取決于你開門的速度了,你門開得快,自然那啥快,所以這里是開發(fā)者可以優(yōu)化的地方,有些開發(fā)者掏個鑰匙要好幾秒,有的只要幾百毫秒,完全影響了后面那啥的效率。

那么一般來說,故事到這里就結束了,但是,系統(tǒng),也就是這個酒店,并不是一個野雞酒店,他也想盡量做得讓顧客滿意,這樣才會有回頭客啊,所以,酒店做了一個優(yōu)化,可以讓每個顧客自己定義在坐電梯的時候想看什么!也就是說,系統(tǒng)在加載App的時候,首先是加載了資源文件,這里就包括了要啟動的Activity的Theme,而這個Theme呢,是可以自定義的,也就是顧客在坐電梯時想看的東西,而不是千篇一律的白屏或者黑屏,他可以定制很多東西,例如ActionBar、背景、StatBar等等。

啟動時間的測量

關于Activity啟動時間的定義

對于Activity來說,啟動時,首先執(zhí)行的是onCreate()、onStart()、onResume()這些生命周期函數,但即使這些生命周期方法回調結束了,應用也不算已經完全啟動,還需要等View樹全部構建完畢,一般認為,setContentView中的View全部顯示結束了,算作是應用完全啟動了。

Display Time

從API19之后,Android在系統(tǒng)Log中增加了Display的Log信息,通過過濾ActivityManager以及Display這兩個關鍵字,可以找到系統(tǒng)中的這個Log:

  1. $ adb logcat | grep “ActivityManager” 

ActivityManager: Displayed com.example.launcher/.LauncherActivity: +999ms

抓到的Log如圖所示: 

 

 

那么這個時間,實際上是Activity啟動,到Layout全部顯示的過程,但是要注意,這里并不包括數據的加載,因為很多App在加載時會使用懶加載模式,即數據拉取后,再刷新默認的UI。

reportFullyDrawn

前面說了,系統(tǒng)日志中的Display Time只是布局的顯示時間,并不包括一些數據的懶加載等消耗的時間,所以,系統(tǒng)給我們定義了一個類似的『自定義上報時間』——reportFullyDrawn。

同樣是借用Google的一張圖來說明: 

 

 

reportFullyDrawn是由我們自己調用的,一般在數據全部加載完畢后,手動調用,這樣就會在Log中增加一條日志:

  1. $ adb logcat | grep “ActivityManager” 
  2. ActivityManager: Displayed com.example.launcher/. LauncherActivity: +999ms 
  3. ActivityManager: Fully drawn com.example.launcher/. LauncherActivity: +1s999ms  

一般來說,使用的場景如下:

  1. public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Void> { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main); 
  7.     } 
  8.  
  9.     @Override 
  10.     public void onLoadFinished(Loader<Void> loader, Void data) { 
  11.         // 加載數據 
  12.         // …… 
  13.         // 上報reportFullyDrawn 
  14.         reportFullyDrawn(); 
  15.     } 
  16.  
  17.     @Override 
  18.     public Loader<Void> onCreateLoader(int id, Bundle args) { 
  19.         return null
  20.     } 
  21.  
  22.     @Override 
  23.     public void onLoaderReset(Loader<Void> loader) { 
  24.  
  25.     } 
  26.  

但是要注意,這個方式需要API19+,所以,這里需要對SDK版本進行判斷。

計算啟動時間——ADB

通過ADB命令可以統(tǒng)計應用的啟動時間,指令如下所示:

  1. ➜  ~  adb shell am start -W com.xys.preferencetest/.MainActivity 
  2. Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.xys.preferencetest/.MainActivity } 
  3. Status: ok 
  4. Activity: com.xys.preferencetest/.MainActivity 
  5. ThisTime: 1047 
  6. TotalTime: 1047 
  7. WaitTime: 1059 
  8. Complete  

該指令一共給出了三個時間:

  • ThisTime:***一個啟動的Activity的啟動耗時
  • TotalTime:自己的所有Activity的啟動耗時
  • WaitTime: ActivityManagerService啟動App的Activity時的總時間(包括當前Activity的onPause()和自己Activity的啟動)

這三個時間不是很好理解,我們可以把整個過程分解

1.上一個Activity的onPause()——2.系統(tǒng)調用AMS耗時——3.***個Activity(也許是閃屏頁)啟動耗時——4.***個Activity的onPause()耗時——5.第二個Activity啟動耗時

那么,ThisTime表示5(***一個Activity的啟動耗時)。TotalTime表示3.4.5總共的耗時(如果啟動時只有一個Activity,那么ThisTime與TotalTime應該是一樣的)。WaitTime則表示所有的操作耗時,即1.2.3.4.5所有的耗時。

每次給出的時間可能并不一樣,而且應用從***安裝啟動到后面每次正常啟動,時間都會不同,區(qū)別于系統(tǒng)是否要分配進程空間。

計算啟動時間——Screen Record

通過錄屏進行啟動的分析,是一個很好的辦法,在API21+,Android給我們提供了一個更加方便、準確的方式:

  1. ➜ ~ adb shell screenrecord --bugreport /sdcard/test.mp4 

Android在screenrecord中新增了一個參數——bugreport,那么加了這個參數之后,錄制出來的視頻,在左上角就會增加一行數字的顯示,如圖所示。

在視頻開始前,會顯示設備信息和一些參數: 

 

 

 視頻開始后,左上角會有一行數字: 

 

 

[[175683]]

例如圖中的:15:31:22.261 f=171(0)

其中,前面的4個數字,就是時間戳,即15點31分22秒261,f=后面的數字是當前的幀數,注意,不是幀率,而是代表當前是第幾幀,括號中的數字,代表的是『Dropped framescount』,即掉幀數。

有了這個東西,再結合視頻就可以非常清楚的看見這些信息了。

啟動時間的調試

模擬啟動延時

在測試的時候,我們可以通過下面的方式來進行啟動的延遲模擬:

  1. SystemClock.sleep(2000) 

或者直接通過:

  1. try { 
  2.     Thread.sleep(2000); 
  3. } catch (InterruptedException e) { 
  4.     e.printStackTrace(); 
  5.  

或者通過:

  1. new Handler().postDelayed(new Runnable() { 
  2.     @Override 
  3.     public void run() { 
  4.         // Delay 
  5.     } 
  6.  
  7. }, 2000);  

這些方案都可以進行啟動延遲的模擬。

強制冷啟動

在『開發(fā)者選項』中的Background Process Limit中設置為No Background Processes 

 

 

優(yōu)化點

Static Block

很多代碼中的Static Block,都是做一些初始化工作,特別是ContentProvider中在Static Block中初始化一些UriMatcher,這些東西可以做成懶加載模式。

Application

Application是程序的主入口,特別是很多第三方SDK都會需要在Application的onCreate里面做很多初始化操作,不得不說,各種第三方SDK,都特別喜歡這個『兵家必爭之地』,再加上自己的一些庫的初始化,會讓整個Application不堪重負。

優(yōu)化的方法,無非是通過以下幾個方面:

  • 延遲初始化
  • 后臺任務
  • 界面預加載

阻塞

阻塞有很多種情況,例如磁盤IO阻塞(讀寫文件、SharedPerfences)、網絡阻塞(現在應該不會了)以及高CPU占用的代碼(加解密、渲染、解析等等)。

View層級

見《Android群英傳》

耗時方法

通過使用TraceView && Systrace && Method Tracing工具來進行排查,見《Android群英傳:神兵利器》

App啟動優(yōu)化的一般過程

  1. 通過TraceView、Systrace來分析耗時的方法與組件。
  2. 梳理啟動加載的每一個庫、組件。
  3. 將梳理出來的庫,按功能和需求進行劃分,設計該庫的啟動時機。
  4. 與交互溝通,設計啟動畫面,按前文方法進行優(yōu)化。

解決方案

Theme

當系統(tǒng)加載一個Activity的時候,onCreate()是一個耗時過程,那么在這個過程中,系統(tǒng)為了讓用戶能有一個比較好的體驗,實際上會先繪制一些初始界面,類似于PlaceHolder。

系統(tǒng)首先會讀取當前Activity的Theme,然后根據Theme中的配置來繪制,當Activity加載完畢后,才會替換為真正的界面。所以,Google官方提供的解決方案,就是通過android:windowBackground屬性,來進行加載前的配置,同時,這里不僅可以配置顏色,還能配置圖片,例如,我們可以使用一個layer-list來作為android:windowBackground要顯示的圖:

start_window.xml

  1. <layer-list xmlns:android="http://schemas.android.com/apk/res/android" 
  2.             android:opacity="opaque"
  3.     <item android:drawable="@android:color/darker_gray"/> 
  4.     <item> 
  5.         <bitmap 
  6.             android:gravity="center" 
  7.             android:src="@mipmap/ic_launcher"/> 
  8.     </item> 
  9. </layer-list>  

可以看見,這里通過layer-list來實現圖片的疊加,讓開發(fā)者可以自由組合。

配置中的android:opacity="opaque"參數是為了防止在啟動的時候出現背景的閃爍。

接下來可以設置一個新的Style,這個Style就是Activity預加載的Style。

  1. <resources> 
  2.  
  3.     <!-- Base application theme. --> 
  4.     <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"
  5.         <!-- Customize your theme here. --> 
  6.         <item name="colorPrimary">@color/colorPrimary</item> 
  7.         <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
  8.         <item name="colorAccent">@color/colorAccent</item> 
  9.     </style> 
  10.  
  11.     <style name="StartStyle" parent="AppTheme"
  12.         <item name="android:windowBackground">@drawable/start_window</item> 
  13.     </style> 
  14. </resources>  

OK,下面在Mainifest中給Activity指定需要預加載的Style:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.           package="com.xys.startperformancedemo"
  4.  
  5.     <application 
  6.         android:allowBackup="true" 
  7.         android:icon="@mipmap/ic_launcher" 
  8.         android:label="@string/app_name" 
  9.         android:supportsRtl="true" 
  10.         android:theme="@style/AppTheme"
  11.         <activity 
  12.             android:name=".MainActivity" 
  13.             android:theme="@style/StartStyle"
  14.             <intent-filter> 
  15.                 <action android:name="android.intent.action.MAIN"/> 
  16.  
  17.                 <category android:name="android.intent.category.LAUNCHER"/> 
  18.             </intent-filter> 
  19.         </activity> 
  20.     </application> 
  21.  
  22. </manifest>  

這里需要注意下,一定是Activity的Theme,而不是Application的Theme。

***,我們在Activity加載真正的界面之前,將Theme設置回正常的Theme就好了:

  1. public class MainActivity extends AppCompatActivity { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         setTheme(R.style.AppTheme); 
  6.         super.onCreate(savedInstanceState); 
  7.         SystemClock.sleep(2000); 
  8.         setContentView(R.layout.activity_main); 
  9.     } 
  10.  

在這個Activity中,我使用SystemClock.sleep(2000),模擬了一個Activity加載的耗時過程,在super.onCreate(savedInstanceState)調用前,將主題重新設置為原來的主題。

通過這種方式設置的效果如下: 

 

 

啟動的時候,會先展示一個畫面,這個畫面就是系統(tǒng)解析到的Style,等Activity加載完全完畢后,才會加載Activity的界面,而在Activity的界面中,我們將主題重新設置為正常的主題,從而達到一個友好的啟動體驗,這種方式其實并沒有真正的加速啟動過程,而是通過交互體驗來優(yōu)化了展示的效果。

異步初始化

這個很簡單,就是讓App在onCreate里面盡可能的少做事情,而利用手機的多核特性,盡可能的利用多線程,例如一些第三方框架的初始化,如果能放線程,就盡量的放入線程中,最簡單的,你可以直接new Thread(),當然,你也可以通過公共的線程池來進行異步的初始化工作,這個是最能夠壓縮啟動時間的方式

延遲初始化

延遲初始化并不是減少了啟動時間,而是讓耗時操作讓位、讓資源給UI繪制,將耗時的操作延遲到UI加載完畢后,所以,這里建議通過mDecoView.post方法,來進行延遲加載,代碼如下:

  1. getWindow().getDecorView().post(new Runnable() { 
  2.  
  3.   @Override public void run() { 
  4.     …… 
  5.   } 
  6. });  

我們的ContentView就是通過mDecoView.addView加入到根布局的,所以,通過這種方式,可以讓延遲加載的內容,在ContentView初始化完畢后,再進行執(zhí)行,保證了UI繪制的流暢性。

IntentService

IntentService是繼承于Service并處理異步請求的一個類,在IntentService的內部,有一個工作線程來處理耗時操作,啟動IntentService的方式和啟動傳統(tǒng)Service一樣,同時,當任務執(zhí)行完后,IntentService會自動停止,而不需要去手動控制。

  1. public class InitIntentService extends IntentService { 
  2.  
  3.     private static final String ACTION = "com.xys.startperformancedemo.action"
  4.  
  5.     public InitIntentService() { 
  6.         super("InitIntentService"); 
  7.     } 
  8.  
  9.     public static void start(Context context) { 
  10.         Intent intent = new Intent(context, InitIntentService.class); 
  11.         intent.setAction(ACTION); 
  12.         context.startService(intent); 
  13.     } 
  14.  
  15.     @Override 
  16.     protected void onHandleIntent(Intent intent) { 
  17.         SystemClock.sleep(2000); 
  18.         Log.d(TAG, "onHandleIntent: "); 
  19.     } 
  20.  

我們將耗時任務丟到IntentService中去處理,系統(tǒng)會自動開啟線程去處理,同時,在任務結束后,還能自己結束Service,多么的人性化!OK,只需要在Application或者Activity的onCreate中去啟動這個IntentService即可:

  1. @Override 
  2. protected void onCreate(Bundle savedInstanceState) { 
  3.     super.onCreate(savedInstanceState); 
  4.     setContentView(R.layout.activity_main); 
  5.     InitIntentService.start(this); 
  6.  

***不要忘記在Mainifest注冊Service。

使用ActivityLifecycleCallbacks

Framework提供的這個方法可以監(jiān)控到所有Activity的生命周期,在這里,我們就可以通過onActivityCreated這樣一個回調,來將一些UI相關的初始化操作放到這里,同時,通過unregisterActivityLifecycleCallbacks來避免重復的初始化。同時,這里onActivityCreated回調的參數Bundle,可以用來區(qū)別是否是被系統(tǒng)所回收的Activity。

  1. public class MainApplication extends Application { 
  2.  
  3.     @Override 
  4.     public void onCreate() { 
  5.         super.onCreate(); 
  6.         // 初始化基本內容 
  7.         // …… 
  8.         registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { 
  9.             @Override 
  10.             public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 
  11.                 unregisterActivityLifecycleCallbacks(this); 
  12.                 // 初始化UI相關的內容 
  13.                 // …… 
  14.             } 
  15.  
  16.             @Override 
  17.             public void onActivityStarted(Activity activity) { 
  18.             } 
  19.  
  20.             @Override 
  21.             public void onActivityResumed(Activity activity) { 
  22.             } 
  23.  
  24.             @Override 
  25.             public void onActivityPaused(Activity activity) { 
  26.             } 
  27.  
  28.             @Override 
  29.             public void onActivityStopped(Activity activity) { 
  30.             } 
  31.  
  32.             @Override 
  33.             public void onActivitySaveInstanceState(Activity activity, Bundle outState) { 
  34.             } 
  35.  
  36.             @Override 
  37.             public void onActivityDestroyed(Activity activity) { 
  38.             } 
  39.         }); 
  40.     } 
  41.  

資源優(yōu)化

有幾個方面,一個自然是優(yōu)化布局、布局層級,一個是優(yōu)化資源,盡可能的精簡資源、避免垃圾資源,這些可以通過混淆和tinyPNG這些工具來實現。

甩鍋方案

下面是兩種不同的方案,都是在Style中進行配置:

  1. <item name="android:windowDisablePreview">true</item> 

  1. <item name="android:windowIsTranslucent">true</item> 
  2. <item name="android:windowNoTitle">true</item>  

我們先來看看這樣做的效果: 

 

 

設置效果類似,即通過取消、透明化系統(tǒng)的統(tǒng)一的加載頁面來達到啟動的『加速』,實際上,是一個『甩鍋』的過程。強烈建議開發(fā)者不要通過這種方式去做『所謂的啟動加速』,這種方式雖然看上去自己的App啟動非常快,瞬間就完成了,但實際上,是將真正的啟動界面給隱藏了。

系統(tǒng)說:這鍋,我們不背!

無解

對應5.0以下的65535問題,目前只能通過Multidex來進行處理,而在5.0以下的機器上,系統(tǒng)在加載前的合并Dex的過程,有可能非常長,這也是暫時無解的問題,只能希望后面Multidex進行優(yōu)化。

OK,App的啟動優(yōu)化基本如上,其重點過程,依然是分析耗時的操作,以及如何設計合理的啟動順序,希望各位能夠通過文中介紹的方式來進行App的啟動優(yōu)化。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2012-06-05 09:35:34

PaaSOracle云計算

2013-10-31 16:52:47

地圖團購

2016-08-12 15:33:29

云服務阿里云亞馬遜云

2017-07-26 13:54:10

AWS+EasySta

2017-01-11 13:54:09

聯(lián)想

2011-04-21 09:39:55

云計算創(chuàng)新一觸即發(fā)

2010-11-02 08:58:22

JavaOracleJCP

2014-09-09 09:45:09

WIFI智能家居

2009-09-01 17:41:57

Windows7微軟兼容性

2021-01-06 10:50:39

ITOT領導者

2017-06-22 09:25:25

2013-12-04 13:14:13

2016-08-03 11:43:13

云計算

2015-11-16 17:18:59

ivvi

2009-08-13 17:32:50

2016-10-26 09:58:50

易觀

2011-04-29 15:41:54

移動游戲手機游戲

2012-01-01 22:30:16

2018-06-10 16:11:31

2016-09-18 13:27:25

科技 生態(tài)
點贊
收藏

51CTO技術棧公眾號

国产精品日韩欧美一区二区三区 | 久久精品亚洲乱码伦伦中文 | 国产性天天综合网| 国产精品一区二区三区成人| 久久久久久久极品内射| 一本久久青青| 日韩欧美在线一区二区三区| 夫妻免费无码v看片| 日本在线免费中文字幕| 成a人片亚洲日本久久| 国产精品美乳在线观看| 久久亚洲AV无码| 激情五月综合网| 日韩精品最新网址| 亚洲综合av在线播放| 国产精品25p| 亚洲欧美另类小说视频| 欧美精品123| 免费国产羞羞网站视频| 激情欧美一区二区三区在线观看| 2019精品视频| 欧美成人片在线观看| 欧美精品羞羞答答| 日韩hd视频在线观看| 亚洲精品一二三四| 日韩一级特黄| 欧美在线视频你懂得| 亚洲熟妇无码另类久久久| 亚洲男人第一网站| 日本三级日本三级日本三级极| 五月天色综合| 91久久香蕉国产日韩欧美9色| 精品视频在线观看一区| 在线毛片网站| 国产精品丝袜在线| 日本一区二区三区视频免费看| 日本高清视频免费观看| 高清日韩电视剧大全免费| 成人在线视频网| 亚洲av无码乱码国产精品fc2| 久久国产主播| 欧美在线一级视频| 女人十八岁毛片| 亚洲黄色视屏| 高清欧美一区二区三区| 久久久精品人妻一区二区三区四| 综合激情网站| 欧美另类69精品久久久久9999| 秋霞欧美一区二区三区视频免费| 日韩欧美伦理| 日日噜噜噜夜夜爽亚洲精品| 成人无码av片在线观看| 国产精品一区二区99| 亚洲欧美日韩精品久久| 中文字幕在线观看免费高清| 欧州一区二区| 日韩在线观看高清| 男女性高潮免费网站| 亚洲精品一二三区区别| 欧美乱大交xxxxx| 国产亚洲成人av| 在线看片日韩| 欧美在线不卡区| 无码人妻aⅴ一区二区三区有奶水 无码免费一区二区三区 | 久草精品视频在线观看| a91a精品视频在线观看| 欧美专区在线观看| 日韩精品在线一区二区三区| 麻豆精品国产传媒mv男同| 成人精品一区二区三区电影免费 | 欧美精品一区二区久久久| 四虎精品一区二区| 欧美调教网站| 伊人伊成久久人综合网站 | 亚洲午夜激情网站| 中文字幕无码精品亚洲资源网久久| а√在线天堂官网| 色诱亚洲精品久久久久久| 男女爽爽爽视频| 国产一区二区在线观| 亚洲国产成人爱av在线播放| 免费看黄色的视频| 久久精品影视| 26uuu另类亚洲欧美日本一| 波多野结衣高清视频| 国产精品一区二区在线观看不卡| 国产精品9999久久久久仙踪林| 亚洲日本香蕉视频| 国产精品人妖ts系列视频| 国产免费xxx| www.精品| 欧美一区二区三区小说| 国精产品一区一区三区免费视频| 国产精品久久久久一区二区三区厕所| 欧美日韩成人精品| 波多野结衣网站| 国产传媒欧美日韩成人| 日本一区二区三区四区高清视频 | 亚洲精品美腿丝袜| 人妻精品无码一区二区三区 | 4438成人网| 国产精品无码网站| 亚洲成人tv| 国产91精品网站| 老牛影视av牛牛影视av| 国产婷婷一区二区| 国产美女主播在线播放| 中文字幕成人| 亚洲视频精品在线| 久久精品亚洲无码| 九九视频精品免费| 日本免费高清一区| 九色porny视频在线观看| 91精品国产综合久久久久久久 | 男男受被啪到高潮自述| 日本a级不卡| 欧美在线影院在线视频| 懂色av一区二区三区四区| 国产精品理伦片| 97在线播放视频| 巨人精品**| 久久91精品国产91久久久| 亚洲天堂狠狠干| 99re在线视频这里只有精品| 男人添女人下部视频免费| 欧美高清你懂的| 亚洲人成电影网站色www| 国产无码精品视频| 国产成人午夜片在线观看高清观看| 亚洲精品国产精品国自产观看| 亚洲国产福利| 日韩经典第一页| 日韩精品无码一区二区| 成人中文字幕在线| 97碰在线视频| 综合成人在线| 欧美激情影音先锋| 女人18毛片一区二区三区| 亚洲精品乱码久久久久久黑人| 天天色天天综合网| 郴州新闻综合频道在线直播| 国产精品va在线| 国产乱子伦三级在线播放| 色婷婷精品久久二区二区蜜臀av| 一区二区三区免费在线观看视频| 国产一区二区三区的电影 | 巨大荫蒂视频欧美大片| 欧美日韩国产小视频| 在线观看黄网址| 久久99国内精品| 97超碰人人爱| 最新精品在线| 午夜精品福利电影| 青青草视频在线免费观看| 大伊人狠狠躁夜夜躁av一区| 久久精品老司机| 三级久久三级久久久| 水蜜桃一区二区| 在线视频成人| 欧美激情视频给我| 视频一区二区免费| 色综合天天综合网天天看片| b站大片免费直播| 蜜臀av性久久久久蜜臀aⅴ| 亚洲欧洲久久| 天堂久久av| 2025国产精品视频| a√在线中文网新版址在线| 91麻豆精品国产91久久久| 久久久久久久久毛片| 成人激情视频网站| 虎白女粉嫩尤物福利视频| 日韩av自拍| 99精彩视频| 蜜桃麻豆影像在线观看| 中文字幕九色91在线| 精品久久久久久亚洲综合网站| 亚洲3atv精品一区二区三区| 午夜理伦三级做爰电影| 精品一区二区在线观看| 国产精品成人久久电影| 国产欧美高清视频在线| 91亚洲va在线va天堂va国 | 午夜电影亚洲| 精品午夜一区二区三区| 国产精品成人国产| 久久久久久久久久久成人| 韩日视频在线| 欧美一级理论性理论a| 欧美一区二区激情视频| ㊣最新国产の精品bt伙计久久| bl动漫在线观看| 久草这里只有精品视频| 凹凸国产熟女精品视频| 偷拍欧美精品| 欧美日韩高清在线一区| 日韩一区二区三区在线看| 日本韩国欧美精品大片卡二| 最新日本在线观看| 国产亚洲欧美视频| 好吊色视频一区二区| 欧美日韩国产一区| 国产一级免费视频| 亚洲小说欧美激情另类| 天堂资源在线视频| aaa国产一区| 青青草原播放器| 日韩成人av影视| 国产午夜福利100集发布| 正在播放日韩欧美一页| 五月婷婷一区| 精品一区欧美| 国产91视觉| 999久久久国产999久久久| 全亚洲最色的网站在线观看| 欧洲性视频在线播放| www.日韩av.com| 国自产拍在线网站网址视频| 亚洲国产毛片完整版| 国产视频一区二区三| 欧美色综合久久| 欧美a视频在线观看| 性感美女极品91精品| 国产性70yerg老太| 亚洲狠狠丁香婷婷综合久久久| 免费一级suv好看的国产网站| 26uuu另类欧美| 国产真实乱人偷精品| 粉嫩嫩av羞羞动漫久久久| www.久久av.com| 免费成人av在线播放| 黄色高清无遮挡| 久久xxxx精品视频| 99色精品视频| 模特精品在线| 久久精品一区二| 久久国产主播| 欧美日韩亚洲一二三| 久久九九国产| 另类小说第一页| 日韩电影在线观看电影| 国产福利视频在线播放| 午夜亚洲精品| 少妇人妻互换不带套| 日韩黄色小视频| 五月婷婷激情久久| 另类综合日韩欧美亚洲| 亚洲国产日韩欧美在线观看| 蜜臀av亚洲一区中文字幕| 色乱码一区二区三区在线| 麻豆精品久久精品色综合| 精品综合久久久久| 国产精品主播直播| av电影中文字幕| av激情综合网| 熟女少妇内射日韩亚洲| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 婷婷激情成人| 99porn视频在线| 国产精品jk白丝蜜臀av小说| 久久大香伊蕉在人线观看热2| 女人丝袜激情亚洲| 亚洲精品一区二区毛豆| 亚洲精品极品少妇16p| 欧美精品久久久久久久自慰| 欧美一级播放| 中文字幕网av| 国产精品2024| 亚洲av无码一区二区二三区| 国产区在线观看成人精品| 疯狂撞击丝袜人妻| 亚洲午夜久久久| 欧美性猛交xxxx乱大交hd| 日韩一区二区三区三四区视频在线观看| 亚洲第一页综合| 亚洲人成在线播放| 国内外激情在线| 538国产精品一区二区免费视频| 免费污视频在线一区| 91在线播放国产| 全球av集中精品导航福利| 亚洲精品成人三区| 在线精品一区| 777一区二区| av在线不卡免费看| 亚洲一级理论片| 午夜激情综合网| 中文字字幕在线观看| 亚洲国产精品va在线观看黑人| 狠狠v欧美ⅴ日韩v亚洲v大胸| 欧美人与物videos| 欧美自拍电影| 国产精品国产精品| 日韩一区欧美| www国产精品内射老熟女| 九色综合国产一区二区三区| 18禁裸乳无遮挡啪啪无码免费| 亚洲欧美在线视频观看| 国产又大又粗又爽| 欧美sm美女调教| 亚洲搞黄视频| 热99在线视频| 国产精品色在线网站| 少妇高潮流白浆| 日韩中文字幕91| 中文字幕免费在线播放| 亚洲欧美色图小说| 成人黄色激情视频| 精品夜色国产国偷在线| 欧美1—12sexvideos| 成人国产精品色哟哟| 精品国产精品久久一区免费式| www插插插无码视频网站 | 91亚色免费| 欧美成人激情| 另类小说第一页| 久久久国产精华| 久久久久久久极品| 精品久久久久久亚洲综合网| 含羞草www国产在线视频| 国产精品久久久久一区二区| 亚洲成aⅴ人片久久青草影院| 欧美人成在线观看| 国产精品一色哟哟哟| 国产又粗又硬又长又爽| 欧美羞羞免费网站| 国产日本在线| 国产成人综合av| 国产成人精品免费视| 久久久久人妻精品一区三寸| www.欧美.com| 久久精品国产亚洲AV无码麻豆| 欧美mv日韩mv国产网站| 在线中文字幕视频观看| 91九色偷拍| 欧美激情第10页| 少妇精品无码一区二区| 亚洲综合区在线| 亚洲va天堂va欧美ⅴa在线| 美女性感视频久久久| 国产精品亚洲综合在线观看 | 奇米888一区二区三区| 亚洲综合日韩| 久操视频免费看| 在线精品视频一区二区三四| 高清美女视频一区| 国产精品久久久91| 手机在线电影一区| 欧美伦理片在线观看| 中文字幕中文字幕一区| 国产剧情久久久| 欧美人在线视频| 激情亚洲另类图片区小说区| 亚洲 欧美 日韩 国产综合 在线| 91在线视频免费观看| 无码人妻黑人中文字幕| 这里只有精品在线播放| 在线高清欧美| 亚洲一区二区三区av无码| 99精品国产91久久久久久| 999视频在线| 久久精品国产免费观看| 亚洲天堂av资源在线观看| 无码专区aaaaaa免费视频| 国产视频一区在线播放| 在线视频免费观看一区| 欧美精品在线看| 亚洲春色h网| 青青草久久伊人| 亚洲最快最全在线视频| 激情小视频在线| 成人免费大片黄在线播放| 亚洲国产免费看| 美女被到爽高潮视频| 欧美电影在线免费观看| 激情影院在线| 欧美一区免费视频| 狠狠色狠狠色综合日日91app| 国产对白videos麻豆高潮| 亚洲人午夜色婷婷| 免费精品一区| 免费大片在线观看| 一区二区高清免费观看影视大全| 三级无遮挡在线观看| 亚洲自拍偷拍色片视频| 亚洲欧美激情诱惑| 欧美日韩午夜视频| 国产视频一区在线| 韩国一区二区三区视频| 免费黄色特级片| 一区二区三区久久| 国产女人在线视频| 国产一区二区免费在线观看| 蜜桃免费网站一区二区三区| 精品无码久久久久久久| 上原亚衣av一区二区三区| 欧美日韩精品一区二区三区在线观看| www.涩涩涩| 色婷婷av一区二区| 国产丝袜在线观看视频|