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

ANDROID動態加載 使用SO庫時要注意的一些問題

移動開發 Android
正好動態加載系列文章談到了加載SO庫的地方,我覺得這里可以順便談談使用SO庫時需要注意的一些問題。或許這些問題對于經常和SO庫開發打交道的同學來說已經是老生長談,但是既然要討論一整個動態加載系列,我想還是有必要說說使用SO庫時的一些問題。

基本信息

作者:kaedea

項目:android-dynamical-loading

Android項目里的SO庫

正好動態加載系列文章談到了加載SO庫的地方,我覺得這里可以順便談談使用SO庫時需要注意的一些問題。或許這些問題對于經常和SO庫開發打交道的同學來說已經是老生長談,但是既然要討論一整個動態加載系列,我想還是有必要說說使用SO庫時的一些問題。

在項目里使用SO庫非常簡單,在 加載SD卡中的SO庫 中也有談到,只需要把需要用到的SO庫拷貝進 jniLibs(或者Eclipse項目里面的libs) 中,然后在JAVA代碼中調用 System.loadLibrary(“xxx”) 加載對應的SO庫,就可以使用JNI語句調用SO庫里面的Native方法了。

但是有同學注意到了,SO庫文件可以隨便改文件名,卻不能任意修改文件夾路徑,而是“armeabi”、“armeabi-v7a”、“x86”等文件夾名有著嚴格的要求,這些文件夾名有什么意義么?

SO庫類型和CPU架構類型

原因很簡單,不同CPU架構的設備需要用不同類型SO庫(從文件名也可以猜出來個大概嘛 ╮( ̄▽ ̄”)╭)。

記得還在學校的時候,提及ARM處理器時,老師說以后移動設備的CPU基本就是ARM類型的了。老師不曾欺我,早期的Android系統幾乎只支持ARM的CPU架構,不過現在至少支持以下七種不同的CPU架構:ARMv5,ARMv7,x86,MIPS,ARMv8,MIPS64和x86_64。每一種CPU類型都對應一種ABI(Application Binary Interface),“armeabi-v7a”文件夾前面的“armeabi”指的就是ARM這種類型的ABI,后面的“v7a”指的是ARMv7。這7種CPU類型對應的SO庫的文件夾名是:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64。

不同類型的移動設備在運行APP時,需要加載自己支持的類型的SO庫,不然就GG了。通過 Build.SUPPORTED_ABIS 我們可以判斷當前設備支持的ABI,不過一般情況下,不需要開發者自己去判斷ABI,Android系統在安裝APK的時候,不會安裝APK里面全部的SO庫文件,而是會根據當前CPU類型支持的ABI,從APK里面拷貝最合適的SO庫,并保存在APP的內部存儲路徑的 libs 下面。(這里說一般情況,是因為有例外的情況存在,比如我們動態加載外部的SO庫的時候,就需要自己判斷ABI類型了。)

一種CPU架構 = 一種對應的ABI參數 =  一種對應類型的SO庫

到這里,我們發現使用SO庫的邏輯還是比較簡單的,但是Android系統加載SO庫的邏輯還是給我們留下了一些坑。

使用SO庫時要注意的一些問題

1. 別把SO庫放錯地方

SO庫其實都是APP運行時加載的,也就是說APP只有在運行的時候才知道SO庫文件的存在,這就無法通過靜態代碼檢查或者在編譯APP時檢查SO庫文件是否正常。所以,Android開發對SO庫的存放路徑有嚴格的要求。

使用SO庫的時候,除了“armeabi-v7a”等文件夾名需要嚴格按照規定的來自外,SO庫要放在項目的哪個文件夾下也要按照套路來,以下是一些總結:

  • Android Studio 工程放在 jniLibs/xxxabi 目錄中(當然也可以通過在build.gradle文件中的設置jniLibs.srcDir屬性自己指定);
  • Eclipse 工程放在 libs/xxxabi 目錄中(這也是使用ndk-build命令生成SO庫的默認目錄);
  • aar 依賴包中位于 jni/ABI 目錄中(SO庫會自動包含到引用AAR壓縮包到APK中);
  • 最終構建出來的APK文件中,SO庫存在 lib/xxxabi 目錄中(也就是說無論你用什么方式構建,只要保證APK包里SO庫的這個路徑沒錯就沒問題);
  • 通過 PackageManager 安裝后,在小于 Android 5.0 的系統中,SO庫位于 APP 的 nativeLibraryPath 目錄中;在大于等于 Android 5.0 的系統中,SO庫位于 APP 的 nativeLibraryRootDir/CPU_ARCH 目錄中;

