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

極致優化 Android 平臺 APK 的大小

移動開發 Android
本篇文章會以Android為例,從各個方面介紹UE包中的可裁剪部分的優化思路與實踐,同時優化APK大小和Native庫的運行時內存占用,其中的策略也可以復用在其他平臺。

作者 | lipeng

在游戲項目中,當我們在打包各個平臺時,總希望每個平臺的包能夠最小化便于分發,而且上架某些平臺還有明確的大小要求。對于UE而言,它包含了巨量代碼以及大量的插件,Build階段還將生成反射的膠水代碼,在編譯時產生了大量的代碼段。以Android平臺為例,將導致libUE4.so的大小急劇增長,對于包體和運行時內存都造成了壓力。再加上一些引擎必要和額外帶入的資源也能占據上百M,空APK的大小很容易達到數百M的規模!不僅僅為了符合上架平臺的要求,從包體和內存優化的角度,也有必要對UE包的大小進行裁剪。

一、包大小分布

在APK內,游戲相關的空間占比較大的部分,為下面幾項:

  • 可執行代碼(so - lib/arm64-v8a)
  • main.obb.png(游戲內資源Pak、DirectoriesToAlwaysStageAsNonUFS的部分)
  • 第三方組件拷貝進APK內的文件

需要分別針對上面列出的三種情況,分別制定具體的優化策略。

二、壓縮NativeLibs

當APK安裝時,對于NativeLibs有兩種處理方式:

  • 安裝時解壓so到應用的內部存儲目錄( /data/app/<package_name>/lib/)
  • 直接從APK文件中加載so,可以加快安裝過程

而它就引出了一個問題:如果允許安裝時解壓,則NativeLibs打包進APK內是可以被執行壓縮的。 對比一下實際的壓縮與否的大小情況,對APK大小的影響非常大:

壓縮

不壓縮

對于原生Android而言,是否在安裝時解壓NativeLibs是由AndroidManifest.xml中的extractNativeLibs控制的:

<application android:allowBackup="true" android:appComponentFactory="android.support.v4.app.CoreComponentFactory" android:debuggable="true" android:extractNativeLibs="false" android:hardwareAccelerated="true" android:hasCode="true" android:icon="@drawable/icon" android:label="@string/app_name" android:name="com.epicgames.ue4.GameApplication" android:networkSecurityConfig="@xml/network_security_config" android:supportsRtl="true">

在新版引擎中,在AndroidRuntimeSettings配置中直接提供了bExtractNativeLibs的選項:

bool bExtractNativeLibs = true;
Ini.GetBool("/Script/AndroidRuntimeSettings.AndroidRuntimeSettings", "bExtractNativeLibs", out bExtractNativeLibs);

需要注意的是,如果是舊版本引擎(4.27及之前),升級了grable升級后(>4.2)后,gradle用useLegacyPackaging取代extractNativeLibs,Manifest里的extractNativeLibs默認是false的,所以會導致APK增大。

解決辦法是可以在UPL中強制把值改了:

<addAttribute tag="application" name="android:extractNativeLibs" value="true"/>

注意:它只是控制讓so打進APK時是否執行壓縮,并不會實際減少so的大??!對于可執行程序的優化,需要繼續下面的代碼優化的部分。

三、代碼體積優化

關于代碼體積優化的部分,在Android平臺,核心目標是要減少單個so的大?。〔⑶冶M可能地避免對運行時性能的影響。

對NativeLibs大小優化思路:

  • 減少動態鏈接庫的數量,剔除不必要的
  • 減少庫內部的符號、減少代碼段大小
  • 剔除調試信息

對于所有的so,都可以在編譯/鏈接時應用這些優化策略。 但對于UE項目而言,我們能控制的通常也只有引擎和項目的代碼,庫的代碼需要庫的提供者優化。所以接下來的優化策略,只針對于libUE4.so/libUnreal.so。

1. 減小libUE4.so

在打包時,因為需要執行完整的編譯,并且UE在運行時默認是Monolithic的模式,所有的代碼都被編譯到了同一個可執行文件中。

UE基于UBT的編譯過程封裝,以及提供target.cs/build.cs中的配置參數,使我們能夠在一定程度上對引擎和項目代碼進行編譯控制,達到我們優化so大小的目的。

