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

請你吃一頓全面的Android混淆大餐

移動開發 Android
在 Android 日常開發過程中,混淆是我們開發 App 的一項必不可少的技能。只要是我們親身經歷過 App 打包上線的過程,或多或少都需要了解一些代碼混淆的基本操作。那么,混淆到底是什么?它的好處有哪些?

在 Android 日常開發過程中,混淆是我們開發 App 的一項必不可少的技能。只要是我們親身經歷過 App 打包上線的過程,或多或少都需要了解一些代碼混淆的基本操作。那么,混淆到底是什么?它的好處有哪些?具體效果如何?別急,下面我們來一一探索它的"獨特"魅力。

混淆簡介

代碼混淆(Obfuscated code)是將程序中的代碼以某種規則轉換為難以閱讀和理解的代碼的一種行為。

混淆的好處

混淆的好處就是它的目的:令 APK 難以被逆向工程,即很大程度上增加反編譯的成本。此外,Android 當中的"混淆"還能夠在打包時移除無用資源,顯著減少 APK 體積。最后,還能以變通方式避免 Android 中常見的 64k 方法數引用的限制。

我們先來看一下混淆前后的 APK 結構對比:

請你吃一頓史上最全的Android混淆大餐

請你吃一頓史上最全的Android混淆大餐

從上面兩張圖可以看出:經過混淆處理之后,我們的 APK 中包名、類名、成員名等都被替換為隨機、無意義的名稱,增加了代碼閱讀和理解的困難程度,提高了反編譯的成本。細心的小伙伴可能又會注意到:混淆前后 APK 的體積竟然從 2.7M 減小到了 1.4M,體積縮減了近一倍!真的有這么神奇嗎?哈哈,確實是這么神奇,讓我們慢慢來揭開它的神秘面紗吧。

Android 當中的混淆

在 Android 中,我們平常所說的"混淆"其實有兩層意思,一個是 Java 代碼的混淆,另外一個是資源的壓縮。其實這兩者之間并沒有什么關聯,只不過習慣性地放在一起來使用。那么,說了這么多,Android 平臺上到底該如何開啟混淆呢?