既然扯到了這里,順便說一下,我在使用 Android Studio 1.5 構建APK的時候,發現 Gradle 插件只會默認打包application類型的module的jniLibs下面的SO庫文件,而不會打包aar依賴包的SO庫,所以會導致最終構建出來的APK里的SO庫文件缺失。暫時的解決方案是把所有的SO庫都放在application模塊中(這顯然不是很好的解決方案),不知道這是不是Studio的BUG,同事的解決方案是通過修改Gradle插件來增加對aar依賴包的SO庫的打包支持(GitHub有開源的第三方Gradle插件項目,使用Java和Groovy語言開發)。

2. 盡可能提供CPU支持的最優SO庫

當一個應用安裝在設備上,只有該設備支持的CPU架構對應的SO庫會被安裝。但是,有時候,設備支持的SO庫類型不止一種,比如大多的X86設備除了支持X86類型的SO庫,還兼容ARM類型的SO庫(目前應用市場上大部分的APP只適配了ARM類型的SO庫,X86類型的設備如果不能兼容ARM類型的SO庫的話,大概要嗝屁了吧)。

所以如果你的APK只適配了ARM類型的SO庫的話,還是能以兼容的模式在X86類型的設備上運行(比如華碩的平板),但是這不意味著你就不用適配X86類型的SO庫了,因為X86的CPU使用兼容模式運行ARM類型的SO庫會異常卡頓(試著回想幾年前你開始學習Android開發的時候,在PC上使用AVD模擬器的那種感覺)。

3. 注意SO庫的編譯版本

除了要注意使用了正確CPU類型的SO庫,也要注意SO庫的編譯版本的問題。雖然現在的Android Studio支持在項目中直接編譯SO庫,但是更多的時候我們還是選擇使用事先編譯好的SO庫,這時就要注意了,編譯APK的時候,我們總是希望使用最新版本的build-tools來編譯,因為Android SDK最新版本會幫我們做出最優的向下兼容工作。

但是這對于編譯SO庫來說就不一樣了,因為NDK平臺不是向下兼容的,而是向上兼容的。應該使用app的minSdkVersion對應的版本的NDK標本來編譯SO庫文件,如果使用了太高版本的NDK,可能會導致APP性能低下,或者引發一些SO庫相關的運行時異常,比如“UnsatisfiedLinkError”,“dlopen: failed”以及其他類型的Crash。

一般情況下,我們都是使用編譯好的SO庫文件,所以當你引入一個預編譯好的SO庫時,你需要檢查它被編譯所用的平臺版本。

4. 盡可能為每種CPU類型都提供對應的SO庫

比如有時候,因為業務的需求,我們的APP不需要支持AMR64的設備,但這不意味著我們就不用編譯ARM64對應的SO庫。舉個例子,我們的APP只支持armeabi-v7a和x86架構,然后我們的APP使用了一個第三方的Library,而這個Library提供了AMR64等更多類型CPU架構的支持,構建APK的時候,這些ARM64的SO庫依然會被打包進APK里面,也就是說我們自己的SO庫沒有對應的ARM64的SO庫,而第三方的Library卻有。這時候,某些ARM64的設備安裝該APK的時候,發現我們的APK里帶有ARM64的SO庫,會誤以為我們的APP已經做好了AMR64的適配工作,所以只會選擇安裝APK里面ARM64類型的SO庫,這樣會導致我們自己項目的SO庫沒有被正確安裝(雖然armeabi-v7a和x86類型的SO庫確實存在APK包里面)。