對于UE項目而言,優化so的大小有以下幾種思路:

  • 禁用不必要模塊
  • 控制代碼優化(控制inline/O3/0z)
  • 禁用Module不必要異常處理
  • 啟用LTO
  • 剔除不需要的導出符號

(1) 禁用模塊

可以把引擎中內置的明確不需要使用的模塊在target.cs中關閉:

// disable modules  
bUseChaos = false;  
bCompileChaos = false;  
bCompileAPEX = false;

同時,需要梳理項目中引入的不必要的運行時插件,減少參與編譯的Module的數量,從而減少實際參與編譯的代碼。

(2) 關閉inline

inline是編譯階段對運行時的執行效率優化,將函數調用直接替換為函數代碼,而不是常規的函數調用??梢詼p少函數調用的開銷,理論上來說可以提高程序的執行效率。

但inline會增大.text段的大小,可以酌情關閉。

  • 修改target.cs:bUseInlining = false;(僅在IOS/Linux/Mac/Win有效)
  • 修改UBT,在Android編譯時受bUseInlining控制,添加-fno-inline-functions編譯參數
if (TargetInfo.Platform == UnrealTargetPlatform.Android)
{
 if (bUseInlining)
 {
  AdditionalCompilerArguments += " -finline-functions";
 }else {
  AdditionalCompilerArguments += " -fno-inline-functions";
 }
}

注意:關閉inline后,如果某些函數具有高頻調用,會帶來一些性能損失;在非高頻情況下,inline與否的性能,這個需要結合項目的實際性能情況進行控制。在我的測試結果中,是否inline對幀率影響微乎其微。

(3) 關閉異常處理

有些模塊中打開了C++異常處理,但是沒有try/catch的使用:

bEnableExceptions = false;

可以關掉,能夠減少so內的.eh_frame的大小。

(4) 使用O3/Oz編譯

在target.cs中控制bCompileForSize的值,可以選擇使用O3或Oz編譯代碼:

// optimization level
if (!CompileEnvironment.bOptimizeCode){
 Result += " -O0";
}else{
 if (CompileEnvironment.bOptimizeForSize){
  Result += " -Oz";
 }else{
  Result += " -O3";
 }
}

O3和Oz的區別:

  • -O3:性能優先,積極內聯、循環展開
  • -Oz:體積優先,避免內聯、保持循環

可以根據項目實際的性能情況,選擇使用哪種方式。

(5) 啟用LTO

LTO是Link Time Optimization的簡稱,可以在鏈接時剔除死代碼、優化跨模塊的函數調用、內聯等。 在引擎的build.cs中可以bAllowLTCG打開,LTCG是LTO的一種實現,但是它也只僅在IOS/Linux/Mac/Win有效(UE4.25)。

支持Android的話,同樣也要修改UBT(AndroidToolChain.cs),給Android添加受bAllowLTCG參數控制,選擇是否添加-flto=thin的編譯參數,thin是縮減大小與優化耗時的綜合版本。

bAllowLTCG = true; // LTO
if (bAllowLTCG)
{
 AdditionalCompilerArguments += "  -flto=thin";
}

(6) 剔除導出符號

在編譯so時,除非特殊設置,所有的函數和變量都會被導出,用于被其他的so訪問。 但在UE引擎內,只有極少數的接口,是明確被外部訪問的(JNI相關的接口),所以libUE4.so的符號導出絕大部分是浪費的,剔除掉符號導出可以大幅降低so的大小和內存占用!

現代編譯器提供了version-script的鏈接時控制機制,可以通過傳入一個ldscript文件來控制鏈接時的符號行為。

需要在編譯過程中先構造出一個ldscript文件,填入符號導出控制代碼,然后在target.cs中,傳遞給Linker:

string VersionScriptFile = GetVersionScriptFilename();
using (StreamWriter Writer = File.CreateText(VersionScriptFile))
{
 Writer.WriteLine("{ global: Java_*; ANativeActivity_onCreate; JNI_OnLoad; local: *; };");
}
AdditionalLinkerArguments += " -Wl,--version-script=\"" + VersionScriptFile + "\"";