啟用混淆

  1. ...... 
  2. android { 
  3.  buildTypes { 
  4.  release { 
  5.  minifyEnabled true 
  6.  shrinkResources true 
  7.  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
  8.  } 
  9.  } 

以上就是開啟混淆的基本操作了,通過 minifyEnabled 設置為 true 來開啟混淆。同時,可以設置 shrinkResources 為 true 來開啟資源的壓縮。不難看出,我們一般在打 release 包時才啟用混淆,因為混淆會增加額外的編譯時間,所以不建議在 debug 模式下啟用。此外,需要注意的是:只有在啟用混淆的前提下開啟資源壓縮才會有效!以上代碼中的 proguard-android.txt 表示 Android 系統為我們提供的默認混淆規則文件,而 proguard-rules.pro則是我們想要自定義的混淆規則,至于如何自定義混淆規則我們將在接下來會講到。

代碼混淆

其實,Java 平臺為我們提供了 Proguard 混淆工具來幫助我們快速地對代碼進行混淆。根據 Java 官方介紹,Proguard 對應的具體中文定義如下:

  • 它是一個包含代碼文件壓縮、優化、混淆和校驗等功能的工具
  • 它能夠檢測并刪除無用的類、變量、方法和屬性
  • 它能夠優化字節碼并刪除未使用的指令
  • 它能夠將類、變量和方法的名字重命名為無意義的名稱從而達到混淆效果
  • 最后,它還會校驗處理后的代碼,主要針對 Java 6 及以上版本和 Java ME

資源壓縮

Android 中,編譯器為我們提供了另外一項強大的功能:資源的壓縮。資源壓縮能夠幫助我們移除項目及依賴倉庫中未使用到的資源,有效地降低了apk包的大小。由于資源壓縮與代碼混淆是協同工作,所以,如果需要開啟資源的壓縮,切記要先開啟代碼混淆,否則會出現以下問題:

  1. ERROR: Removing unused resources requires unused code shrinking to be turned on. See http://d.android.com/r/tools/shrink-resources.html for more information. 
  2. Affected Modules: app 

自定義要保留的資源

當我們開啟了資源壓縮之后,系統會默認替我們移除所有未使用的資源,假如我們需要保留某些特定的資源,可以在我們項目中創建一個被 標記的 XML 文件(如 res/raw/keep.xml),并在 tools:keep 屬性中指定每個要保留的資源,在 tools:discard 屬性中指定每個要舍棄的資源。這兩個屬性都接受逗號分隔的資源名稱列表。同樣,我們可以使用字符 * 作為通配符。如:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources xmlns:tools="http://schemas.android.com/tools" 
  3.  tools:keep="@layout/activity_video*,@layout/dialog_update_v2" 
  4.  tools:discard="@layout/unused_layout,@drawable/unused_selector" /> 

啟用嚴格檢查模式

正常情況下,資源壓縮器可準確判定系統是否使用了資源。不過,如果您的代碼(包含庫)調用 Resources.getIdentifier(),這就表示您的代碼將根據動態生成的字符串查詢資源名稱。這時,資源壓縮器會采取防御性行為,將所有具有匹配名稱格式的資源標記為可能已使用,無法移除。例如,以下代碼會使所有帶 img_ 前綴的資源標記為已使用:

  1. String name = String.format("img_%1d", angle + 1); 
  2. res = getResources().getIdentifier(name"drawable", getPackageName()); 

這時,我可以開啟資源的嚴格審查模式,只會保留確定已使用的資源。

移除備用資源

Gradle 資源壓縮器只會移除未被應用引用的資源,這意味著它不會移除用于不同設備配置的備用資源。必要時,我們可以使用 Android Gradle 插件的 resConfigs 屬性來移除您的應用不需要的備用資源文件(常見的有用于國際化支持的 strings.xml,適配用的 layout.xml 等):

  1. android { 
  2.  defaultConfig { 
  3.  ... 
  4.  //保留中文和英文國際化支持 
  5.  resConfigs "en""zh" 
  6.  } 

自定義混淆規則

品嘗完了以上"配菜",下面讓我們來品味一下本文的"主菜":自定義混淆規則。首先,我們來了解一下常見的混淆命令。

keep 命令

這里說的 keep 命令指的是一系列以 -keep 開頭的命令,它主要用來保留 Java 中不需要進行混淆的元素。以下是常見的 -keep 命令:

-keep

作用:保留指定的類和成員,防止被混淆處理。例如:

  1. # 保留包:com.moos.media.entity 下面的類以及類成員 
  2. -keep public class com.moos.media.entity.** 
  3. # 保留類:NumberProgressBar 
  4. -keep public class com.moos.media.widget.NumberProgressBar {*;} 

-keepclassmembers

作用:保留指定的類的成員(變量/方法),它們將不會被混淆。如:

  1. # 保留類的成員:MediaUtils類中的特定成員方法 
  2. -keepclassmembers class com.moos.media.MediaUtils { 
  3.  public static *** getLocalVideos(android.content.Context); 
  4.  public static *** getLocalPictures(android.content.Context); 

-keepclasseswithmembers

作用:保留指定的類和其成員(變量/方法),前提是它們在壓縮階段沒有被刪除。與-keep 使用方式類似:

  1. # 保留類:BaseMediaEntity 的子類 
  2. -keepclasseswithmembers public class * extends com.moos.media.entity.BaseMediaEntity{*;} 
  3. # 保留類:OnProgressBarListener接口的實現類 
  4. -keep public class * implements com.moos.media.widget.OnProgressBarListener {*;} 

@Keep

除了以上方式,你也可以選擇使用 @Keep 注解來保留期望代碼,防止它們被混淆處理。比如,我們通過 @Keep 修飾一個類來保留它不被混淆:

  1. @Keep 
  2. data class CloudMusicBean(var createDate: String, 
  3.  var id: Long, 
  4.  var name: String, 
  5.  var url: String, 
  6.  val imgUrl: String) 

同樣地,我們也可以讓 @Keep 來修飾方法或者字段進而保留它們。

其他命令

dontwarn

-dontwarn 命令一般在我們引入新的 library 時會使用到,常用于處理 library 中無法解決的警告。如:

  1. -keep class twitter4j.** { *; } 
  2. -dontwarn twitter4j.** 

其他的命令用法可參考 Android 系統提供的默認混淆規則:

  1. #混淆時不生成大小寫混合的類名 
  2. -dontusemixedcaseclassnames 
  3. #不跳過非公共的庫的類 
  4. -dontskipnonpubliclibraryclasses 
  5. #混淆過程中記錄日志 
  6. -verbose 
  7. #關閉預校驗 
  8. -dontpreverify 
  9. #關閉優化 
  10. -dontoptimize 
  11. #保留注解 
  12. -keepattributes *Annotation* 
  13. #保留所有擁有本地方法的類名及本地方法名 
  14. -keepclasseswithmembernames class * { 
  15.  native <methods>; 
  16. #保留自定義View的get和set方法 
  17. -keepclassmembers public class * extends android.view.View { 
  18.  void set*(***); 
  19.  *** get*(); 
  20. #保留Activity中View及其子類入參的方法,如: onClick(android.view.View
  21. -keepclassmembers class * extends android.app.Activity { 
  22.  public void *(android.view.View); 
  23. #保留枚舉 
  24. -keepclassmembers enum * { 
  25.  **[] $VALUES
  26.  public *; 
  27. #保留序列化的類 
  28. -keepclassmembers class * implements android.os.Parcelable { 
  29.  public static final android.os.Parcelable$Creator CREATOR; 
  30. #保留R文件的靜態成員 
  31. -keepclassmembers class **.R$* { 
  32.  public static <fields>; 
  33. -dontwarn android.support.** 
  34. -keep class android.support.annotation.Keep 
  35. -keep @android.support.annotation.Keep class * {*;} 
  36. -keepclasseswithmembers class * { 
  37.  @android.support.annotation.Keep <methods>; 
  38. -keepclasseswithmembers class * { 
  39.  @android.support.annotation.Keep <fields>; 
  40. -keepclasseswithmembers class * { 
  41.  @android.support.annotation.Keep <init>(...); 

混淆"黑名單"

我們在了解了混淆的基本命令之后,很多人應該還是一頭霧水:到底哪些內容該混淆?其實,我們在使用代碼混淆時,ProGuard 對我們項目中大部分代碼進行了混淆操作,為了防止編譯時出錯,我們應該通過 keep 命令保留一些元素不被混淆。所以,我們只需要知道哪些元素不應該被混淆:

枚舉

項目中難免可能會用到枚舉類型,然而它不能參與到混淆當中去。原因是:枚舉類內部存在 values 方法,混淆后該方法會被重新命名,并拋出 NoSuchMethodException。慶幸的是,Android 系統默認的混淆規則中已經添加了對于枚舉類的處理,我們無需再去做額外工作。想了解更多枚舉內部細節可以去查看源碼,篇幅有限不再細說。

被反射的元素

被反射使用的類、變量、方法、包名等不應該被混淆處理。原因在于:代碼混淆過程中,被反射使用的元素會被重命名,然而反射依舊是按照先前的名稱去尋找元素,所以會經常發生 NoSuchMethodException 和 NoSuchFiledException 問題。

實體類

實體類即我們常說的"數據類",當然經常伴隨著序列化與反序列化操作。很多人也應該都想到了,混淆是將原本有特定含義的"元素"轉變為無意義的名稱,所以,經過混淆的"洗禮"之后,序列化之后的 value 對應的 key 已然變為沒有意義的字段,這肯定是我們不希望的。同時,反序列化的過程創建對象從根本上來說還是借助于反射,混淆之后 key 會被改變,所以也會違背我們預期的效果。

四大組件

Android 中的四大組件同樣不應該被混淆。原因在于:

  1. 四大組件使用前都需要在 AndroidManifest.xml 文件中進行注冊聲明,然而混淆處理之后,四大組件的類名就會被篡改,實際使用的類與 manifest 中注冊的類并不匹配,故而出錯。
  2. 其他應用程序訪問組件時可能會用到類的包名加類名,如果經過混淆,可能會無法找到對應組件或者產生異常。

JNI 調用的Java 方法

當 JNI 調用的 Java 方法被混淆后,方法名會變成無意義的名稱,這就與 C++ 中原本的 Java 方法名不匹配,因而會無法找到所調用的方法。

其他不應該被混淆的

  • 自定義控件不需要被混淆
  • JavaScript 調用 Java 的方法不應混淆
  • Java 的 native 方法不應該被混淆
  • 項目中引用的第三方庫也不建議混淆

混淆后的堆棧跟蹤

代碼經過 ProGuard 混淆處理后,想要讀取 StackTrace(堆棧追蹤)信息就會變得很困難。由于方法名稱和類的名稱都經過混淆處理,即使程序發生崩潰問題,也很難定位問題所在。幸運的是,ProGuard 為我們提供了補救的措施,在著手進行之前,我們先來看一下 ProGuard 每次構建后生成了哪些內容。

混淆輸出結果

混淆構建完成之后,會在 /build/outputs/mapping/release/ 目錄下生成以下文件:

  • dump.txt

說明 APK 內所有類文件的內部結構。

  • mapping.txt

提供混淆前后的內容對照表,內容主要包含類、方法和類的成員變量。

  • seeds.txt

羅列出未進行混淆處理的類和成員。

  • usage.txt

羅列出從 APK 中移除的代碼。

恢復堆棧跟蹤

了解完混淆構建完畢后輸出的內容之后,我們現在就來看一下之前的問題:混淆處理后,StackTrace 定位困難。如何來恢復 StackTrace 的定位能力呢?系統為我們提供了 retrace 工具,結合上文提到的 mapping.txt 文件,就可以將混淆后的崩潰堆棧追蹤信息還原成正常情況下的 StackTrace 信息。主要有兩種方式來恢復 StackTrace,為了方便理解,我們以下面這段崩潰信息為例,借助兩種方式分別來還原:

  1. java.lang.RuntimeException: Unable to start activity  
  2.  Caused by: kotlin.KotlinNullPointerException 
  3.  at com.moos.media.ui.ImageSelectActivity.k(ImageSelectActivity.kt:71) 
  4.  at com.moos.media.ui.ImageSelectActivity.onCreate(ImageSelectActivity.kt:58) 
  5.  at android.app.Activity.performCreate(Activity.java:6237) 
  6.  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 

通過 retrace 腳本工具

首先我們要進入到 Android SDK 路徑的 /tools/proguard/bin 目錄中,這里以 Mac 系統為例,可以看到如下內容:

請你吃一頓史上最全的Android混淆大餐

可以看到如上三個文件,而 proguardgui.sh 才是我們需要的 retrace 腳本(Windows系統下為 proguardgui.bat )。Windows 系統中只需要雙擊腳本 proguardgui.bat 即可運行,至于 Mac 系統,如果你沒有做任何配置,只需要將 proguardgui.sh 腳本拖動到 Mac 自帶的終端中,回車鍵即可運行。接著,我們會看到如下界面:

請你吃一頓史上最全的Android混淆大餐

選擇 ReTrace 欄 ,并添加我們項目中混淆生成的 mapping.txt 文件所在位置,然后將我們的混淆后的崩潰信息復制到 Obfuscated stack trace 那一欄,點擊 ReTrace! 按鈕即可還原出我們的崩潰日志信息,結果如上圖所示,我們之前的混淆日志:at com.moos.media.ui.ImageSelectActivity.k(ImageSelectActivity.kt:71) 被還原成了 at com.moos.media.ui.ImageSelectActivity.initView(ImageSelectActivity.kt:71)。ImageSelectActivity.k 是我們混淆后的方法名,ImageSelectActivity.initView 則是最初未混淆前的方法名,借助于 ReTrace 工具的幫助,我們就可以像以前一樣很快定位到崩潰代碼區域了。

通過 retrace 命令行

我們先要將崩潰信息復制到 txt 格式的文件(如:proguard_stacktrace.txt)中保存,然后執行以下命令即可(MAC系統):

  1. retrace.sh -verbose mapping.txt proguard_stacktrace.txt 

如果你是 windows 系統,可以執行以下命令:

  1. retrace.bat -verbose mapping.txt proguard_stacktrace.txt 

最終還原的結果和之前效果一樣:

請你吃一頓史上最全的Android混淆大餐

也許你通過以上兩種方式在對 stackTrace 進行恢復時,發現 Unknown Source 問題:

請你吃一頓史上最全的Android混淆大餐

值得注意的是,記得在混淆規則中加上如下配置來提升我們的 StackSource 查找效率:

  1. # 保留源文件名和具體代碼行號 
  2. -keepattributes SourceFile,LineNumberTable 

此外,我們每次使用 ProGuard 創建發布構建時都都會覆蓋之前版本的 mapping.txt 文件,因此我們每次發布新版本時都必須小心地保存一個副本。通過為每個發布構建保留一個 mapping.txt 文件副本,我們就可以在用戶提交的已混淆的 StackTrace 來對舊版本應用的問題進行調試和修復。

漲姿勢的操作

經過上文的介紹,我們知道,APK 在經過代碼混淆處理后,包名、類名、成員名被轉化為無意義、難以理解的名稱,增加反編譯的成本。Android ProGuard 為我們提供了默認的"混淆字典",即將元素名稱轉為英文小寫字母的形式。那么,我們可以定義自己的混淆字典嗎?賣個關子,我們先來看一張效果圖:

請你吃一頓史上最全的Android混淆大餐

這個波操作是不是有點"出類拔萃"了?哈哈,就不賣關子了,其實很簡單,只要生成一套自己的 txt 格式的混淆字典,然后在混淆規則 Proguard-rules.pro 中應用一下即可: 

請你吃一頓史上最全的Android混淆大餐

本文中使用的混淆字典可以在此處查看并下載

 

當然,大家也可以自己去定制化自己的"混淆字典",增加反編譯的難度。

一路走下來,我們可以發現,從混淆技術的必要性和優點來看,它還是很值得我們去深入學習和研究的,本文帶大家領略的僅僅是"冰山一角"。由于本人的技術水平有限,若大家發現有問題或者闡述不當之處,歡迎指出并修正。

 

責任編輯:未麗燕 來源: 安卓巴士
相關推薦

2015-05-07 10:02:47

庫克蘋果

2019-11-21 13:59:20

網絡攻擊攻擊成本網絡安全

2018-04-12 17:00:07

云計算燒烤SaaS

2015-03-05 17:10:41

平安WiFi鬧元宵

2021-11-08 06:34:08

辭退面試項目

2024-08-12 00:00:00

NPMCTOJavaScrip

2021-09-13 10:25:35

開發技能代碼

2023-05-05 09:48:14

LinuxIO模型

2021-12-17 07:30:42

排序算法效率

2013-05-27 14:06:14

Android開發移動開發Intent機制

2021-04-12 07:32:01

數據庫

2021-02-09 16:31:30

物聯網年夜飯餐飲

2021-05-18 09:39:19

互聯網操作系統Go

2020-03-29 08:56:07

文件系統磁盤Java

2009-12-17 13:59:11

Linux缺點

2011-04-08 09:25:50

虛擬機

2009-09-10 11:24:16

NFS服務器

2024-07-17 09:16:58

2025-03-11 09:15:00

2021-11-05 14:57:00

微軟操作系統Windows
點贊
收藏

51CTO技術棧公眾號

波多野结衣视频一区二区| 国产草草影院ccyycom| 免费毛片在线不卡| 欧美日韩一级片在线观看| 一级特黄录像免费播放全99| 国产成人麻豆精品午夜在线| 国产精品一级| xx视频.9999.com| 中国一级特黄录像播放| 午夜激情成人网| 一区二区免费在线播放| 欧美日韩国产综合视频在线| 国产内射老熟女aaaa∵| 亚洲欧美日本日韩| 日韩亚洲成人av在线| 看全色黄大色黄女片18| 国产亚洲精品精品国产亚洲综合| 一区二区三区在线观看视频| 欧日韩一区二区三区| www.精品久久| 蜜桃在线一区二区三区| 久久人人爽人人| 成人三级视频在线观看| 神马久久av| 日韩欧美在线综合网| 久久九九国产视频| 午夜在线激情影院| 国产精品成人免费在线| 免费中文日韩| 少妇人妻精品一区二区三区| 国内精品国产三级国产a久久| 91极品女神在线| 欧美卡一卡二卡三| 国产精品97| 国产亚洲福利一区| 黄色片视频免费观看| 日本综合精品一区| 欧美美女激情18p| 麻豆av免费在线| 黄色污网站在线观看| 一区二区免费视频| 强伦女教师2:伦理在线观看| 成年女人的天堂在线| 91视频观看免费| 国产伦理久久久| 亚洲av无码国产精品永久一区| 蜜桃视频一区二区| 国产精品福利久久久| 日韩精品一区二区亚洲av| 中日韩男男gay无套| 欧美精品久久久久a| 国产性xxxx| 自产国语精品视频| x99av成人免费| 成人免费视频入口| 成人羞羞网站入口| 中国china体内裑精亚洲片| 少妇久久久久久久久久| 九九综合九九| 亚洲网址你懂得| 国产真实乱人偷精品人妻| 你懂的视频欧美| 亚洲天堂色网站| 亚洲欧美va天堂人熟伦 | 欧美三级黄美女| 欧美精品中文字幕一区| 欧美日韩人妻精品一区二区三区| 在线看片不卡| 欧美极品少妇xxxxⅹ裸体艺术| 激情小说中文字幕| 亚洲一级二级| 992tv在线成人免费观看| 国产精品国产三级国产专区52| 亚洲欧洲一区| 欧美最近摘花xxxx摘花| 夜夜躁日日躁狠狠久久av| 免费成人在线观看视频| 91久久久精品| 人妻丰满熟妇av无码区hd| 99国产一区二区三精品乱码| 你懂的视频在线一区二区| www亚洲人| 亚洲精品第1页| 霍思燕三级露全乳照| 欧美日韩视频网站| 欧美巨大另类极品videosbest| 免费黄色在线播放| 欧美日韩麻豆| 中文字幕日韩在线视频| 精品国产视频一区二区三区| 亚洲一级特黄| 国产精品国产三级国产aⅴ9色 | av毛片午夜不卡高**水| 欧美网站在线观看| 日本不卡一区二区在线观看| 久久aimee| 最近2019年中文视频免费在线观看 | 伊人网免费视频| 国产91在线看| 香蕉久久免费影视| 狂野欧美性猛交xxxxx视频| 丰满岳妇乱一区二区三区| 在线观看国产一级片| 成人香蕉社区| xxx成人少妇69| 久久久久久久久久免费视频 | 欧美99在线视频观看| 97福利一区二区| 国产又粗又猛又黄又爽无遮挡| www.久久精品| 中国成人亚色综合网站| 日韩脚交footjobhd| 欧美一区二区三区在| av女人的天堂| 99精品热6080yy久久| 成人淫片在线看| 极品美乳网红视频免费在线观看| 一区二区三区不卡在线观看| 亚洲天堂av线| 色婷婷av一区二区三区丝袜美腿| 欧美另类交人妖| 一级片视频播放| 久久久精品中文字幕麻豆发布| 91黄色在线看| 免费欧美网站| 日韩中文字幕在线看| 国产农村妇女aaaaa视频| 成人中文字幕电影| 国产一二三四五| 欧美电影在线观看网站| 亚洲伦理中文字幕| 日本三级视频在线| 丁香另类激情小说| 国产一区一区三区| 亚洲一区二区三区久久久| 亚洲女人天堂视频| 91精品国产乱码久久久张津瑜| 国产精品白丝jk白祙喷水网站| 亚欧精品在线| 91福利精品在线观看| 亚洲视频在线看| 日本一区二区三区精品| av毛片久久久久**hd| 8x8ⅹ国产精品一区二区二区| 亚洲毛片在线免费| 搡老女人一区二区三区视频tv| 久久久精品毛片| 久久久国产精品午夜一区ai换脸| 妺妺窝人体色www在线小说| 极品国产人妖chinesets亚洲人妖| 欧美大学生性色视频| 精品二区在线观看| 亚洲最新视频在线观看| 折磨小男生性器羞耻的故事| 伊人久久久大香线蕉综合直播| 鬼打鬼之黄金道士1992林正英| 青草青在线视频| 精品国产乱码久久久久久影片| 黄色一级视频在线观看| 成人精品小蝌蚪| 久久久久久久久久久99| 亚洲欧洲美洲国产香蕉| 国产成人在线视频| www 日韩| 日韩欧美黄色影院| 国产精品7777| 久久女同精品一区二区| 中文字幕国产传媒| 91久久电影| 成人91视频| 在线女人免费视频| 国产一区二区三区在线视频| 91在线视频国产| 亚洲综合精品自拍| 国产黄色三级网站| 日日欢夜夜爽一区| 国产精品波多野结衣| 中文无码日韩欧| 欧美综合第一页| 毛片在线不卡| 精品成人在线观看| caoporn国产| 国产精品久久久久久久第一福利 | 成人午夜免费在线| 国产日产一区| 5g影院天天爽成人免费下载| 嗯啊主人调教在线播放视频 | 久久久久久久久久久久久久一区| 三上悠亚激情av一区二区三区 | 欧美影视一区二区| 国产成人久久精品一区二区三区| 69视频在线免费观看| av男人的天堂在线| 亚洲精品一区二区三区四区高清| 不卡av电影在线| 亚洲精品国产精华液| 亚洲精品国产熟女久久久| 国产麻豆午夜三级精品| 免费无码国产v片在线观看| 97精品国产| 久久久99国产精品免费| 亚洲成人高清| 欧美在线视频a| 中文字幕有码在线观看| 亚洲欧美制服中文字幕| 成 人 黄 色 片 在线播放| 日韩欧美主播在线| 国产免费无码一区二区视频| 欧美激情一区二区三区| 亚洲欧美在线不卡| 国产在线不卡一卡二卡三卡四卡| 国产性xxxx18免费观看视频| 欧美在线网站| 亚洲成人网上| 日韩精品丝袜美腿| 91aaaa| 黄色欧美视频| 欧美在线视频在线播放完整版免费观看 | 亚洲毛片在线免费| 国产精品久久久999| а√天堂资源官网在线资源| 久久福利网址导航| av资源在线观看免费高清| 精品伊人久久97| 亚洲国产精品suv| 欧美精品vⅰdeose4hd| 午夜精品免费观看| 欧美香蕉大胸在线视频观看 | 成年人黄视频在线观看| 在线观看91久久久久久| 男同在线观看| 日韩成人激情视频| 后进极品白嫩翘臀在线视频| 欧美一卡二卡在线观看| 中文字幕资源网| 色婷婷综合久久久中文字幕| 一级片中文字幕| 亚洲成av人片一区二区梦乃| 精品无码一区二区三区电影桃花 | 久久天天做天天爱综合色| 黄色在线免费播放| 成人午夜在线视频| 免费观看一区二区三区| 国产成人精品综合在线观看| 久久久久亚洲av无码麻豆| 狠狠v欧美v日韩v亚洲ⅴ| 性生活免费在线观看| 美腿丝袜在线亚洲一区| 中文字幕 91| 激情久久五月天| 自拍偷拍一区二区三区四区| 久久精品久久精品| 加勒比av中文字幕| 韩国av一区二区三区四区| 精品亚洲视频在线| 国产又黄又大久久| 色哟哟免费视频| 粉嫩欧美一区二区三区高清影视| 国产精品19p| 成人黄色在线看| 亚洲男女在线观看| 91麻豆免费看| 手机看片福利视频| 国产精品久久久久久久久果冻传媒 | 国产特级aaaaaa大片| 日韩精品最新网址| 少妇一区二区三区四区| 日韩精品亚洲精品| 高清中文字幕一区二区三区| 中文字幕在线国产精品| 黄网站在线播放| 国模精品系列视频| 456亚洲精品成人影院| 国产精品伦子伦免费视频| 一级欧美视频| 国产伦精品一区二区三区在线| 希岛爱理av免费一区二区| 无遮挡亚洲一区| 欧美精选一区| 久久国产成人精品国产成人亚洲| 欧美a一区二区| wwwww在线观看| 久久久久青草大香线综合精品| 国产又粗又长又硬| 亚洲一区二区三区四区五区中文| 性无码专区无码| 91精品国产综合久久福利软件| 免费a视频在线观看| 国产午夜精品一区理论片飘花| www视频在线免费观看| 7777kkkk成人观看| 日韩国产大片| 精品午夜一区二区| 五月天久久777| 国产亚洲精品网站| 国产精品自在欧美一区| 免费看黄色aaaaaa 片| 国产精品美女久久久久av爽李琼| 精品无码黑人又粗又大又长| 欧美亚洲尤物久久| 熟妇高潮一区二区高潮| 日韩中文字幕第一页| 一区二区三区短视频| 亚洲一区二区中文字幕| 婷婷国产精品| 黄色一级片国产| 毛片一区二区三区| 性欧美丰满熟妇xxxx性久久久| 亚洲欧洲av在线| 国产午夜麻豆影院在线观看| 亚洲高清在线观看| 大片免费在线看视频| 国产精品欧美在线| 日韩有码中文字幕在线| 国产尤物av一区二区三区| 免费精品视频最新在线| 国产麻豆天美果冻无码视频| 亚洲激情av在线| 91成人在线免费| 亚洲性生活视频在线观看| av剧情在线观看| 国产精品区一区| 欧美在线国产| 日韩av自拍偷拍| 欧美激情一区三区| 国产一区二区视频网站| 亚洲国产天堂久久综合| 亚洲区欧洲区| 亚洲aⅴ男人的天堂在线观看| 久久在线免费| 日韩av手机版| 欧美国产综合一区二区| 在线观看日韩中文字幕| 亚洲精品成人网| 2019中文字幕在线电影免费| 99视频免费观看| 中文字幕免费一区二区三区| 伊人网在线综合| 中文字幕一区二区不卡| 亚洲一区二区天堂| 中文字幕日韩高清| 在线成人视屏| 亚洲国产欧洲综合997久久| 日韩国产精品久久久久久亚洲| 实拍女处破www免费看| 欧美性色视频在线| 国产中文在线| 国产精品成人观看视频国产奇米| 欧美日韩高清| 欧美午夜aaaaaa免费视频| 国产精品天天看| 国产影视一区二区| 久久人体大胆视频| 999精品视频在线观看| 亚洲成人动漫在线| 成人三级伦理片| 国产情侣在线视频| 亚洲欧美国产日韩天堂区| 卡通欧美亚洲| 亚洲欧洲一区二区福利| 狠狠色狠狠色综合日日91app| 91九色丨porny丨极品女神| 欧美一区二区在线视频| 在线观看操人| 精品999在线观看| 久久中文在线| 中文字幕精品亚洲| 日韩一区二区免费电影| missav|免费高清av在线看| 久久婷婷开心| 美洲天堂一区二卡三卡四卡视频 | 91视频8mav| 欧美色图麻豆| 中文字幕一区二区三区人妻电影| 欧美这里有精品| www在线视频| 精品国产二区在线| 青青青爽久久午夜综合久久午夜| 午夜激情福利电影| 精品国产乱码久久| 少妇一区视频| 亚洲一区 在线播放| wwwwww.欧美系列| 一级黄色片在线看| 欧美激情在线观看| 国产一区二区欧美| xxxx国产视频| 在线免费观看日本一区| 精品麻豆一区二区三区| 国产在线精品二区| 久久精品免费观看| 国产无套内射又大又猛又粗又爽 | 国产成人在线视频免费观看| 国产日韩一区欧美| 久久精品国产免费看久久精品| 国产成人啪精品午夜在线观看| 色黄久久久久久| 嫩草国产精品入口| 欧美在线a视频| 91福利国产成人精品照片|