這時正確的做法是,給我們自己的SO庫也提供AMR64支持,或者不打包第三方Library項目的ARM64的SO庫。使用第二種方案時,可以把APK里面不需要支持的ABI文件夾給刪除,然后重新打包,而在Android Studio下,則可以通過以下的構建方式指定需要類型的SO庫。

  1. productFlavors { 
  2.     flavor1 { 
  3.         ndk { 
  4.             abiFilters "armeabi-v7a" 
  5.             abiFilters "x86" 
  6.             abiFilters "armeabi" 
  7.         } 
  8.     } 
  9.     flavor2 { 
  10.         ndk { 
  11.             abiFilters "armeabi-v7a" 
  12.             abiFilters "x86" 
  13.             abiFilters "armeabi" 
  14.             abiFilters "arm64-v8a" 
  15.             abiFilters "x86_64" 
  16.         } 
  17.     } 
  18.  

需要說明的是,如果我們的項目是SDK項目,我們最好提供全平臺類型的SO庫支持,因為APP能支持的設備CPU類型的數量,就是項目中所有SO庫支持的最少CPU類型的數量(使用我們SDK的APP能支持的CPU類型只能少于等于我們SDK支持的類型)。

5. 不要通過“減少其他CPU類型支持的SO庫”來減少APK的體積

確實,所有的x86/x86_64/armeabi-v7a/arm64-v8a設備都支持armeabi架構的SO庫,因此似乎移除其他ABIs的SO庫是一個減少APK大小的好辦法。但事實上并不是,這不只影響到函數庫的性能和兼容性。

X86設備能夠很好的運行ARM類型函數庫,但并不保證100%不發生crash,特別是對舊設備,兼容只是一種保底方案。64位設備(arm64-v8a, x86_64, mips64)能夠運行32位的函數庫,但是以32位模式運行,在64位平臺上運行32位版本的ART和Android組件,將丟失專為64位優化過的性能(ART,webview,media等等)。

過減少其他CPU類型支持的SO庫來減少APK的體積不是很明智的做法,如果真的需要通過減少SO庫來做APK瘦身,我們也有其他辦法。

減少SO庫體積的正確姿勢

1. 構建特定ABI支持的APK

我們可以構建一個APK,它支持所有的CPU類型。但是反過來,我們可以為每個CPU類型都單獨構建一個APK,然后不同CPU類型的設備安裝對應的APK即可,當然前提是應用市場得提供用戶設備CPU類型設別的支持,就目前來說,至少PLAY市場是支持的。

Gradle可以通過以下配置生成不同ABI支持的APK(引用自別的文章,沒實際使用過): 

  1. android { 
  2.     ... 
  3.     splits { 
  4.         abi { 
  5.             enable true 
  6.             reset() 
  7.             include 'x86''x86_64''armeabi-v7a''arm64-v8a' //select ABIs to build APKs for 
  8.             universalApk true //generate an additional APK that contains all the ABIs 
  9.         } 
  10.     } 
  11.  
  12.     // map for the version code 
  13.     project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9] 
  14.  
  15.     android.applicationVariants.all { variant -> 
  16.         // assign different version code for each output 
  17.         variant.outputs.each { output -> 
  18.             output.versionCodeOverride = 
  19.                     project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) * 1000000 + android.defaultConfig.versionCode 
  20.         } 
  21.     } 
  22.  }  

2. 從網絡下載當前設備支持的SO庫

說到這里,總算回到動態加載的主題了。⊙﹏⊙

使用Android的動態加載技術,可以加載外部的SO庫,所以我們可以從網絡下載SO庫文件并加載了。我們可以下載所有類型的SO庫文件,然后加載對應類型的SO庫,也可以下載對應類型的SO庫然后加載,不過無論哪種方式,我們最好都在加載SO庫前,對SO庫文件的類型做一下判斷。

我個人的方案是,存儲在服務器的SO庫依然按照APK包的壓縮方式打包,也就是,SO庫存放在APK包的 libs/xxxabi 路徑下面,下載完帶有SO庫的APK包后,我們可以遍歷libs路徑下的所有SO庫,選擇加載對應類型的SO庫。

