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

Android性能優(yōu)化之電量篇

移動開發(fā) Android
Google近期在Udacity上發(fā)布了Android性能優(yōu)化的在線課程,分別從渲染,運算與內(nèi)存,電量幾個方面介紹了如何去優(yōu)化性能,這些課程是Google之前在Youtube上發(fā)布的Android性能優(yōu)化典范專題課程的細化與補充。

Google近期在Udacity上發(fā)布了Android性能優(yōu)化的在線課程,分別從渲染,運算與內(nèi)存,電量幾個方面介紹了如何去優(yōu)化性能,這些課程是Google之前在Youtube上發(fā)布的Android性能優(yōu)化典范專題課程的細化與補充。

下面是電量篇章的學(xué)習(xí)筆記,部分內(nèi)容與前面的性能優(yōu)化典范有重合,歡迎大家一起學(xué)習(xí)交流!
1)Understanding Battery Drain

手機各個硬件模塊的耗電量是不一樣的,有些模塊非常耗電,而有些模塊則相對顯得耗電量小很多。

 

電量消耗的計算與統(tǒng)計是一件麻煩而且矛盾的事情,記錄電量消耗本身也是一個費電量的事情。唯一可行的方案是使用第三方監(jiān)測電量的設(shè)備,這樣才能夠獲取到真實的電量消耗。

當(dāng)設(shè)備處于待機狀態(tài)時消耗的電量是極少的,以N5為例,打開飛行模式,可以待機接近1個月??墒屈c亮屏幕,硬件各個模塊就需要開始工作,這會需要消耗很多電量。

使用WakeLock或者JobScheduler喚醒設(shè)備處理定時的任務(wù)之后,一定要及時讓設(shè)備回到初始狀態(tài)。每次喚醒蜂窩信號進行數(shù)據(jù)傳遞,都會消耗很多電量,它比WiFi等操作更加的耗電。


2)Battery Historian

Battery Historian是Android 5.0開始引入的新API。通過下面的指令,可以得到設(shè)備上的電量消耗信息:

 

 

  1. $ adb shell dumpsys batterystats > xxx.txt //得到整個設(shè)備的電量消耗信息 
  2. $ adb shell dumpsys batterystats > com.package.name > xxx.txt //得到指定app相關(guān)的電量消耗信息 

得到了原始的電量消耗數(shù)據(jù)之后,我們需要通過Google編寫的一個python腳本把數(shù)據(jù)信息轉(zhuǎn)換成可讀性更好的html文件:

  1. $ python historian.py xxx.txt > xxx.html 

打開這個轉(zhuǎn)換過后的html文件,可以看到類似TraceView生成的列表數(shù)據(jù),這里的數(shù)據(jù)信息量很大,這里就不展開了。


3)Track Battery Status & Battery Manager

我們可以通過下面的代碼來獲取手機的當(dāng)前充電狀態(tài):

  1. // It is very easy to subscribe to changes to the battery state, but you can get the current 
  2. // state by simply passing null in as your receiver. Nifty, isn't that? 
  3. IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
  4. Intent batteryStatus = this.registerReceiver(null, filter); 
  5. int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
  6. boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC); 
  7. if (acCharge) { 
  8. Log.v(LOG_TAG,“The phone is charging!”); 

在上面的例子演示了如何立即獲取到手機的充電狀態(tài),得到充電狀態(tài)信息之后,我們可以有針對性的對部分代碼做優(yōu)化。比如我們可以判斷只有當(dāng)前手機為AC充電狀態(tài)時 才去執(zhí)行一些非常耗電的操作。

  1. /** 
  2. * This method checks for power by comparing the current battery state against all possible 
  3. * plugged in states. In this case, a device may be considered plugged in either by USB, AC, or 
  4. * wireless charge. (Wireless charge was introduced in API Level 17.) 
  5. */ 
  6. private boolean checkForPower() { 
  7. // It is very easy to subscribe to changes to the battery state, but you can get the current 
  8. // state by simply passing null in as your receiver. Nifty, isn't that? 
  9. IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
  10. Intent batteryStatus = this.registerReceiver(null, filter); 
  11.  
  12. // There are currently three ways a device can be plugged in. We should check them all. 
  13. int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
  14. boolean usbCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_USB); 
  15. boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC); 
  16. boolean wirelessCharge = false
  17. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
  18. wirelessCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_WIRELESS); 
  19. return (usbCharge || acCharge || wirelessCharge); 

