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

讀懂Android中的代碼混淆

移動開發 Android
本文為本人的一些實踐總結,介紹一些混淆的知識和注意事項。希望可以幫助大家更好的學習和使用代碼混淆。

 

本文為本人的一些實踐總結,介紹一些混淆的知識和注意事項。希望可以幫助大家更好的學習和使用代碼混淆。

什么是混淆

關于混淆維基百科上該詞條的解釋為

代碼混淆(Obfuscated code)亦稱花指令,是將計算機程序的代碼,轉換成一種功能上等價,但是難于閱讀和理解的形式的行為。

代碼混淆影響到的元素有

  • 類名
  • 變量名
  • 方法名
  • 包名
  • 其他元素

混淆的目的

混淆的目的是為了加大反編譯的成本,但是并不能徹底防止反編譯.

如何開啟混淆

  • 通常我們需要找到項目路徑下app目錄下的build.gradle文件
  • 找到minifyEnabled這個配置,然后設置為true即可.

一個簡單的示例如下

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

proguard是什么

Java官網對Proguard的定義

ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier. It detects and removes unused classes, fields, methods, and attributes. It optimizes bytecode and removes unused instructions. It renames the remaining classes, fields, and methods using short meaningless names. Finally, it preverifies the processed code for Java 6 or higher, or for Java Micro Edition.

  • Proguard是一個集文件壓縮,優化,混淆和校驗等功能的工具
  • 它檢測并刪除無用的類,變量,方法和屬性
  • 它優化字節碼并刪除無用的指令.
  • 它通過將類名,變量名和方法名重命名為無意義的名稱實現混淆效果.
  • 最后它還校驗處理后的代碼

混淆的常見配置

-keep

Keep用來保留Java的元素不進行混淆. keep有很多變種,他們一般都是

  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers

一些例子

保留某個包下面的類以及子包

  1. -keep public class com.droidyue.com.widget.** 