對于UE而言,需要允許導出的只有Java_*/ANativeActivity_onCreate/JNI_OnLoad這三類匹配符號,,其余的均可剔除。

2. 優化數據

經過上面介紹的一系列對代碼體積的優化,收益明顯。

(1) so壓縮后大小

前面提到了,NativeLibs進APK是可以被壓縮的,所以當我們減少了so的原始大小,也能夠減少壓縮后的大小。

經過上面的優化之后,在Shipping的模式下,so的原始大小從原來的258M減少到了146M! so的壓縮后大小,從74.3M減少到了44.67M,減少了29.63M!可執行程序文件顯著減小。

readelf優化前后對比(部分數據):

(2) 內存收益

對so大小的優化,同時減少了加載so的內存,也能夠獲得額外的內存收益。

安卓可以通過dumpsys meminfo來查看整個包的so占用內存情況,包含了所有已加載的so,但可以通過優化前后的差值得到實際的內存收益。

優化前:

127|PD2324:/ $ dumpsys meminfo com.xxx.yyy
dumpsys meminfo com.xxx.yyy
Applications Memory Usage (in Kilobytes):
Uptime: 501711593 Realtime: 544369467

** MEMINFO in pid 23677 [com.xxx.yyy] **
                   Pss  Private  Private  SwapPss      Rss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty    Total     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------   ------
     .so mmap   178165    14024   159220        5   245292

優化后:

** MEMINFO in pid 31482 [com.xxx.yyy] **
                   Pss  Private  Private  SwapPss      Rss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty    Total     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------   ------
     .so mmap   144041    13208   125644        5   209284

arm64-v8a Shipping

優化前

優化后

減少

libUE4.so大小

246

145

101

meminfo(so總內存)

178.165

140.04

38.125

3. 優化策略補充

(1) 重定位表壓縮

① SDK 28

在Android的MinSDKVersion大于等于28時(Android9),可以在編譯和鏈接時開啟RELR重定位表壓縮。利用相對地址重定位的特點,對重定位信息進行高效編碼,從而減少存儲空間占用。

開啟方法,需要在編譯階段給Compiler和Linker傳遞參數:

AdditionalCompilerArguments += " -fPIC";  
AdditionalLinkerArguments += " -Wl,--pack-dyn-relocs=android+relr,--use-android-relr-tags";

-Wl,--pack-dyn-relocs=android+relr,--use-android-relr-tags 是 Android 特有的鏈接器選項,它們是對標準 -Wl,-z,relro 和 -Wl,-z,now 的補充和優化,特別是針對 Android 系統中動態鏈接和重定位的處理。 它們主要用于進一步減小二進制文件大小和改善加載時間。

驗證是否生效,可以使用readelf -d libUE4.so,查看是否存在RELR字段:

優化前重定位表的大小(25.82M):

8 .rela.dyn     0189c708  000000000000c720  000000000000c720  0000c720  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 .rela.plt     00004338  00000000018a8e28  00000000018a8e28  018a8e28  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA

優化后重定位表的大小(280K):

8 .rela.dyn     00013852  000000000000c6d8  000000000000c6d8  0000c6d8  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 .relr.dyn     0002cca8  000000000001ff30  000000000001ff30  0001ff30  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 10 .rela.plt     00004320  000000000004cbd8  000000000004cbd8  0004cbd8  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA

優化后的重定位表大小從25.82M降低到280K,結果直接體現在so的大小減少了25M,使APK的大小也減少了4M左右,優化效果極為明顯。

并且,它對內存的優化效果也非常顯著:在Development下從190.49M - > 161.06M,減少了29.43M。

優化前(Development:190.49MB):

** MEMINFO in pid 16293 [com.xxx.yyy] **
                   Pss  Private  Private  SwapPss      Rss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty    Total     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------   ------
     .so mmap   190490    49692   136896        9   255392

優化后(Development:161.06MB):

** MEMINFO in pid 16294 [com.xxx.yyy] **
                   Pss  Private  Private  SwapPss      Rss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty    Total     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------   ------
     .so mmap   161066    13740   142832        9   227500

它對運行時性能是正面優化而不是降低,因為它通過減少運行時重定位的數量來提高代碼加載速度和降低內存占用。