4)Wakelock and Battery Drain

高效的保留更多的電量與不斷促使用戶使用你的App會消耗電量,這是矛盾的選擇題。不過我們可以使用一些更好的辦法來平衡兩者。

假設(shè)你的手機里面裝了大量的社交類應(yīng)用,即使手機處于待機狀態(tài),也會經(jīng)常被這些應(yīng)用喚醒用來檢查同步新的數(shù)據(jù)信息。Android會不斷關(guān)閉各種硬件來延長手機的待機時間,首先屏幕會逐漸變暗直至關(guān)閉,然后CPU進入睡眠,這一切操作都是為了節(jié)約寶貴的電量資源。但是即使在這種睡眠狀態(tài)下,大多數(shù)應(yīng)用還是會嘗試進行工作,他們將不斷的喚醒手機。一個最簡單的喚醒手機的方法是使用PowerManager.WakeLock的API來保持CPU工作并防止屏幕變暗關(guān)閉。這使得手機可以被喚醒,執(zhí)行工作,然后回到睡眠狀態(tài)。知道如何獲取WakeLock是簡單的,可是及時釋放WakeLock也是非常重要的,不恰當(dāng)?shù)氖褂肳akeLock會導(dǎo)致嚴(yán)重錯誤。例如網(wǎng)絡(luò)請求的數(shù)據(jù)返回時間不確定,導(dǎo)致本來只需要10s的事情一直等待了1個小時,這樣會使得電量白白浪費了。這也是為何使用帶超時參數(shù)的wakelock.acquice()方法是很關(guān)鍵的。

但是僅僅設(shè)置超時并不足夠解決問題,例如設(shè)置多長的超時比較合適?什么時候進行重試等等?解決上面的問題,正確的方式可能是使用非精準(zhǔn)定時器。通常情況下,我們會設(shè)定一個時間進行某個操作,但是動態(tài)修改這個時間也許會更好。例如,如果有另外一個程序需要比你設(shè)定的時間晚5分鐘喚醒,***能夠等到那個時候,兩個任務(wù)捆綁一起同時進行,這就是非精確定時器的核心工作原理。我們可以定制計劃的任務(wù),可是系統(tǒng)如果檢測到一個更好的時間,它可以推遲你的任務(wù),以節(jié)省電量消耗。

 

 

這正是JobScheduler API所做的事情。它會根據(jù)當(dāng)前的情況與任務(wù),組合出理想的喚醒時間,例如等到正在充電或者連接到WiFi的時候,或者集中任務(wù)一起執(zhí)行。我們可以通過這個API實現(xiàn)很多免費的調(diào)度算法。
5)Network and Battery Drain

下面內(nèi)容來自官方Training文檔中高效下載章節(jié)關(guān)于手機(Radio)蜂窩信號對電量消耗的介紹。

通常情況下,使用3G移動網(wǎng)絡(luò)傳輸數(shù)據(jù),電量的消耗有三種狀態(tài):

Full power: 能量***的狀態(tài),移動網(wǎng)絡(luò)連接被激活,允許設(shè)備以***的傳輸速率進行操作。
Low power: 一種中間狀態(tài),對電量的消耗差不多是Full power狀態(tài)下的50%。
Standby: ***的狀態(tài),沒有數(shù)據(jù)連接需要傳輸,電量消耗最少。

下圖是一個典型的3G Radio State Machine的圖示

 

總之,為了減少電量的消耗,在蜂窩移動網(wǎng)絡(luò)下,***做到批量執(zhí)行網(wǎng)絡(luò)請求,盡量避免頻繁的間隔網(wǎng)絡(luò)請求。

通過前面學(xué)習(xí)到的Battery Historian我們可以得到設(shè)備的電量消耗數(shù)據(jù),如果數(shù)據(jù)中的移動蜂窩網(wǎng)絡(luò)(Mobile Radio)電量消耗呈現(xiàn)下面的情況,間隔很小,又頻繁斷斷續(xù)續(xù)的出現(xiàn),說明電量消耗性能很不好:

經(jīng)過優(yōu)化之后,如果呈現(xiàn)下面的圖示,說明電量消耗的性能是良好的:

 

另外WiFi連接下,網(wǎng)絡(luò)傳輸?shù)碾娏肯囊纫苿泳W(wǎng)絡(luò)少很多,應(yīng)該盡量減少移動網(wǎng)絡(luò)下的數(shù)據(jù)傳輸,多在WiFi環(huán)境下傳輸數(shù)據(jù)。

 