具體實現代碼看上去像是: 

  1. /** 
  2.  * 將一個SO庫復制到指定路徑,會先檢查改SO庫是否與當前CPU兼容 
  3.  * 
  4.  * @param sourceDir     SO庫所在目錄 
  5.  * @param so            SO庫名字 
  6.  * @param destDir       目標根目錄 
  7.  * @param nativeLibName 目標SO庫目錄名 
  8.  * @return 
  9.  */ 
  10. public static boolean copySoLib(File sourceDir, String so, String destDir, String nativeLibName) throws IOException { 
  11.  
  12.     boolean isSuccess = false
  13.     try { 
  14.         LogUtil.d(TAG, "[copySo] 開始處理so文件"); 
  15.  
  16.         if (Build.VERSION.SDK_INT >= 21) { 
  17.             String[] abis = Build.SUPPORTED_ABIS; 
  18.             if (abis != null) { 
  19.                 for (String abi : abis) { 
  20.                     LogUtil.d(TAG, "[copySo] try supported abi:" + abi); 
  21.                     String name = "lib" + File.separator + abi + File.separator + so; 
  22.                     File sourceFile = new File(sourceDir, name); 
  23.                     if (sourceFile.exists()) { 
  24.                         LogUtil.i(TAG, "[copySo] copy so: " + sourceFile.getAbsolutePath()); 
  25.                         isSuccess = FileUtil.copyFile(sourceFile.getAbsolutePath(), destDir + File.separator + nativeLibName + File.separator + so); 
  26.                         //api21 64位系統的目錄可能有些不同 
  27.                         //copyFile(sourceFile.getAbsolutePath(), destDir + File.separator +  name); 
  28.                         break; 
  29.                     } 
  30.                 } 
  31.             } else { 
  32.                 LogUtil.e(TAG, "[copySo] get abis == null"); 
  33.             } 
  34.         } else { 
  35.             LogUtil.d(TAG, "[copySo] supported api:" + Build.CPU_ABI + " " + Build.CPU_ABI2); 
  36.  
  37.             String name = "lib" + File.separator + Build.CPU_ABI + File.separator + so; 
  38.             File sourceFile = new File(sourceDir, name); 
  39.  
  40.             if (!sourceFile.exists() && Build.CPU_ABI2 != null) { 
  41.                 name = "lib" + File.separator + Build.CPU_ABI2 + File.separator + so; 
  42.                 sourceFile = new File(sourceDir, name); 
  43.  
  44.                 if (!sourceFile.exists()) { 
  45.                     name = "lib" + File.separator + "armeabi" + File.separator + so; 
  46.                     sourceFile = new File(sourceDir, name); 
  47.                 } 
  48.             } 
  49.             if (sourceFile.exists()) { 
  50.                 LogUtil.i(TAG, "[copySo] copy so: " + sourceFile.getAbsolutePath()); 
  51.                 isSuccess = FileUtil.copyFile(sourceFile.getAbsolutePath(), destDir + File.separator + nativeLibName + File.separator + so); 
  52.             } 
  53.         } 
  54.  
  55.         if (!isSuccess) { 
  56.             LogUtil.e(TAG, "[copySo] 安裝 " + so + " 失敗 : NO_MATCHING_ABIS"); 
  57.             throw new IOException("install " + so + " fail : NO_MATCHING_ABIS"); 
  58.         } 
  59.  
  60.     } catch (IOException e) { 
  61.         e.printStackTrace(); 
  62.         throw e; 
  63.     } 
  64.  
  65.     return true
  66.  

總結

  1. 一種CPU架構 = 一種ABI = 一種對應的SO庫;
  2. 加載SO庫時,需要加載對應類型的SO庫;
  3. 盡量提供全平臺CPU類型的SO庫支持;

題外話,SO庫的使用本身就是一種最純粹的動態加載技術,SO庫本身不參與APK的編譯過程,使用JNI調用SO庫里的Native方法的方式看上去也像是一種“硬編程”,Native方法看上去與一般的Java靜態方法沒什么區別,但是它的具體實現卻是可以隨時動態更換的(更換SO庫就好),這也可以用來實現熱修復的方案,與Java方法一旦加載進內存就無法再次更換不同,Native方法不需要重啟APP就可以隨意更換。

出于安全和生態控制的原因,Google Play市場不允許APP有加載外部可執行文件的行為,一旦你的APK里被檢查出有額外的可執行文件時就不好玩了,所以現在許多APP都偷偷把用于動態加載的可執行文件的后綴名換成“.so”,這樣被發現的幾率就降低了,因為加載SO庫看上去就是官方合法版本的動態加載啊(不然SO庫怎么工作),雖然這么做看起來有點掩耳盜鈴。 

責任編輯:龐桂玉 來源: Android開發中文站
相關推薦

2012-04-25 22:45:46

2009-06-30 14:23:02

ORACLE數據庫JSP

2016-10-18 22:10:02

HTTP推送HTML

2011-03-08 14:28:03

proftpdGentoo

2009-06-12 10:25:42

Webservices

2018-06-12 15:39:41

容器部署云平臺

2022-01-16 08:04:44

集群部署canal

2010-06-29 16:56:49

SQL Server數

2011-11-01 09:29:08

Android 4.0

2009-06-10 21:46:02

JavaScript與

2012-12-19 11:40:13

思科路由器

2010-09-17 15:41:46

網絡協議分析軟件

2010-05-04 15:59:05

Oracle字符集

2009-08-06 16:01:30

C#接口成員

2012-07-04 14:40:37

Ajax

2020-07-29 08:03:26

Celery異步項目

2023-03-06 08:34:39

FURPS模型數據庫

2010-08-25 14:32:49

DB2數據庫遷移

2012-12-19 11:36:03

路由器MP

2011-01-26 16:24:53

Sun甲骨文
點贊
收藏

51CTO技術棧公眾號

亚洲影影院av| 在线观看欧美视频| 国产自产在线视频| 高清一区二区三区四区| 亚洲欧美久久| 色99之美女主播在线视频| 日本网站在线看| 国产丝袜在线播放| 国产亚洲欧美色| 91免费综合在线| 国产特黄大片aaaa毛片| 欧洲杯半决赛直播| 日韩欧美高清dvd碟片| 18岁网站在线观看| 91精选在线| 久久久综合网站| 91在线视频成人| 伊人中文字幕在线观看| 中文精品久久| 亚洲性视频网站| 九色91porny| 三级成人在线| 亚洲一区二区三区免费视频| 欧美午夜精品久久久久久蜜| 精品久久久免费视频| 久久天堂成人| 午夜伦理精品一区| 丝袜 亚洲 另类 欧美 重口| 久久最新网址| 亚洲国产精品va在线看黑人 | 成人一区二区电影| 中文字幕精品无码一区二区| 一区二区三区网站| 中文字幕久久亚洲| 人人妻人人澡人人爽人人精品| 精品一区二区三区中文字幕在线| 日本黄色一区二区| 欧美三级一级片| 女同视频在线观看| 亚洲人吸女人奶水| 亚洲一区二区三区加勒比| 欧美成人免费| 91在线国产福利| 高清不卡日本v二区在线| 国产精品久久久久久久久毛片 | 国产精品美女久久久久久久网站| 精品日本一区二区| 乱精品一区字幕二区| 国产精品一级片| 91在线视频成人| 97av免费视频| 久久精品理论片| 国产精品久久久久久搜索| 视频一区二区三区四区五区| 亚洲作爱视频| 欧美在线免费视频| 神马久久久久久久 | 亚洲婷婷在线视频| 一区二区三区的久久的视频| 亚洲s色大片| 国产精品看片你懂得| 亚洲欧美在线网| 在线观看免费黄视频| 国产精品乱码一区二区三区软件| 伊人久久av导航| 成人在线网址| 亚洲国产一区二区三区青草影视| 日本一本中文字幕| 极品av在线| 一本高清dvd不卡在线观看| 日韩手机在线观看视频| 超碰这里只有精品| 91精品国产综合久久精品 | 久久免费福利| 精品国产不卡一区二区三区| 99精品一区二区三区无码吞精| 国产精品极品| 亚洲欧美中文日韩v在线观看| 免费网站在线高清观看| 99re6这里只有精品| 欧美成人精品激情在线观看| 日本视频www| 日韩制服丝袜先锋影音| 成人www视频在线观看| 国产黄色片免费| 91热门视频在线观看| 日韩免费毛片| a篇片在线观看网站| 五月婷婷色综合| 九九热免费精品视频| 精品国产第一国产综合精品| 亚洲精品国产电影| 精品一区二区6| 影音先锋久久资源网| 国产精品7m视频| www.日本在线观看| 26uuu亚洲| 黄色www在线观看| 热三久草你在线| 欧美人与禽zozo性伦| 天天躁日日躁狠狠躁av麻豆男男| 国语产色综合| 欧美激情在线观看视频| 亚洲精品国产欧美在线观看| 国产不卡视频一区| 日韩啊v在线| av有码在线观看| 欧美吞精做爰啪啪高潮| 插我舔内射18免费视频| 999国产精品视频| 欧美一区二粉嫩精品国产一线天| 国产精品嫩草影院精东| 91浏览器在线视频| 免费看日b视频| 黄色成人小视频| 日韩成人中文字幕| 国产这里有精品| 日av在线不卡| 精品一区久久久久久| 91在线中文| 欧美日韩国产三级| 9.1成人看片免费版| 黄色国产精品| 91青草视频久久| www.亚洲资源| 色久优优欧美色久优优| 中文字幕在线播放一区| 欧美黄在线观看| 成人黄色免费网站在线观看| 青青草免费观看免费视频在线| 一区二区三区精品久久久| 少妇一级淫免费放| 国产欧美久久一区二区三区| 91精品国产91久久久| 亚洲AV无码国产精品午夜字幕| 国产精品久久久久精k8| 爱情岛论坛亚洲首页入口章节| 日韩高清一级| 97视频色精品| 视频一区二区免费| 午夜视频在线观看一区| 色综合久久久无码中文字幕波多| 性欧美欧美巨大69| 国产日韩精品电影| avav免费在线观看| 欧美日韩亚洲综合一区| 日本乱子伦xxxx| 日韩中文欧美在线| 五月天色一区| 久久精品嫩草影院| 色综久久综合桃花网| 亚洲天堂网在线观看视频| 国产精品午夜久久| 国产精品久久久毛片| 日韩av久操| 国产精品自产拍高潮在线观看| 国产精品麻豆一区二区三区| 在线观看视频一区| 四季av中文字幕| 久久99国内精品| 日本成人性视频| 欧一区二区三区| 欧美精品999| 四虎免费在线观看| 一本到高清视频免费精品| av永久免费观看| 韩国三级中文字幕hd久久精品| 97超碰免费观看| 91欧美日韩在线| 91高清视频免费观看| 免费理论片在线观看播放老| 欧美亚洲精品一区| 亚洲最大的黄色网址| 成人小视频免费观看| 日日碰狠狠添天天爽超碰97| 欧美精品一区二区久久| 国产视频观看一区| 成人免费一区二区三区牛牛| 日韩精品在线电影| 中文字幕+乱码+中文| 亚洲色图丝袜美腿| 强迫凌虐淫辱の牝奴在线观看| 久久一二三四| 日韩不卡一二区| 噜噜噜天天躁狠狠躁夜夜精品| 国产精品999999| 操你啦视频在线| 亚洲精品v欧美精品v日韩精品| 久久精品五月天| 一区二区三区不卡视频| 法国空姐电影在线观看| 国产一区二区免费视频| 北条麻妃69av| 在线精品小视频| 久久精品国产一区二区三区日韩| av免费在线一区| 久久人人看视频| 久久这里只有精品免费| 大胸美女被爆操| 国产精品7777| 日本在线一二三| 成人动态视频| 在线国产精品播放| 亚洲av永久纯肉无码精品动漫| 精品国产电影一区| 亚洲AV成人无码网站天堂久久| 成人免费高清在线| 免费精品99久久国产综合精品应用| 国产精品v欧美精品v日本精品动漫| 欧美日韩亚洲综合| 久久精品综合视频| 国内成人免费视频| aⅴ在线免费观看| 欧美午夜不卡影院在线观看完整版免费 | 国内精品卡一卡二卡三| 成人一级片在线观看| 午夜精品久久久久久久99热影院| 一区二区日韩免费看| 黄色成人在线免费观看| 成人在线国产| 久久久久久久久久久一区| 精品国产18久久久久久二百| 国产精品入口尤物| 97se综合| 91精品国产免费久久久久久 | 91精品国产色综合| 在线观看小视频| 久久久国产精品一区| 国产高清在线看| 国产午夜精品理论片a级探花| 黄色福利在线观看| 欧美一级黄色片| 97精品人妻一区二区三区在线| 91成人看片片| 国产性生活视频| 欧美性极品xxxx娇小| 六月丁香在线视频| 偷窥国产亚洲免费视频| 国产一级淫片免费| 亚洲国产日韩a在线播放| 久热这里有精品| 亚洲欧美国产毛片在线| 欧美爱爱免费视频| 日韩毛片一二三区| 神马久久精品综合| 亚洲欧美激情小说另类| 91香蕉视频在线播放| 国产在线国偷精品免费看| 欧美网站在线观看| 国产人妻黑人一区二区三区| 国产精品1024| 成人做爰69片免费| 成人免费毛片高清视频| 黄色在线免费播放| 91视频一区二区| 最新中文字幕视频| 久久久影视传媒| 亚洲午夜精品久久久久久高潮| 中文字幕免费不卡在线| 性生交大片免费全黄| 亚洲制服丝袜一区| 国产精品黄色网| 色噜噜狠狠一区二区三区果冻| 久久久久精彩视频| 51精品国自产在线| www.日日夜夜| 亚洲剧情一区二区| 在线免费黄色| 久久91精品国产91久久久| 欧美性video| 97精品在线观看| 日韩在线免费| 成人免费xxxxx在线观看| 国产精品久久久久久久久久久久久久久 | www视频在线观看| 欧美在线观看网址综合| 国产一区二区色噜噜| 成人精品水蜜桃| 日韩动漫一区| 中国成人在线视频| 在线日韩av| 性欧美极品xxxx欧美一区二区| 久久99精品国产麻豆婷婷| 中文字幕第3页| 国产日产欧产精品推荐色| 国产一区二区三区在线视频观看| 亚洲国产成人精品视频| 精品一区二三区| 日韩美女在线视频| 国产主播福利在线| 久久国产精品首页| 欧美电影免费观看| 亚洲影院色无极综合| 免费观看不卡av| 日本a级片在线观看| 蘑菇福利视频一区播放| 天美一区二区三区| 久久午夜羞羞影院免费观看| 手机在线中文字幕| 欧美日韩亚洲精品内裤| 国产毛片在线视频| 亚洲欧美一区二区三区情侣bbw | 国产麻豆一精品一男同| 日韩精品中文字幕在线观看| 久久精品视频免费看| 2019最新中文字幕| 日韩中文字幕无砖| 相泽南亚洲一区二区在线播放| 伊人成人在线视频| 天堂av2020| 久久伊99综合婷婷久久伊| 久草视频免费在线| 欧美日韩久久一区| 免费人成在线观看网站| 午夜精品久久久久久久99热| 亚洲天堂网站| 日韩视频精品| 国产欧美日本| 亚洲最大视频网| 亚洲人午夜精品天堂一二香蕉| 中国a一片一级一片| 亚洲美女av黄| 国产在线精彩视频| 99久久伊人精品影院| 999久久久亚洲| 成年网站在线播放| 国产日韩欧美制服另类| 免费观看成人毛片| 亚洲国产另类久久精品| 国产高清在线a视频大全| 91在线观看免费观看 | 日韩中文一区二区| 法国空姐在线观看免费| 久久精品国产99久久6| 在线观看免费小视频| 色成人在线视频| 国产特黄在线| 国产精品2018| 精品一区二区三区中文字幕老牛| 国产最新免费视频| 97精品电影院| 免费黄色网址在线| 亚洲人成77777在线观看网| 成人性生活视频| 日本午夜一区二区三区| 日日摸夜夜添夜夜添亚洲女人| 免费看污黄网站在线观看| 色综合久久久久综合99| 欧洲免费在线视频| 日本一本a高清免费不卡| 中国av一区| 91av俱乐部| 欧美经典三级视频一区二区三区| 中文字幕人妻丝袜乱一区三区 | 先锋影音在线资源站91| 91嫩草视频在线观看| 亚洲特级毛片| 亚洲国产综合视频| 欧美特黄级在线| 成a人片在线观看www视频| 国产精品自在线| 中文字幕亚洲综合久久五月天色无吗'' | 中文字幕在线亚洲三区| 国产精品一区二区视频| 久一区二区三区| 精品视频—区二区三区免费| 黄色综合网址| 亚洲精品欧洲精品| 国产一区二区免费在线| 日韩精品视频播放| 亚洲人成电影网站色…| 日韩黄色三级| 欧美日韩福利在线| 久久综合狠狠综合久久综合88 | 国产黄大片在线观看| 明星裸体视频一区二区| 精品一区二区三区香蕉蜜桃| 久久中文字幕无码| 国产一区二区三区免费视频| 在线观看亚洲精品福利片| 久久99久久99精品| 久久久不卡网国产精品一区| 亚洲自拍偷拍另类| 久久久人成影片一区二区三区观看 | 日韩精品久久一区二区三区| 久久9热精品视频| 久久精品人妻一区二区三区| 亚洲日本中文字幕| 国产专区精品| 久久综合久久色| 亚洲精品视频自拍| 黄色av网站在线| 97se亚洲综合在线| 日韩国产欧美三级| 久久久久久免费观看| 中文字幕v亚洲ⅴv天堂| 国产成人一二| 超碰成人在线播放| 精品久久久久久久大神国产| 免费a级毛片在线播放|