保留所有類中使用otto的public方法

  1. # Otto 
  2.  
  3. -keepclassmembers class ** { 
  4.  
  5. @com.squareup.otto.Subscribe public *; 
  6.  
  7. @com.squareup.otto.Produce public *; 
  8.  
  9.  

保留Contants類的BOOK_NAME屬性

  1. -keepclassmembers class com.example.admin.proguardsample.Constants { 
  2.  
  3. public static java.lang.String BOOK_NAME; 
  4.  
  5.  

更多關于Proguard keep使用,可以參考官方文檔

-dontwarn

dontwarn是一個和keep可以說是形影不離,尤其是處理引入的library時.

引入的library可能存在一些無法找到的引用和其他問題,在build時可能會發出警告,如果我們不進行處理,通常會導致build中止.因此為了保證build繼續,我們需要使用dontwarn處理這些我們無法解決的library的警告.

比如關閉Twitter sdk的警告,我們可以這樣做

  1. -dontwarn com.twitter.sdk.** 

其他混淆相關的介紹,都可以通過訪問官方文檔獲取.

哪些不應該混淆

反射中使用的元素

如果一些被混淆使用的元素(屬性,方法,類,包名等)進行了混淆,可能會出現問題,如NoSuchFiledException或者NoSuchMethodException等.

比如下面的示例源碼

  1. //Constants.java 
  2.  
  3. public class Constants { 
  4.  
  5. public static String BOOK_NAME = "book_name"
  6.  
  7.  
  8. //MainActivity.java 
  9.  
  10. Field bookNameField = null
  11.  
  12. try { 
  13.  
  14. String fieldName = "BOOK_NAME"
  15.  
  16. bookNameField = Constants.class.getField(fieldName); 
  17.  
  18. Log.i(LOGTAG, "bookNameField=" + bookNameField); 
  19.  
  20. } catch (NoSuchFieldException e) { 
  21.  
  22. e.printStackTrace(); 
  23.  
  24.  

如果上面的Constants類進行了混淆,那么上面的語句就可能拋出NoSuchFieldException.

想要驗證,我們需要看一看混淆的映射文件,文件名為mapping.txt,該文件保存著混淆前后的映射關系.

  1. com.example.admin.proguardsample.Constants -> com.example.admin.proguardsample.a: 
  2.  
  3. java.lang.String BOOK_NAME -> a 
  4.  
  5. void <init>() -> <init> 
  6.  
  7. void <clinit>() -> <clinit> 
  8.  
  9. com.example.admin.proguardsample.MainActivity -> com.example.admin.proguardsample.MainActivity: 
  10.  
  11. void <init>() -> <init> 
  12.  
  13. void onCreate(android.os.Bundle) -> onCreate  

從映射文件中,我們可以看到

  • Constants類被重命名為a.
  • Constants類的BOOK_NAME重命名了a

然后,我們對APK文件進行反編譯一探究竟.推薦一下這個在線反編譯工具 decompile Android .apk ✓ ONLINE ✓

注意,使用jadx decompiler后,會重新命名,正如下面注釋/* renamed from: com.example.admin.proguardsample.a */所示.

  1. package com.example.admin.proguardsample; 
  2.  
  3. /* renamed from: com.example.admin.proguardsample.a */ 
  4.  
  5. public class C0314a { 
  6.  
  7. public static String f1712a; 
  8.  
  9. static { 
  10.  
  11. f1712a = "book_name"
  12.  
  13.  
  14.  

而MainActivity的翻譯后的對應的源碼為

  1. try { 
  2.  
  3. Log.i("MainActivity""bookNameField=" + C0314a.class.getField("BOOK_NAME")); 
  4.  
  5. } catch (NoSuchFieldException e) { 
  6.  
  7. e.printStackTrace(); 
  8.  
  9.  

MainActivity中反射獲取的屬性名稱依然是BOOK_NAME,而對應的類已經沒有了這個屬性名,所以會拋出NoSuchFieldException.

注意,如果上面的filedName使用字面量或者字符串常量,即使混淆也不會出現NoSuchFieldException異常。因為這兩種情況下,混淆可以感知外界對filed的引用,已經在調用出替換成了混淆后的名稱。

GSON的序列化與反序列化

GSON是一個很好的工具,使用它我們可以輕松的實現序列化和反序列化.但是當它一旦遇到混淆,就需要我們注意了.

一個簡單的類Item,用來處理序列化和反序列化

  1. public class Item { 
  2.  
  3. public String name
  4.  
  5. public int id; 
  6.  
  7.  

序列化的代碼

  1. Item toSerializeItem = new Item(); 
  2.  
  3. toSerializeItem.id = 2; 
  4.  
  5. toSerializeItem.name = "Apple"
  6.  
  7. String serializedText = gson.toJson(toSerializeItem); 
  8.  
  9. Log.i(LOGTAG, "testGson serializedText=" + serializedText);  

開啟混淆之后的日志輸出結果

  1. I/MainActivity: testGson serializedText={"a":"Apple","b":2} 

屬性名已經改變了,變成了沒有意思的名稱,對我們后續的某些處理是很麻煩的.

反序列化的代碼

  1. Gson gson = new Gson(); 
  2.  
  3. Item item = gson.fromJson("{\"id\":1, \"name\":\"Orange\"}", Item.class); 
  4.  
  5. Log.i(LOGTAG, "testGson item.id=" + item.id + ";item.name=" + item.name);  

對應的日志結果是 

  1. I/MainActivity: testGson item.id=0;item.name=null 

可見,混淆之后,反序列化的屬性值設置都失敗了.

為什么呢?

因為反序列化創建對象本質還是利用反射,會根據json字符串的key作為屬性名稱,value則對應屬性值.

如何解決

  • 將序列化和反序列化的類排除混淆
  • 使用@SerializedName注解字段

@SerializedName(parameter)通過注解屬性實現了

  • 序列化的結果中,指定該屬性key為parameter的值.
  • 反序列化生成的對象中,用來匹配key與parameter并賦予屬性值.

一個簡單的用法為 

  1. public class Item { 
  2.     @SerializedName("name"
  3.     public String name
  4.     @SerializedName("id"
  5.     public int id;  

枚舉也不要混淆

枚舉是Java 5 中引入的一個很便利的特性,可以很好的替代之前的常量形式.

枚舉使用起來很簡單,如下

  1. public enum Day { 
  2.     MONDAY, 
  3.     TUESDAY, 
  4.     WEDNESDAY, 
  5.     THURSDAY, 
  6.     FRIDAY, 
  7.     SATURDAY, 
  8.     SUNDAY 
  9.  

這里我們這樣使用枚舉

  1. Day day = Day.valueOf("monday"); 
  2. Log.i(LOGTAG, "testEnum day=" + day);  

運行上面的的代碼,通常情況下是沒有問題的,是否說明枚舉就可以混淆呢?

其實不是.

為什么沒有問題呢,因為默認的Proguard配置已經處理了枚舉相關的keep操作.

  1. For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations 
  2.  
  3. -keepclassmembers enum * { 
  4.  
  5. public static **[] values(); 
  6.  
  7. public static ** valueOf(java.lang.String); 
  8.  
  9.  

如果我們手動去掉這條keep配置,再次運行,一個這樣的異常會從天而降.

  1. E AndroidRuntime: Process: com.example.admin.proguardsample, PID: 17246 
  2.  
  3. E AndroidRuntime: java.lang.AssertionError: impossible 
  4.  
  5. E AndroidRuntime: at java.lang.Enum$1.create(Enum.java:45) 
  6.  
  7. E AndroidRuntime: at java.lang.Enum$1.create(Enum.java:36) 
  8.  
  9. E AndroidRuntime: at libcore.util.BasicLruCache.get(BasicLruCache.java:54) 
  10.  
  11. E AndroidRuntime: at java.lang.Enum.getSharedConstants(Enum.java:211) 
  12.  
  13. E AndroidRuntime: at java.lang.Enum.valueOf(Enum.java:191) 
  14.  
  15. E AndroidRuntime: at com.example.admin.proguardsample.a.a(Unknown Source) 
  16.  
  17. E AndroidRuntime: at com.example.admin.proguardsample.MainActivity.j(Unknown Source) 
  18.  
  19. E AndroidRuntime: at com.example.admin.proguardsample.MainActivity.onCreate(Unknown Source) 
  20.  
  21. E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:6237) 
  22.  
  23. E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
  24.  
  25. E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
  26.  
  27. E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
  28.  
  29. E AndroidRuntime: at android.app.ActivityThread.-wrap11(ActivityThread.java) 
  30.  
  31. E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
  32.  
  33. E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102) 
  34.  
  35. E AndroidRuntime: at android.os.Looper.loop(Looper.java:148) 
  36.  
  37. E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5417) 
  38.  
  39. E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 
  40.  
  41. E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
  42.  
  43. E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
  44.  
  45. E AndroidRuntime: Caused by: java.lang.NoSuchMethodException: values [] 
  46.  
  47. E AndroidRuntime: at java.lang.Class.getMethod(Class.java:624) 
  48.  
  49. E AndroidRuntime: at java.lang.Class.getDeclaredMethod(Class.java:586) 
  50.  
  51. E AndroidRuntime: at java.lang.Enum$1.create(Enum.java:41) 
  52.  
  53. E AndroidRuntime: ... 19 more  

好玩的事情來了,我們看一看為什么會拋出這個異常

1.首先,一個枚舉類會生成一個對應的類文件,這里是Day.class. 這里類里面包含什么呢,看一下反編譯的結果

  1. proguardsample javap Day 
  2.  
  3. Warning: Binary file Day contains com.example.admin.proguardsample.Day 
  4.  
  5. Compiled from "Day.java" 
  6.  
  7. public final class com.example.admin.proguardsample.Day extends java.lang.Enum<com.example.admin.proguardsample.Day> { 
  8.  
  9. public static final com.example.admin.proguardsample.Day MONDAY; 
  10.  
  11. public static final com.example.admin.proguardsample.Day TUESDAY; 
  12.  
  13. public static final com.example.admin.proguardsample.Day WEDNESDAY; 
  14.  
  15. public static final com.example.admin.proguardsample.Day THURSDAY; 
  16.  
  17. public static final com.example.admin.proguardsample.Day FRIDAY; 
  18.  
  19. public static final com.example.admin.proguardsample.Day SATURDAY; 
  20.  
  21. public static final com.example.admin.proguardsample.Day SUNDAY; 
  22.  
  23. public static com.example.admin.proguardsample.Day[] values(); 
  24.  
  25. public static com.example.admin.proguardsample.Day valueOf(java.lang.String); 
  26.  
  27. static {}; 
  28.  
  29.  
  • 枚舉實際是創建了一個繼承自java.lang.Enum的類
  • java代碼中的枚舉類型最后轉換成類中的static final屬性
  • 多出了兩個方法,values()和valueOf().
  • values方法返回定義的枚舉類型的數組集合,即從MONDAY到SUNDAY這7個類型.

2.找尋崩潰軌跡 其中Day.valueOf(String)內部會調用Enum.valueOf(Class,String)方法

  1. public static com.example.admin.proguardsample.Day valueOf(java.lang.String); 
  2.  
  3. Code: 
  4.  
  5. 0: ldc #4 // class com/example/admin/proguardsample/Day 
  6.  
  7. 2: aload_0 
  8.  
  9. 3: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; 
  10.  
  11. 6: checkcast #4 // class com/example/admin/proguardsample/Day 
  12.  
  13. 9: areturn  

而Enum的valueOf方法會間接調用Day.values()方法,具體步驟是

  • Enum.value調用Class.enumConstantDirectory方法獲取String到枚舉的映射
  • Class.enumConstantDirectory方法調用Class.getEnumConstantsShared獲取當前的枚舉類型
  • Class.getEnumConstantsShared方法使用反射調用values來獲取枚舉類型的集合.

混淆之后,values被重新命名,所以會發生NoSuchMethodException.

關于調用軌跡,感興趣的可以自己研究一下源碼,不難.

四大組件不建議混淆

Android中四大組件我們都很常用,這些組件不能被混淆的原因為

  • 四大組件聲明必須在manifest中注冊,如果混淆后類名更改,而混淆后的類名沒有在manifest注冊,是不符合Android組件注冊機制的.
  • 外部程序可能使用組件的字符串類名,如果類名混淆,可能導致出現異常

注解不能混淆

注解在Android平臺中使用的越來越多,常用的有ButterKnife和Otto.很多場景下注解被用作在運行時反射確定一些元素的特征.

為了保證注解正常工作,我們不應該對注解進行混淆.Android工程默認的混淆配置已經包含了下面保留注解的配置

  1. -keepattributes *Annotation* 

關于注解,可以閱讀這篇文章了解.詳解Java中的注解

其他不該混淆的

  • jni調用的java方法
  • java的native方法
  • js調用java的方法
  • 第三方庫不建議混淆
  • 其他和反射相關的一些情況

stacktrace的恢復

Proguard混淆帶來了很多好處,但是也會導致我們收集到的崩潰的stacktrace變得更加難以讀懂,好在有補救的措施,這里就介紹一個工具,retrace,用來將混淆后的stacktrace還原成混淆之前的信息.

retrace腳本

Android 開發環境默認帶著retrace腳本,一般情況下路徑為./tools/proguard/bin/retrace.sh

mapping映射表

Proguard進行混淆之后,會生成一個映射表,文件名為mapping.txt,我們可以使用find工具在Project下查找

  1. find . -name mapping.txt 
  2.  
  3. ./app/build/outputs/mapping/release/mapping.txt  

一個崩潰stacktrace信息

一個原始的崩潰信息是這樣的.

  1. E/AndroidRuntime(24006): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference 
  2.  
  3. E/AndroidRuntime(24006): at com.example.admin.proguardsample.a.a(Utils.java:10) 
  4.  
  5. E/AndroidRuntime(24006): at com.example.admin.proguardsample.MainActivity.onCreate(MainActivity.java:22) 
  6.  
  7. E/AndroidRuntime(24006): at android.app.Activity.performCreate(Activity.java:6106) 
  8.  
  9. E/AndroidRuntime(24006): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 
  10.  
  11. E/AndroidRuntime(24006): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2566) 
  12.  
  13. E/AndroidRuntime(24006): ... 10 more  

對上面的信息處理,去掉E/AndroidRuntime(24006):這些字符串retrace才能正常工作.得到的字符串是

  1. Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference 
  2. at com.example.admin.proguardsample.a.a(Utils.java:10) 
  3. at com.example.admin.proguardsample.MainActivity.onCreate(MainActivity.java:22) 
  4. at android.app.Activity.performCreate(Activity.java:6106) 
  5. at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 
  6. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2566) 
  7. ... 10 more  

將上面的stacktrace保存成一個文本文件,比如名稱為npe_stacktrace.txt.

開搞

  1. ./tools/proguard/bin/retrace.sh /Users/admin/Downloads/ProguardSample/app/build/outputs/mapping/release/mapping.txt /tmp/npe_stacktrace.txt 

得到的易讀的stacktrace是

  1. Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference 
  2.  
  3. at com.example.admin.proguardsample.Utils.int getBitmapWidth(android.graphics.Bitmap)(Utils.java:10) 
  4.  
  5. at com.example.admin.proguardsample.MainActivity.void onCreate(android.os.Bundle)(MainActivity.java:22) 
  6.  
  7. at android.app.Activity.performCreate(Activity.java:6106) 
  8.  
  9. at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 
  10.  
  11. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2566) 
  12.  
  13. ... 10 more  

注意:為了更加容易和高效分析stacktrace,建議保留SourceFile和LineNumber屬性

  1. -keepattributes SourceFile,LineNumberTable 

關于混淆,我的一些個人經驗總結就是這些.希望可以對大家有所幫助.

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

2024-03-01 08:23:39

2012-12-25 13:37:29

Android代碼混淆

2017-07-24 13:00:52

2023-08-04 17:52:22

2021-05-07 16:23:54

鴻蒙HarmonyOS應用

2015-09-28 09:05:27

別人能讀懂代碼

2015-09-28 09:17:43

代碼可閱讀代碼質量

2023-05-20 17:58:31

低代碼軟件

2017-03-22 14:23:58

Java HashMa實現原理

2009-06-11 14:11:33

代碼混淆Java反編譯

2009-07-31 14:59:00

2015-09-28 10:49:59

代碼程序員

2015-03-10 13:43:00

JavaSocket編程編程

2024-03-27 08:23:39

2009-02-02 10:00:11

ADO.NETASP.NET

2017-03-07 15:13:28

Scala偏函數函數

2022-04-20 11:10:17

bias推薦系統debias

2025-08-29 10:05:00

GarbleGo代碼

2016-12-08 22:39:40

Android
點贊
收藏

51CTO技術棧公眾號

国产91精品一区| 国产农村妇女精品久久| 狠狠狠综合7777久夜色撩人| 久久一综合视频| 最近中文字幕2019免费| 手机看片国产精品| 中文字幕 在线观看| 欧美激情一区在线| 91传媒视频在线观看| 天堂网av手机版| 欧美独立站高清久久| 亚洲国产精品久久久久秋霞不卡| 亚洲天堂网一区| 日本三级在线观看网站| 国产欧美一区在线| 国产伦精品一区二区三毛| 狠狠躁夜夜躁人人爽视频| 欧美日韩mv| 中文欧美日本在线资源| yy1111111| 精品国产一级| 欧美无乱码久久久免费午夜一区| 中文字幕无码精品亚洲资源网久久| 超碰国产在线| 91亚洲精华国产精华精华液| 91老司机精品视频| 亚洲精品一区二三区| 精品动漫一区| 久久影视电视剧免费网站| 亚洲熟妇无码av| 荡女精品导航| 欧美色欧美亚洲另类二区| 精品视频免费在线播放| 日本色护士高潮视频在线观看| 亚洲欧洲国产日本综合| 欧美在线视频二区| 欧美日韩在线中文字幕| 成人v精品蜜桃久久一区| 92看片淫黄大片欧美看国产片 | 亚洲国产日产av| 综合久久国产| 日本免费在线观看| 欧美韩国日本综合| 欧美日韩亚洲在线| 男人的天堂在线视频| av中文字幕亚洲| 高清国语自产拍免费一区二区三区| 国产一区二区三区中文字幕| 男女性色大片免费观看一区二区 | 尤物九九久久国产精品的特点| 自拍视频一区二区| silk一区二区三区精品视频 | 小小影院久久| 最近更新的2019中文字幕| av手机在线播放| 少妇精品久久久| 亚洲人成毛片在线播放| 播金莲一级淫片aaaaaaa| 亚洲欧美tv| 亚洲欧美精品在线| 强伦人妻一区二区三区| 精品国产一区二区三区| 在线不卡国产精品| 日韩一级片在线免费观看| 日韩激情在线| 日韩在线中文字| 欧美黑人猛猛猛| 韩国在线视频一区| 91国产精品电影| 亚洲天堂一区在线观看| 日韩精品高清不卡| 91精品国产自产在线| 国产美女主播在线观看| 丁香五精品蜜臀久久久久99网站| 国产高清自拍一区| 香蕉视频911| 国产欧美精品一区二区色综合朱莉| 午夜免费电影一区在线观看| 国产在线一区二区视频| 亚洲国产精品尤物yw在线观看| 国产午夜大地久久| 粉嫩av一区二区三区四区五区| 欧美一区二区在线播放| 在线观看成人动漫| 精品一区三区| 久久精品免费电影| 久久精品免费av| 久久久久久穴| 91黄在线观看| 四虎精品在线| 国产精品久久久久久久久晋中| 男人c女人视频| 免费观看亚洲| 69堂国产成人免费视频| 亚洲中文字幕一区| 日韩电影免费在线观看| 欧美疯狂xxxx大交乱88av| 久久久久99精品成人片三人毛片| 蜜桃在线一区二区三区| 高清不卡一区二区三区| 国产女主播在线写真| 亚洲精品欧美专区| 高清在线观看免费| 伊人亚洲精品| 亚洲男人的天堂网站| 欧美日韩在线国产| 日韩福利电影在线| 99久久久精品免费观看国产| 免费动漫网站在线观看| 亚洲制服欧美中文字幕中文字幕| 北条麻妃视频在线| 成人资源在线播放| 色777狠狠综合秋免鲁丝| 一区二区三区视频免费看| 久久er精品视频| 免费中文日韩| 国产99re66在线视频| 欧美人牲a欧美精品| 日韩av一二区| 国内在线观看一区二区三区| 国产精品美腿一区在线看| 欧美 日韩 中文字幕| 国产精品国产自产拍在线| 欧美一区二区三区爽大粗免费| 精品国产三级| 日韩中文视频免费在线观看| 少妇高潮av久久久久久| 不卡在线观看av| 国内外成人激情免费视频| 色猫猫成人app| 亚洲免费视频观看| 免费日韩一级片| 粉嫩久久99精品久久久久久夜| 中文字幕久久一区| 玖玖精品在线| 在线视频日韩精品| 天天干,天天干| 2024国产精品视频| 欧美一级在线看| 久久九九热re6这里有精品 | 中文在线免费二区三区| 亚洲精品电影网站| 日本在线观看中文字幕| 高清在线成人网| 先锋影音男人资源| 亚洲a成人v| 久久久精品欧美| 国产又大又粗又长| 综合久久综合久久| 特级西西444www| 91精品亚洲| 91久久综合亚洲鲁鲁五月天| www在线视频| 日韩女优视频免费观看| 麻豆成人在线视频| 成人免费电影视频| 免费看黄在线看| 色橹橹欧美在线观看视频高清| 欧美亚洲国产精品| 男人的天堂在线| 91高清在线观看| 又嫩又硬又黄又爽的视频| 蜜桃av一区二区| 欧美日韩视频免费在线观看| 亚洲精品一区国产| 91黑丝高跟在线| 六十路在线观看| 欧美天堂一区二区三区| 色欲人妻综合网| 国产精品一区免费视频| 丰满的少妇愉情hd高清果冻传媒| 国产欧美三级电影| 日本道色综合久久影院| 9i精品一二三区| 欧美一二三区精品| 国产一级做a爱免费视频| 91亚洲大成网污www| 国产aaaaa毛片| 在线国产一区二区| 精品欧美一区二区在线观看视频| 91精品xxx在线观看| 波多野结衣乳巨码无在线| 亚洲国产精品无码久久| 亚洲二区视频在线| 极品白嫩丰满美女无套| 日本少妇一区二区| 佐佐木明希av| 奇米影视777在线欧美电影观看| 奇米4444一区二区三区| 欧美精品日韩少妇| 精品国产三级a在线观看| 午夜精品一区二| 一区二区三区在线视频观看| 亚洲精品在线视频免费观看| 久久国产精品色婷婷| 青青青青在线视频| 中文字幕亚洲影视| 亚洲影院在线看| 成人影院av| 久久电影一区二区| 日av在线播放| 欧美一区二视频| 丁香社区五月天| 亚洲欧美一区二区在线观看| 日本japanese极品少妇| 精品在线播放午夜| 一本大道熟女人妻中文字幕在线 | 亚洲一区二区三区涩| 粉嫩的18在线观看极品精品| 国产精品1区2区在线观看| 羞羞视频在线观看不卡| 一区二区欧美在线| 人人妻人人玩人人澡人人爽| 欧美日韩aaa| 国产91国语对白在线| 亚洲欧美日韩久久| 亚洲午夜精品久久久久久高潮| 成人av综合在线| 午夜激情影院在线观看| 日本亚洲视频在线| 欧美成人一区二区在线观看| 欧美视频导航| 一区二区三区日韩视频| jlzzjlzz亚洲女人| 久久综合狠狠综合久久综青草| 日本一区二区三区电影免费观看| 国产欧美在线看| 懂色aⅴ精品一区二区三区| 欧亚精品中文字幕| h片精品在线观看| 欧美日韩成人在线观看| 久久日韩视频| 精品国模在线视频| 成人在线高清视频| 亚洲视频axxx| 欧美大片aaa| 亚洲精品中文字幕女同| 亚洲人成色777777老人头| 精品久久一区二区三区| www.蜜臀av| 日韩视频在线一区二区| 国产内射老熟女aaaa∵| 欧美精品日韩一本| 亚洲手机在线观看| 欧美日韩一级视频| 中文字幕日韩三级| 欧美日韩在线播| 亚洲熟女乱色一区二区三区久久久| 欧美午夜在线观看| 中文字幕久久久久| 欧美日韩第一区日日骚| 一区二区三区亚洲视频| 7777精品伊人久久久大香线蕉最新版| 91久久精品无码一区二区| 欧美精品第一页| 国产免费叼嘿网站免费| 日韩欧美国产1| 老牛影视av牛牛影视av| 亚洲精品99999| 日韩精品视频无播放器在线看| 亚洲精品日韩在线| 国产精品久久久久一区二区国产 | 国产日韩欧美一区| 国产在线观看福利| 日韩在线卡一卡二| 色天使在线观看| 国产精品一区免费在线观看| 亚洲高清无码久久| av电影一区二区| 成人免费无遮挡无码黄漫视频| 国产精品丝袜黑色高跟| 全网免费在线播放视频入口| 亚洲国产aⅴ天堂久久| 日本一级一片免费视频| 91国产精品成人| 国产乱淫av免费| 精品国产免费久久| 国内三级在线观看| 日韩亚洲国产中文字幕| 国产美女福利在线观看| 欧美中文在线观看国产| 日日夜夜精品| 精品国产一区二区三区免费| 国产永久精品大片wwwapp| 免费观看中文字幕| 亚洲视频二区| 国产女同无遮挡互慰高潮91| 成人白浆超碰人人人人| 极品人妻videosss人妻| 樱桃国产成人精品视频| 青草视频在线观看免费| 91精品在线观看入口| 日韩欧美在线观看一区二区| 久久精品国产久精国产思思| 碰碰在线视频| 91丝袜美腿美女视频网站| 日韩欧美影院| 黄色免费高清视频| 久久久久久黄| 911亚洲精选| 国产精品人人做人人爽人人添| 精品无码免费视频| 欧美日韩国产一区二区三区地区| 色一情一乱一乱一区91av| 波霸ol色综合久久| 日韩免费电影| 国产精品播放| 久久精品影视| 噼里啪啦国语在线观看免费版高清版| 国产传媒欧美日韩成人| 久久久久亚洲AV成人无在| 天天色图综合网| 国产www视频| 在线视频欧美日韩精品| 周于希免费高清在线观看| 99www免费人成精品| 成人三级视频| 国产一区二区三区精彩视频| 成人网在线免费视频| 亚洲精品卡一卡二| 欧美亚洲日本一区| 亚洲色欧美另类| 欧美激情亚洲自拍| 国产精品久一| 亚洲一区二区三区精品视频| 天堂资源在线中文精品| 女同性恋一区二区三区| 亚洲综合一区二区三区| 一级片在线观看视频| 中文字幕国产精品久久| 国产成人精品亚洲日本在线观看| 国产伦精品一区二区三区照片| 欧美激情无毛| av在线免费观看不卡| 亚洲欧美综合色| 91丨九色丨丰满| 色偷偷噜噜噜亚洲男人的天堂| 亚洲精品.com| 日本在线观看不卡| 免费精品视频| 野花社区视频在线观看| 福利微拍一区二区| 午夜视频免费看| 欧美一级淫片videoshd| 日韩欧美在线精品| 欧美色图另类小说| 2021久久国产精品不只是精品| 中文字幕视频网| 亚洲另类激情图| 婷婷综合六月| 色综合影院在线观看| 日本欧美韩国一区三区| 丁香激情五月少妇| 欧美三级午夜理伦三级中视频| 色网站在线看| 91成人免费看| 亚洲人成免费| 黄色a一级视频| 色噜噜久久综合| 91啦中文在线| 亚洲最大av网站| 精品999成人| 大又大又粗又硬又爽少妇毛片| 色婷婷精品大视频在线蜜桃视频| 国模吧精品人体gogo| 国产精品自拍偷拍| 久久久久久久久久久妇女 | 日韩成人精品| 精品无码国产一区二区三区av| av欧美精品.com| 无码人妻av免费一区二区三区| 最近2019中文字幕mv免费看| 中文字幕综合| 少妇人妻大乳在线视频| 国产亚洲欧美日韩在线一区| 一区二区三区在线免费观看视频| 精品国产美女在线| 都市激情亚洲| 青青青在线视频免费观看| **性色生活片久久毛片| 黄色片一区二区三区| 国产91热爆ts人妖在线| 久久精品av| 黑人玩弄人妻一区二区三区| 91黄视频在线观看| 亚洲图区一区| 欧美精品一区三区在线观看| 极品少妇xxxx精品少妇偷拍| 亚洲激情视频一区| 中文字幕在线观看亚洲| 91精品入口| 日本中文字幕高清| 亚洲午夜三级在线| 69视频在线| 国产一区免费在线| 久久爱另类一区二区小说| 日韩黄色精品视频| xvideos亚洲人网站| 亚洲人成伊人成综合图片| 国产资源中文字幕|