那么如何才能夠把任務(wù)緩存起來,做到批量化執(zhí)行呢?下面就輪到Job Scheduler出場了。
6)Using Job Scheduler

使用Job Scheduler,應(yīng)用需要做的事情就是判斷哪些任務(wù)是不緊急的,可以交給Job Scheduler來處理,Job Scheduler集中處理收到的任務(wù),選擇合適的時間,合適的網(wǎng)絡(luò),再一起進行執(zhí)行。

下面是使用Job Scheduler的一段簡要示例,需要先有一個JobService:

 

  1. public class MyJobService extends JobService { 
  2. private static final String LOG_TAG = "MyJobService"
  3.  
  4. @Override 
  5. public void onCreate() { 
  6. super.onCreate(); 
  7. Log.i(LOG_TAG, "MyJobService created"); 
  8.  
  9. @Override 
  10. public void onDestroy() { 
  11. super.onDestroy(); 
  12. Log.i(LOG_TAG, "MyJobService destroyed"); 
  13.  
  14. @Override 
  15. public boolean onStartJob(JobParameters params) { 
  16. // This is where you would implement all of the logic for your job. Note that this runs 
  17. // on the main thread, so you will want to use a separate thread for asynchronous work 
  18. // (as we demonstrate below to establish a network connection). 
  19. // If you use a separate thread, return true to indicate that you need a "reschedule" to 
  20. // return to the job at some point in the future to finish processing the work. Otherwise, 
  21. // return false when finished. 
  22. Log.i(LOG_TAG, "Totally and completely working on job " + params.getJobId()); 
  23. // First, check the network, and then attempt to connect. 
  24. if (isNetworkConnected()) { 
  25. new SimpleDownloadTask() .execute(params); 
  26. return true
  27. else { 
  28. Log.i(LOG_TAG, "No connection on job " + params.getJobId() + "; sad face"); 
  29. return false
  30.  
  31. @Override 
  32. public boolean onStopJob(JobParameters params) { 
  33. // Called if the job must be stopped before jobFinished() has been called. This may 
  34. // happen if the requirements are no longer being met, such as the user no longer 
  35. // connecting to WiFi, or the device no longer being idle. Use this callback to resolve 
  36. // anything that may cause your application to misbehave from the job being halted. 
  37. // Return true if the job should be rescheduled based on the retry criteria specified 
  38. // when the job was created or return false to drop the job. Regardless of the value 
  39. // returned, your job must stop executing. 
  40. Log.i(LOG_TAG, "Whelp, something changed, so I'm calling it on job " + params.getJobId()); 
  41. return false
  42.  
  43. /** 
  44. * Determines if the device is currently online. 
  45. */ 
  46. private boolean isNetworkConnected() { 
  47. ConnectivityManager connectivityManager = 
  48. (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
  49. NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
  50. return (networkInfo != null && networkInfo.isConnected()); 
  51.  
  52. /** 
  53. * Uses AsyncTask to create a task away from the main UI thread. This task creates a 
  54. * HTTPUrlConnection, and then downloads the contents of the webpage as an InputStream. 
  55. * The InputStream is then converted to a String, which is logged by the 
  56. * onPostExecute() method. 
  57. */ 
  58. private class SimpleDownloadTask extends AsyncTask<JobParameters, Void, String> { 
  59.  
  60. protected JobParameters mJobParam; 
  61.  
  62. @Override 
  63. protected String doInBackground(JobParameters... params) { 
  64. // cache system provided job requirements 
  65. mJobParam = params[0]; 
  66. try { 
  67. InputStream is = null
  68. // Only display the first 50 characters of the retrieved web page content. 
  69. int len = 50
  70.  
  71. URL url = new URL("https://www.google.com"); 
  72. HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
  73. conn.setReadTimeout(10000); //10sec 
  74. conn.setConnectTimeout(15000); //15sec 
  75. conn.setRequestMethod("GET"); 
  76. //Starts the query 
  77. conn.connect(); 
  78. int response = conn.getResponseCode(); 
  79. Log.d(LOG_TAG, "The response is: " + response); 
  80. is = conn.getInputStream(); 
  81.  
  82. // Convert the input stream to a string 
  83. Reader reader = null
  84. reader = new InputStreamReader(is, "UTF-8"); 
  85. char[] buffer = new char[len]; 
  86. reader.read(buffer); 
  87. return new String(buffer); 
  88.  
  89. catch (IOException e) { 
  90. return "Unable to retrieve web page."
  91.  
  92. @Override 
  93. protected void onPostExecute(String result) { 
  94. jobFinished(mJobParam, false); 
  95. Log.i(LOG_TAG, result); 

 

然后模擬通過點擊Button觸發(fā)N個任務(wù),交給JobService來處

 

  1. public class FreeTheWakelockActivity extends ActionBarActivity { 
  2. public static final String LOG_TAG = "FreeTheWakelockActivity"
  3.  
  4. TextView mWakeLockMsg; 
  5. ComponentName mServiceComponent; 
  6.  
  7. @Override 
  8. protected void onCreate(Bundle savedInstanceState) { 
  9. super.onCreate(savedInstanceState); 
  10. setContentView(R.layout.activity_wakelock); 
  11.  
  12. mWakeLockMsg = (TextView) findViewById(R.id.wakelock_txt); 
  13. mServiceComponent = new ComponentName(this, MyJobService.class); 
  14. Intent startServiceIntent = new Intent(this, MyJobService.class); 
  15. startService(startServiceIntent); 
  16.  
  17. Button theButtonThatWakelocks = (Button) findViewById(R.id.wakelock_poll); 
  18. theButtonThatWakelocks.setText(R.string.poll_server_button); 
  19.  
  20. theButtonThatWakelocks.setOnClickListener(new View.OnClickListener() { 
  21. @Override 
  22. public void onClick(View v) { 
  23. pollServer(); 
  24. }); 
  25.  
  26. /** 
  27. * This method polls the server via the JobScheduler API. By scheduling the job with this API, 
  28. * your app can be confident it will execute, but without the need for a wake lock. Rather, the 
  29. * API will take your network jobs and execute them in batch to best take advantage of the 
  30. * initial network connection cost. 
  31. * 
  32. * The JobScheduler API works through a background service. In this sample, we have 
  33. * a simple service in MyJobService to get you started. The job is scheduled here in 
  34. * the activity, but the job itself is executed in MyJobService in the startJob() method. For 
  35. * example, to poll your server, you would create the network connection, send your GET 
  36. * request, and then process the response all in MyJobService. This allows the JobScheduler API 
  37. * to invoke your logic without needed to restart your activity. 
  38. * 
  39. * For brevity in the sample, we are scheduling the same job several times in quick succession, 
  40. * but again, try to consider similar tasks occurring over time in your application that can 
  41. * afford to wait and may benefit from batching. 
  42. */ 
  43. public void pollServer() { 
  44. JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); 
  45. for (int i=0; i<10; i++) { 
  46. JobInfo jobInfo = new JobInfo.Builder(i, mServiceComponent) 
  47. .setMinimumLatency(5000// 5 seconds 
  48. .setOverrideDeadline(60000// 60 seconds (for brevity in the sample) 
  49. .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) // WiFi or data connections 
  50. .build(); 
  51.  
  52. mWakeLockMsg.append("Scheduling job " + i + "!\n"); 
  53. scheduler.schedule(jobInfo); 

 

責(zé)任編輯:chenqingxiang 來源: 胡凱的博客
相關(guān)推薦

2015-09-16 14:37:50

Android性能優(yōu)化運算

2015-09-16 13:54:30

Android性能優(yōu)化渲染

2021-07-29 14:20:34

網(wǎng)絡(luò)優(yōu)化移動互聯(lián)網(wǎng)數(shù)據(jù)存儲

2015-09-16 15:21:23

Android性能優(yōu)化內(nèi)存

2013-02-20 14:32:37

Android開發(fā)性能

2019-12-13 10:25:08

Android性能優(yōu)化啟動優(yōu)化

2009-08-13 15:49:18

ASP.NET性能優(yōu)化

2020-06-11 13:03:04

性能優(yōu)化緩存

2009-08-13 16:22:18

ASP.NET性能優(yōu)化

2013-09-17 10:32:08

Android性能優(yōu)化數(shù)據(jù)庫

2017-01-15 15:13:37

Android性能優(yōu)化優(yōu)化點

2019-09-25 08:03:21

Android加速Google

2017-12-23 14:38:41

Android編程開發(fā)優(yōu)化

2021-07-05 14:55:28

前端優(yōu)化圖片

2019-03-15 15:00:49

Webpack構(gòu)建速度前端

2024-02-20 19:53:57

網(wǎng)絡(luò)通信協(xié)議

2012-06-20 13:54:44

架構(gòu)性能優(yōu)化

2022-02-16 14:10:51

服務(wù)器性能優(yōu)化Linux

2021-11-29 11:13:45

服務(wù)器網(wǎng)絡(luò)性能

2021-08-02 10:50:57

性能微服務(wù)數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號

国产欧美一区二| 亚洲欧洲精品一区| www亚洲视频| 欧美日韩在线播放视频| 欧美电影一区二区| 天堂…中文在线最新版在线| 国产人成在线视频| 韩国女主播成人在线| 午夜免费久久久久| 成年人视频软件| 女人抽搐喷水高潮国产精品| 欧美四级电影在线观看| 久久人人爽人人爽人人av| 国产三级在线| 成人动漫av在线| 国产乱人伦真实精品视频| 久久这里只有精品国产| 日韩视频在线观看| 亚洲黄一区二区| 91网址在线观看精品| 中文字幕一区久| 亚洲精品日产精品乱码不卡| 日韩在线导航| 人妻中文字幕一区| 久久精品国产一区二区三| 91国产视频在线播放| 欧美一区免费观看| 精品精品99| 亚洲精品在线观看www| 亚洲一区二区中文字幕在线观看| 日韩精品一区二区三区| 亚洲国产成人91porn| 亚洲一区二区三区涩| 嫩草在线播放| 久久青草欧美一区二区三区| 超碰97网站| 97人妻精品一区二区三区视频 | 青青青在线视频播放| 午夜毛片在线| 国产精品入口麻豆九色| 蜜桃麻豆www久久国产精品| 亚洲国产精品18久久久久久| 国产一区在线观看视频| 国产欧美日韩中文| 中文在线免费观看| 久久国产主播| 国产成人精品综合| 日韩精品一区二区亚洲av| 亚洲激情午夜| 久久久久久一区二区三区| 日韩一级片大全| 小小影院久久| 久久久精品美女| 手机看片国产日韩| 大片网站久久| 日韩中文理论片| 午夜成人亚洲理伦片在线观看| 日韩一区二区中文| 色偷偷偷亚洲综合网另类| 舐め犯し波多野结衣在线观看| 一本色道久久综合亚洲精品酒店| 日韩精品在线视频| 四虎永久免费在线观看| 国产精品欧美在线观看| 国产亚洲精品久久久久久牛牛| 免费在线观看你懂的| 国产亚洲第一伦理第一区| 亚洲欧洲美洲在线综合| 四虎国产精品成人免费入口| 成人一区而且| 久久伊人免费视频| 久久老司机精品视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 内射中出日韩无国产剧情| 美女毛片一区二区三区四区最新中文字幕亚洲| 国产丝袜精品视频| 亚洲午夜久久久久久久国产| 精品色999| 日韩有码视频在线| 免费视频一二三区| 亚洲一区二区三区免费在线观看| 国产成+人+综合+亚洲欧洲| 青青艹在线观看| 经典三级在线一区| 国产精品一区视频| 免费福利在线观看| 亚洲欧美在线观看| 国产 日韩 欧美在线| 91精品论坛| 91精品国产综合久久久蜜臀粉嫩 | 亚洲精品一区二区二区| 激情五月婷婷综合网| 国产乱码一区| a天堂中文在线88| 一区二区理论电影在线观看| 鲁一鲁一鲁一鲁一澡| jizz欧美| 亚洲а∨天堂久久精品喷水| 一区二区三区伦理片| 久久久久av| 国产成人精品最新| 午夜精品久久久久久久99老熟妇| 92国产精品观看| 国产又爽又黄ai换脸| 一二三四视频在线中文| 欧美卡1卡2卡| 国产精品无码久久久久一区二区| 久久久久久久久99精品大| 97超碰色婷婷| 国产视频手机在线观看| 2021中文字幕一区亚洲| 国产香蕉一区二区三区| **在线精品| 亚洲国产精品va在线看黑人| 日本午夜精品视频| 亚洲欧美日韩精品一区二区| 91在线高清视频| 国产高清视频在线观看| 亚洲一本大道在线| 亚洲色图欧美自拍| 欧美色图一区| 日本高清+成人网在线观看| av在线免费在线观看| 中文在线一区二区| 69堂免费视频| 久久99偷拍| 久久这里有精品视频| 波多野结衣黄色| 91女神在线视频| 人人妻人人澡人人爽欧美一区双 | 久久精品日韩无码| 久久久夜精品| 久久av二区| www中文字幕在线观看| 91麻豆精品国产自产在线观看一区| 亚洲码无人客一区二区三区| 99伊人成综合| 黑人中文字幕一区二区三区| 久久99亚洲网美利坚合众国| 91精品国产综合久久久久久漫画| 日本一卡二卡在线播放| 日韩不卡一二三区| 欧美日本国产精品| 唐人社导航福利精品| 日韩高清有码在线| 四虎精品永久在线| 91在线小视频| 少妇人妻在线视频| 加勒比视频一区| 992tv在线成人免费观看| 韩国av电影在线观看| 一区二区三区四区不卡视频| 亚洲女人在线观看| 伊人情人综合网| 1卡2卡3卡精品视频| 午夜在线视频| 91精品国产综合久久香蕉的特点| 裸体武打性艳史| 国产成人免费视频| 天天想你在线观看完整版电影免费| 国产精久久久| 欧美福利视频网站| 黄色片一区二区| 天天影视网天天综合色在线播放| 精品人妻伦一二三区久| 一本久道综合久久精品| 欧美重口乱码一区二区| 亚洲四虎影院| 久久亚洲成人精品| 亚洲精品久久久久久久久久久久久久| 亚洲综合免费观看高清在线观看| 美女伦理水蜜桃4| 久久精品麻豆| 亚洲图片小说在线| 国产视频一区二| 海角国产乱辈乱精品视频| 欧美一区二不卡视频| 欧美视频中文在线看| 日本一区二区视频在线播放| 久久66热re国产| 亚洲 自拍 另类小说综合图区| 欧美天堂影院| 国产在线日韩在线| 欧美videos另类精品| 精品无人区太爽高潮在线播放 | 九色porny丨入口在线| 亚洲社区在线观看| 国产伦精品一区二区三区视频痴汉| 亚洲黄色小视频| 国产精品三级在线观看无码| 蜜臀久久99精品久久久画质超高清| 99热一区二区三区| 日韩精品免费一区二区三区竹菊| 国产精品久久久久久久久久久久久 | 久久夜色精品国产噜噜av小说| 欧美一级免费视频| 蜜桃av在线免费观看| 精品国产区一区| 中文字幕激情视频| 亚洲成精国产精品女| 中文字幕黄色网址| 岛国av在线一区| 国产喷水theporn| 亚洲巨乳在线| 免费观看中文字幕| 欧美男同视频网| 国产不卡一区二区三区在线观看| www.精品国产| 国内精品久久久久久影视8| 成全电影播放在线观看国语| 精品国产不卡一区二区三区| 精品一区二三区| 亚洲成人av福利| 动漫性做爰视频| 久久精品人人爽人人爽| 人妻 日韩 欧美 综合 制服| 蜜桃视频一区二区三区在线观看| 久久久久久久久久久视频| 在线精品视频在线观看高清| 日本视频精品一区| 国偷自产av一区二区三区| 91色中文字幕| 久久精品资源| 国产精品久久激情| 97成人资源| 性欧美激情精品| 欧美理论电影| 久久视频国产精品免费视频在线| 每日更新在线观看av| 亚洲成人激情在线| 国产高清第一页| 91精品国产色综合久久不卡电影 | 亚洲精品一区二区三区影院| 91女人18毛片水多国产| 91久久精品网| 中文字幕在线看人| 一本大道久久精品懂色aⅴ| 日韩人妻无码一区二区三区99 | 不卡av免费在线观看| 中文字幕一二三区| 国产麻豆精品95视频| 中文字幕66页| 精品一区二区三区免费视频| xx欧美撒尿嘘撒尿xx| 欧美a一区二区| 欧美成人黄色网址| 日韩黄色免费网站| 日本爱爱免费视频| 秋霞国产午夜精品免费视频| 熟妇人妻无乱码中文字幕真矢织江| 先锋亚洲精品| 九九热免费精品视频| 免费观看一级特黄欧美大片| mm131亚洲精品| 狠狠色丁香久久婷婷综合_中 | 日韩视频一区在线| 免费网站看v片在线a| 久久精品久久久久久| 哥也色在线视频| 欧美另类69精品久久久久9999| 日韩经典av| 亚州av一区二区| 粉嫩一区二区三区| 国产欧美日韩中文字幕在线| 成人豆花视频| 国产精品xxx在线观看www| 露出调教综合另类| 日本精品一区二区| 先锋资源久久| 很污的网站在线观看| 亚洲欧美日本视频在线观看| 成人黄色一区二区| 国产揄拍国内精品对白| 在线观看一区二区三区视频| a美女胸又www黄视频久久| 好吊日免费视频| 最新国产精品久久精品| 国产一卡二卡在线播放| 黑人巨大精品欧美一区二区三区| 成人午夜精品视频| 日韩精品一区二区在线| 四虎影院在线域名免费观看| 在线a欧美视频| 啪啪免费视频一区| 欧美在线视频观看| 日本黄色成人| 国产精品区一区| 成人国产精品一级毛片视频| 最近免费观看高清韩国日本大全| 国产精品视频久久一区| jizz大全欧美jizzcom| 高清不卡在线观看av| 国产激情在线免费观看| 亚洲三级电影网站| 久久青青草原亚洲av无码麻豆| 8x福利精品第一导航| 婷婷开心激情网| 久久精品成人欧美大片古装| www.九色在线| 91影视免费在线观看| 女厕嘘嘘一区二区在线播放| 青青草视频国产| 日韩中文字幕91| 五十路六十路七十路熟婆| 亚洲欧洲精品一区二区三区 | 日韩午夜激情视频| 免费黄色片在线观看| 欧美激情小视频| 亚洲tv在线| 日韩高清国产一区在线观看| 在线视频观看日韩| 亚洲国产欧美91| 欧美高清一级片在线观看| 99视频在线看| 91精品国产91综合久久蜜臀| 国产视频三级在线观看播放| 国内精品模特av私拍在线观看| 亚洲天堂网站| 色噜噜狠狠色综合网| 亚洲免费一区二区| 少妇一级淫片免费放播放| 亚洲人成精品久久久久| 亚洲视屏在线观看| 国产亚洲福利一区| 中文在线资源| 精品一区二区久久久久久久网站| 中文在线日韩| 在线一区二区不卡| 国产精品视频看| 中文字幕乱码一区二区| 亚洲社区在线观看| 肉色欧美久久久久久久免费看| 国产综合精品一区二区三区| 欧美日韩三级| 青青草精品在线| 亚洲精品网站在线观看| 国产深喉视频一区二区| 久久综合88中文色鬼| 玖玖精品在线| 亚洲一区二区三区四区的| 欧美日韩一级在线观看| 欧美丰满美乳xxx高潮www| 亚洲图片88| 国产综合久久久久久| 不卡在线一区| 亚洲色图 在线视频| 欧美激情综合在线| 中文字幕网址在线| www亚洲精品| 青青青国产精品| 国产高清免费在线| 国产一区二区中文字幕| 一区二区三区影视| 91精品国产综合久久婷婷香蕉| 国产网站在线免费观看| 2019国产精品视频| 亚洲国产精品第一区二区| 国产xxxx视频| 日韩欧美高清在线视频| 黄色软件在线观看| 国产男人精品视频| 欧美a级片网站| 亚洲 欧美 日韩在线| 黑人极品videos精品欧美裸| 麻豆导航在线观看| 国产精品一区=区| 欧美一区综合| 精品人妻一区二区免费视频| 精品久久久久久亚洲国产300| 欧美视频免费一区二区三区| 欧洲中文字幕国产精品| 成人av二区| 亚洲精品无码久久久久久久| 亚洲一区二区三区在线看| 亚州av在线播放| 奇门遁甲1982国语版免费观看高清| 精品免费一区二区| 久久aaaa片一区二区| 精品国产户外野外| 天堂中文8资源在线8| 亚洲精品免费一区二区三区| 亚洲国产精品一区| 亚欧精品视频一区二区三区| 欧美一区二区三区视频| 国产自产自拍视频在线观看| 亚洲一区精彩视频| 成人妖精视频yjsp地址| 日韩精品一区不卡| 久久综合久久八八| 天海翼亚洲一区二区三区| 亚洲图色中文字幕| 婷婷一区二区三区| 欧美极品另类| 久久综合九色99| 国产一区二区在线看| 九一国产在线观看| 欧美成人精品激情在线观看| 免费看成人吃奶视频在线| 中文字幕乱码在线人视频| 色先锋资源久久综合|