② SDK 23

如果項目對SDK版本有要求,不能升級到28,也可以用另一種替代壓縮參數,要求SDK版本>=23。

AdditionalCompilerArguments += " -fPIC"; 
AdditionalLinkerArguments += " -Wl,--pack-dyn-relocs=android";

它也能夠大幅壓縮重定位表的大?。m然不如RELE到幾百K的級別),并且也能大幅降低so的內存占用:

壓縮后(Development:3.41M):

[ 8] .rela.dyn         LOOS+0x2         000000000000aca0  0000aca0
       000000000033d20e  0000000000000001   A       3     0     8
  [ 9] .rela.plt         RELA             0000000000347eb0  00347eb0
       0000000000004320  0000000000000018   A       3    21     8

運行時的內存情況(Development:163.19M),相較于原始190.49M,也降低了27.3M,比RELR略低:

** MEMINFO in pid 11492 [com.tencent.tmgp.fmgame] **
                   Pss  Private  Private  SwapPss      Rss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty    Total     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------   ------
     .so mmap   163196    14104   145228        5   228248

③ Shipping內存

當啟用重定位表壓縮后,Shipping包的總so運行時內存降低到了134.74M!

** MEMINFO in pid 13929 [com.xxx.yyy] **
                   Pss  Private  Private  SwapPss      Rss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty    Total     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------   ------
     .so mmap   134743    12968   118532        5   198692

四、資源裁剪

1. APK內文件

有一些第三方的插件,會往APK內拷貝文件,這也是可以優化的部分。

需要分析項目的實際使用情況處理:

  • 剔除不必要的第三方組件
  • 對于必須的組件,剔除不需要的文件

(1) 組件裁剪:以GVoice為例

如果項目集成了GCloud的組件,其中會拷貝至APK文件的組件中,GCloudVoice的模型文件占大頭。

在APK內assets/GCloudVoice目錄壓縮后占了約13.5M:

  • wave_dafx_data.bin 是3d語音 不用3d功能可以移除
  • wave_3d_data.bin 是3d語音 不用3d功能可以移除
  • cldnn_spkvector.mnn 提取聲紋的,默認不使用這個功能,可以移除
  • libwxvoiceembed.bin 是文明語音的 不用文明語音可以移除
  • libgvoicensmodel.bin 是噪聲抑制算法模型,不能刪
  • decoder_v4_small.nn、encoder_v4_small.nn aicodec用的 不用aicodec的話可以刪除
  • dse_v1.nn、dse_v1_align.nn、dse_v1_mono.nn 這個是用于wwise下的新算法資源文件,如果有打包的大小限制,也可以去掉

可以把項目中未用到功能的模型文件剔除。另外從實現上,最好不要直接刪除文件,而是修改GVoice_APL.xml的拷貝邏輯實現:

<resourceCopies>
    <log text="Start copy res..." />
      <!--
        author: lipengzha
        desc: 只拷貝GVoice的libgvoicensmodel.bin/config.json,其余文件游戲內無作用
        原始拷貝代碼:
          <copyDir src="$S(PluginDir)/../GVoiceLib/Android/assets/" dst="$S(BuildDir)/assets"/>
      -->
    <copyFile src="$S(PluginDir)/../GVoiceLib/Android/assets/libgvoicensmodel.bin" dst="$S(BuildDir)/assets/libgvoicensmodel.bin" force="true"/>
    <copyFile src="$S(PluginDir)/../GVoiceLib/Android/assets/config.json" dst="$S(BuildDir)/assets/config.json" force="true"/>
</resourceCopies>

(2) 游戲內資源

游戲內的資源就是UE引擎或組件依賴的資源/文件,會打包至PAK或拷貝至main.obb內的文件。

  • PAK內:游戲內的資產,需要梳理哪些是非必要的,哪些是可以剔除或進行延遲加載的。
  • DirectoriesToAlwaysStageAsNonUFS:不進PAK,但是會打包進main.obb里的

(3) PAK內資源

更準確地描述是:安裝包內PAK的資源。

引擎必要的資源都在pakchunk0中,除了pakchunk0外,UE可以把利用PrimaryAssetLabel拆分的Chunk打包至安裝包外。

但對于pakchunk0中的資源或文件,依然要進行優化:

  • 僅保留引擎必要的資源(/Engine中的關鍵資產、ini、GlobalShader、項目ShaderLibrary、啟動地圖、GameFramework資產,等等),在我之前的文章(UE資源管理:引擎打包資源分析)有更詳細的介紹。
  • 剔除非啟動階段必須的資源
  • 改造引擎延遲加載部分文件(如L10N本地化語言的加載)
  • 拆分啟動階段與游戲內資源(如字體),游戲內字體單獨打包且走動態下載

引擎本身的拆包邏輯也有較大的局限性,比如ShdaerLibrary之類的,默認整個項目生成一個,當規模龐大后,它也將成為優化包大小的瓶頸。這部分內容的詳情可以查看我之前的另一篇文章(資源管理:重塑UE的包拆分方案)。

除此之外,還需要在資源管理和打包階段,能夠將Android的所有資源從安裝包內剔除,轉為動態下載/掛載的機制,并且不能夠影響IOS。 當使用諸如PrimaryAssetLabel拆分pak時,引擎為Android提供了內置的把Pak從安裝包內剔除的方法:

; Config/DefaultEngine.ini
[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]
+ObbFilters=-*.pak
+ObbFilters=pakchunk0-*

但官方僅在Android平臺有支持,對于其他平臺就沒那么方便了。在之前的文章中曾介紹過,我開發的HotChunker擴展可以很容易地實現通用的包過濾方案,為全平臺支持自定義的進包控制策略。

(4) StageAsNonUFS

在引擎的打包配置中,有一項DirectoriesToAlwaysStageAsNonUFS,它是指定目錄不打包進PAK,但是會打包進main.obb里的,目前引擎內只有Content/Movies目錄會被拷貝至main.obb中。

而在打包時的讀取的Ini,也是具有層級邏輯的,所以對于打包時的配置,依然能夠對不同平臺進行區分!如果想要在Android/IOS進行區分,也可以利用這個機制做到。

可以把打包策略做如下調整:除非必要的視頻(如啟動時立即播放的),可以把其余的游戲內MP4單獨打包時PAK中,轉為動態下載。

這樣可以大幅減少APK內MP4的大小,也能夠使MP4進行熱更。

五、優化效果

綜合上面多種對包大小優化手段后,順利將游戲的APK大小1.23G降低到130M,原始so大小從258M降低到了132M。

運行時內存也降低了數十M!并且包含了完整的第三方組件、游戲功能,資源可走動態下載,使安裝包本體變成一個極小化的下載器,便于傳播和分發。

實際采用哪些優化策略要結合實際項目的具體需要,以及對包體大小和性能的平衡來選擇,如inline控制和編譯優化級別、資源的極致化裁剪(L10N等)還需要對引擎進行改造等。

責任編輯:趙寧寧 來源: 騰訊技術工程
相關推薦

2019-07-25 13:22:43

AndroidAPK文件優化

2018-11-30 10:40:15

Android壓縮包大小

2023-01-03 09:33:56

2022-03-11 10:23:02

React性能優化

2020-02-19 14:37:11

hashtagRediskey

2013-07-24 16:08:01

Android模擬器Genymotion

2019-07-23 09:20:15

Kafka批量處理客戶端

2022-05-07 15:51:47

Android資源文件文件名

2023-12-15 17:09:28

.NET8Primitives性能

2020-01-15 11:30:59

編碼優化性能

2010-10-12 16:46:18

交換

2011-11-08 16:31:10

Java

2021-02-05 15:35:21

Redis數據庫命令

2021-09-18 10:07:23

開發技能代碼

2017-03-02 15:09:29

AndroidAPK瘦身實踐

2025-04-10 15:53:32

2021-02-02 10:22:48

Web應用程序架構

2013-05-14 10:39:27

AIR Android打包APK文件

2010-02-04 13:52:30

Android ap
點贊
收藏

51CTO技術棧公眾號

亚洲欧美在线aaa| 美女的奶胸大爽爽大片| 亚洲精品久久久久avwww潮水| 欧美久久99| 亚洲精品电影网| 向日葵污视频在线观看| 羞羞污视频在线观看| 成人精品在线视频观看| 人体精品一二三区| 亚洲色图27p| 精品国产午夜肉伦伦影院| 色美美综合视频| 特级西西人体www高清大胆| 香蕉视频国产在线| 国产乱子伦一区二区三区国色天香| 久久免费国产视频| 亚洲a∨无码无在线观看| 日韩区欧美区| 欧美视频一区在线| 5月婷婷6月丁香| а√中文在线8| 久久久国产综合精品女国产盗摄| 亚洲专区国产精品| 狠狠躁夜夜躁人人爽视频| 国产精品99免费看| 色偷偷av一区二区三区| 国产乱了高清露脸对白| 久久久国产精华液999999| 国产一区二区视频免费| 欧美日韩99| 综合久久五月天| 色呦呦一区二区| 亚洲精品观看| 欧美精品日韩一本| 少妇性l交大片| 51漫画成人app入口| 亚洲欧美怡红院| 欧洲精品国产| 午夜影院免费视频| 床上的激情91.| 亚洲伊人一本大道中文字幕| 亚洲精品国产欧美在线观看| 欧美偷拍自拍| 亚洲欧洲成视频免费观看| 国产精品91av| 天堂va在线高清一区| 欧美日韩亚洲综合在线| 欧美黄色一级片视频| 1区2区在线| 亚洲大片免费看| 国产欧美久久久久| 午夜影院免费在线| 亚洲视频免费在线| 国产又爽又黄ai换脸| 午夜免费福利在线观看| 中文字幕电影一区| 亚洲欧美丝袜| 日本欧美在线视频免费观看| 国产精品毛片高清在线完整版| 日韩av影视| 成人av一区| 国产精品天美传媒| 一区二区不卡在线视频 午夜欧美不卡' | 韩国三级在线看| 日本一区二区三区视频在线看 | 热门国产精品亚洲第一区在线| 国产成人一区二区三区影院在线| 三级性生活视频| 亚洲人体在线| 91精品国产一区二区人妖| www.久久久久久久久久久| 天天综合91| 欧美一区二区精品在线| 性xxxxxxxxx| 好吊妞国产欧美日韩免费观看网站| 亚洲精品在线免费观看视频| 亚洲国产精品无码久久久久高潮 | 男女男精品网站| 国产精品一区二区三| 国产又大又粗又长| 国产91丝袜在线播放0| 国模精品娜娜一二三区| 男操女在线观看| 中文字幕一区二区三区蜜月| 亚洲 欧美 综合 另类 中字| 韩日成人影院| 欧美日韩国产大片| 性感美女一区二区三区| 亚洲成aⅴ人片久久青草影院| 在线亚洲欧美视频| 亚洲国产精品免费在线观看| 国产日韩一区二区三区在线播放| 国产精品久在线观看| 亚洲av少妇一区二区在线观看| 99久久精品国产一区二区三区| 日韩精品福利视频| 欧美1—12sexvideos| 欧美性猛交99久久久久99按摩| 亚洲视频在线观看一区二区三区| 久久天堂久久| 国产手机视频精品| 欧美黄色aaa| 国产精品日韩精品欧美精品| 91社区国产高清| 色视频在线观看福利| 亚洲欧洲av一区二区三区久久| 国产精品网站免费| 亚洲美女色播| 亚洲毛片在线免费观看| 日本青青草视频| 视频在线在亚洲| 国产91色在线|亚洲| av成人手机在线| 香蕉成人伊视频在线观看| 日韩爱爱小视频| 国产精品jk白丝蜜臀av小说| 色妞一区二区三区| 亚洲 欧美 日韩 综合| 国产资源精品在线观看| 人偷久久久久久久偷女厕| 第一av在线| 欧美电影一区二区三区| 黄色片网站免费| 亚洲精品偷拍| 99中文字幕| 免费大片黄在线观看视频网站| 日本韩国欧美在线| 色哟哟无码精品一区二区三区| 国产精品久久久久久久免费观看 | av成人免费在线观看| 偷拍盗摄高潮叫床对白清晰| 日韩高清成人| 日韩精品在线免费观看| 日本中文字幕免费| 国产精品18久久久久久vr| 亚洲精品在线观看免费| 欧美大片高清| 国产丝袜一区二区三区免费视频 | 日本不卡三区| 欧洲人成人精品| 白丝女仆被免费网站| 99热这里只有成人精品国产| 国产精品视频500部| 四虎亚洲成人| 日韩三级视频在线看| 欧洲美女女同性互添| 久久国内精品自在自线400部| 日本在线观看一区二区三区| 刘亦菲一区二区三区免费看| 日韩国产精品视频| 日韩av大片在线观看| 97se亚洲国产综合在线| 香港三级韩国三级日本三级| 国产精品xxx在线观看| 久久久久国产精品免费| 欧美少妇bbw| 午夜私人影院久久久久| 一级全黄裸体片| 伊人久久亚洲热| 国产伦精品一区二区三区四区视频| 欧美家庭影院| 亚洲国产一区自拍| 99久久久久久久久| 国产欧美一区二区三区在线老狼| 手机视频在线观看| 99久久精品网站| 91麻豆桃色免费看| 日本高清在线观看| 欧美精品一区二区高清在线观看| 日本少妇性高潮| 久久婷婷综合激情| 污污的网站18| 女人色偷偷aa久久天堂| 国产一区二区中文字幕免费看| 亚洲天堂2018av| 日本一二三区在线视频| 欧美色另类天堂2015| 亚洲区自拍偷拍| 黄色小视频免费观看| 亚洲精品免费在线播放| 精品人妻一区二区三区日产| 免费亚洲网站| 亚洲v国产v| 日本免费一区二区视频| 18久久久久久| 在线免费av网站| 日韩免费一区二区| 少妇太紧太爽又黄又硬又爽| 国产女人18水真多18精品一级做| 伊人精品视频在线观看| 尤物网精品视频| 四虎影视永久免费在线观看一区二区三区| 亚洲精品aaa| 97在线视频免费| 91在线视频| 精品88久久久久88久久久| 4438国产精品一区二区| 自拍视频在线观看一区二区| 50一60岁老妇女毛片| 奇米精品一区二区三区在线观看 | 台湾av在线二三区观看| 91久久精品一区二区三区| 精品无码久久久久成人漫画| 99精品国产热久久91蜜凸| 刘亦菲国产毛片bd| 韩日一区二区三区| 91亚洲精品视频| 色在线视频观看| 免费av在线一区| 黄色av免费在线观看| 欧美一级夜夜爽| 国产免费www| 午夜精品一区二区三区免费视频 | 禁断一区二区三区在线| 国产在线精品播放| 久久青草伊人| 欧美日韩999| 成年在线电影| 亚洲精品视频中文字幕| 精品国自产在线观看| 在线观看亚洲专区| 日韩福利片在线观看| 亚洲视频狠狠干| 阿v天堂2014| 91看片淫黄大片一级在线观看| 久久艹这里只有精品| 日本欧美一区二区在线观看| 欧美 日韩精品| 亚洲三级影院| 日韩一级片免费视频| 亚洲精品小说| 一级做a爰片久久| 俺要去色综合狠狠| 欧美一区二区视频在线| 欧美日韩导航| 国产精品一码二码三码在线| 亚洲一二三区视频| 91久久久久久久一区二区| 欧美a一级片| 国产视频福利一区| 91在线成人| 国产精品电影观看| 怡红院成人在线| 国产精品久久久久免费a∨| 桃色一区二区| 国产精品白嫩初高中害羞小美女 | 韩国中文字幕2020精品| 日韩黄色av网站| 天堂91在线| 亚洲欧美另类人妖| 成人高清免费观看mv| 中文字幕在线看视频国产欧美| 成人在线免费公开观看视频| 国产亚洲激情视频在线| 国产日产精品久久久久久婷婷| 亚洲欧美第一页| 精品av中文字幕在线毛片| 亚洲图片欧洲图片av| 在线观看美女网站大全免费| 俺去亚洲欧洲欧美日韩| 日本不卡视频| 欧美精品在线免费观看| 9999在线视频| 欧美中文字幕视频| 欧美一级二级视频| 国产免费一区视频观看免费| 国产色99精品9i| 国产精品jizz视频| 男男gay无套免费视频欧美| 日韩视频专区| 亚洲无中文字幕| 亚洲人成无码网站久久99热国产 | 日本高清视频一区| 久久精品女人天堂av免费观看 | 国内精品久久久久久久久久久| 欧美videossexotv100| 午夜在线视频观看| 伊人久久精品视频| 国产成人综合在线视频| 色综合一本到久久亚洲91| 97精品在线视频| 成人黄色免费短视频| 国产日韩欧美在线视频观看| 国产亚洲精aa在线看| 国产精品福利视频| 国产成人ay| 成人性做爰片免费视频| 亚洲无吗在线| www.色就是色| 国产精品白丝jk白祙喷水网站| 亚洲 欧美 日韩在线| 国产日本欧洲亚洲| 亚洲国产美女视频| 欧美特级www| a级片免费视频| 亚洲少妇激情视频| 青青青草视频在线| 国产精品69精品一区二区三区| 国产精品亚洲综合在线观看| 国产伦理久久久| 欧美超碰在线| 日韩av片在线看| 国产在线精品一区二区夜色 | 中文字幕日韩精品久久| 在线看片欧美| 亚洲高清在线不卡| 久久精品这里都是精品| 久久久久久久久久久久久久免费看 | 91麻豆精东视频| 日韩视频中文字幕在线观看| 在线这里只有精品| 人妻丰满熟妇av无码区hd| 久久精品2019中文字幕| 成人美女黄网站| 国产成人精品免费视频大全最热 | 911亚洲精品| 亚洲欧洲日韩综合二区| 久久成人亚洲| 2一3sex性hd| 一区二区三区高清| 一区二区三区免费在线视频| 亚洲欧美精品在线| 捆绑调教日本一区二区三区| 91视频免费进入| 性xxxx欧美老肥妇牲乱| 亚洲成人综合在线| 制服.丝袜.亚洲.中文.综合懂| 国产亚洲成aⅴ人片在线观看| 久草中文在线视频| 欧美精品亚洲一区二区在线播放| 男生女生差差差的视频在线观看| 欧美激情精品在线| 欧美区一区二区| 日本黄色播放器| 美女一区二区三区在线观看| 美女爆乳18禁www久久久久久| 五月婷婷另类国产| 精品美女www爽爽爽视频| 精品久久国产精品| 国产精品高潮久久| 日韩免费av一区二区三区| 羞羞视频在线观看欧美| 2一3sex性hd| 亚洲电影第三页| 蜜桃久久一区二区三区| 欧美精品xxx| 99久热这里只有精品视频免费观看| 天天在线免费视频| 国产剧情在线观看一区二区| 看片网站在线观看| 精品区一区二区| 超级碰碰不卡在线视频| 精品国产一区二区三区免费| 亚洲黄色av| 午夜一区二区三区免费| 狠狠做深爱婷婷久久综合一区 | 韩国三级电影一区二区| 激情五月激情综合| 欧美精品tushy高清| 国产在线更新| 国产不卡一区二区在线观看| 亚洲免费观看| 国产国语性生话播放| 欧美性高潮在线| 草草影院在线观看| 国产日韩在线视频| 欧美在线网站| 久久福利小视频| 欧日韩精品视频| 国产黄网站在线观看| 国产精品免费区二区三区观看| 妖精视频成人观看www| 亚洲激情视频小说| 欧美日韩精品一区二区天天拍小说 | 中文字幕在线播放av| 久久亚洲精品中文字幕冲田杏梨| 深夜激情久久| 久久久一本二本三本| 国产欧美精品区一区二区三区| 国产精品国产精品国产专区| 欧美激情视频网| 神马影视一区二区| 国产一级片自拍| 亚洲国产成人tv| 福利视频在线看| 高清av免费一区中文字幕| 久久婷婷av| 九九热精品在线观看| 亚洲欧美一区二区三区情侣bbw| 日韩第二十一页| 久久av综合网| 国产精品美女一区二区三区| 亚洲卡一卡二卡三| 国产精品高清在线| 国产精品扒开腿做爽爽爽软件| 一卡二卡三卡四卡| 日韩一级欧美一级| 日韩天堂在线| 国产一区二区在线视频播放| 1区2区3区国产精品|