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

特效側用戶體驗優(yōu)化實戰(zhàn) —— 包體積篇

原創(chuàng) 精選
移動開發(fā)
抖音目前由多條業(yè)務線組成,每條業(yè)務線都類似中臺的角色,特效中臺是抖音其中一環(huán);目前,特效由 effect 和 lab 聚合為EffectSDK,作為一條獨立業(yè)務線結算包體積在抖音中的占比。

?1 特效包體積之于抖音

1.1 一句話解釋包體積是什么?

包體積主要指的是應用安裝包大小的體積,比如 App Store 里的安裝包顯示的安裝大小。

1.2 為什么要優(yōu)化包體積?

隨著應用的能力更新迭代,應用安裝包體積將逐步增大,用戶下載應用消耗流量產(chǎn)生資費進一步增長,用戶下載意愿會相對下降;另一方面,隨著包體積增大,安裝應用的時間會相對變長,影響用戶使用感受;對于ROM較小的低端手機,應用解壓后內(nèi)存占用更大,部分手機管家會提示內(nèi)存不足提示卸載,直接影響用戶使用。

1.3 特效側在抖音里的包體積貢獻

抖音目前由多條業(yè)務線組成,每條業(yè)務線都類似中臺的角色,特效中臺是抖音其中一環(huán);目前,特效由 effect 和 lab 聚合為EffectSDK,作為一條獨立業(yè)務線結算包體積在抖音中的占比。

1.4 特效側的包體積組成

EffectSDK 的包體積由兩方面組成:二進制文件(即可執(zhí)行文件)、其他資源文件(圖片、配置文件等)。二進制文件主要是由代碼生成的可執(zhí)行文件,資源文件指代的如內(nèi)置的模型文件、素材文件、配置文件等。

作為中臺,特效 EffectSDK 中二進制代碼占用了絕大多數(shù)體積。與抖音、頭條等應用做包體積優(yōu)化思路不同,特效在資源壓縮等部分能做得比較少;由于特效是作為中臺對抖音進行業(yè)務支持,通過庫的形式提供特效能力,在無用資源刪除、無用代碼去除、代碼優(yōu)化上有較大空間。因此,特效側性能優(yōu)化主要側重于在支持多功能的基礎上盡量減小包體積,提升代碼質(zhì)量,實現(xiàn)代碼效率與代碼體積的平衡。

圖片

2 包體積優(yōu)化的背景知識

特效側在抖音里的能力由 C++ 代碼編寫支撐,編譯后生成靜態(tài)庫,最后鏈接至可執(zhí)行文件中。從代碼至二進制文件的過程中,由編譯器為我們做好預處理、編譯、匯編、鏈接等過程,最后 Android 端生成 ELF 格式文件,iOS 端生成 Mach-O 文件。ELF 格式的文件有四種,包括可重定位文件(Relocatable File)、可執(zhí)行文件(Executable File)、共享目標文件(Shared Object File)、核心轉儲文件(Core Dump File),其中,共享目標文件,即 xxx.so 文件,包含可在兩種上下文中鏈接的代碼和數(shù)據(jù),鏈接編輯器可以將它和其它可重定位文件和共享目標文件一起處理,生成另外一個目標文件;另外,動態(tài)鏈接器(Dynamic Linker)可能將它與某個可執(zhí)行文件以及其它共享目標一起組合,創(chuàng)建進程映像。特效側即以共享目標文件(libeffect.so)的形式做好抖音特效拍攝能力支撐。

圖片

圖片

圖片

由于ELF文件參與程序的鏈接與執(zhí)行,通常有兩種視圖方式:一種是鏈接視圖,一種是執(zhí)行視圖(下述左圖);編譯器和鏈接器會按照鏈接視圖,以節(jié)區(qū)(section)為單位,按節(jié)區(qū)頭部表(section header table)形成節(jié)區(qū)的集合;加載器將按照執(zhí)行視圖,將文件以段(segment)為單位,按照程序頭部表(program header table)將其視為段的集合。通常,可重定位文件(xxx.o)將包含節(jié)區(qū)頭部表,可執(zhí)行文件(xxx.exe)將包含程序頭部表,共享目標文件(xxx.so)兩者都包含。

圖片

圖片

下面是使用 binutils 工具查看 effect_sdk.so 中的 section 部分信息:

$ greadelf -h libeffect_sdk.so
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: AArch64
Version: 0x1
Entry point address: 0x0
Start of program headers: 64 (bytes into file)
Start of section headers: 22954168 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 8
Size of section headers: 64 (bytes)
Number of section headers: 29
Section header string table index: 28
$ greadelf -S libeffect_sdk.so
There are 29 section headers, starting at offset 0x15e40b8:

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .note.androi[...] NOTE 0000000000000200 00000200
0000000000000098 0000000000000000 A 0 0 4
[ 2] .note.gnu.bu[...] NOTE 0000000000000298 00000298
0000000000000024 0000000000000000 A 0 0 4
[ 3] .dynsym DYNSYM 00000000000002c0 000002c0
00000000000107e8 0000000000000018 A 4 1 8
[ 4] .dynstr STRTAB 0000000000010aa8 00010aa8
000000000001b0f9 0000000000000000 A 0 0 1
[ 5] .gnu.hash GNU_HASH 000000000002bba8 0002bba8
000000000000347c 0000000000000000 A 3 0 8
[ 6] .hash HASH 000000000002f028 0002f028
0000000000004c18 0000000000000004 A 3 0 8
... ...
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
p (processor specific)

通常每個節(jié)區(qū)(section)負責不同的功能,存儲在不同的位置,節(jié)區(qū)的大小是代碼編譯后大小的反饋。說到底,特效側最終的包體積由 section 和 headers 的大小共同決定。優(yōu)化包體積,即是優(yōu)化代碼的編寫效率、編譯方式,減少各個節(jié)區(qū)的大小。

int gInitVar = 24;  //-- .data section
int gUninitedVar; //-- .bss section
void func(int i)
{
printf("%d\n", i); //-- .text section
}
int main(void)
{
static int sVar = 23; //-- .data section
static int sVar1; //-- .bss section
int a = 1;
int b;
func(sVar + sVar1 + a + b); //-- .text section
return 0;
}

圖片

3 包體積優(yōu)化技巧

在了解了基礎的包體積組成后,我們可以針對性的對編譯選項、代碼進行調(diào)整,以優(yōu)化包體積。

iOS/Android 均可以通過優(yōu)化編譯選項來優(yōu)化代碼體積。整理了常用的一些。

3.1 編譯優(yōu)化

3.1.1 使用 Oz 替代 Os

編譯選項

  • 用-Oz?替代-Os
  • 示例:
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Oz")

3.1.2 減小 unused code 的體積

  • 編譯選項
  • -ffunction-sections
  • 把每個function放到自己的 COMDAT 段(COMDAT 段被多個目標文件所定義的輔助段。該段的作用是將在多個已編譯模塊中重復的代碼和數(shù)據(jù)的邏輯塊組合在一起。COMDAT 在 C++ 的虛函數(shù)表和模板的編譯鏈接中,起著非常重要的作用。)
  • 支持 Linux/OS X,不支持windows
  • -fdata-sections
  • 為源文件中每個變量啟用一個 elf section 的生成
  • 示例:
  • set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections -fvisibility=hidden -g")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections -fvisibility=hidden -g")

鏈接選項

  • -Wl, --gc-sections( Android 端)

  • 當編譯器選擇用-ffunction-sections, -fdata-sections編譯文件時,靜態(tài)的庫體積將增大,此時調(diào)用-Wl, --gc-sections,能消除dead段沒有用到的code和data的體積。
  • -dead_strip( iOS 端)

示例:

  • set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections")

3.1.3 開啟鏈接優(yōu)化

編譯選項

  • -flto Oz

鏈接選項

  • -O3 -flto

  • lto為 link-time optimization ,在編譯和鏈接時需要同時開啟。編譯時,會將各文件寫入專有的 section ,再鏈接時將它倆視為同一單元進行轉換和優(yōu)化。但有個缺點,會在一定程度上拖慢編譯速度

  • 注意:lto編譯時可以和-Oz共存,但鏈接時只能跟O1/O2/O3共存,無法和Oz/Os共存,如果同時開啟了,將會報下面的錯誤:

  • $ clang -Os -fuse-ld=lld -flto test.c
    ld.lld: error: -plugin-opt=Os: number expected, but got 's'
    clang-9: error: linker command failed with exit code 1 (use -v to see invocation)
    $ clang -Oz -fuse-ld=lld -flto test.c
    ld.lld: error: -plugin-opt=Oz: number expected, but got 'z'
    clang-9: error: linker command failed with exit code 1 (use -v to see invocation)

示例:

  • if (NOT DEFINED ENV{DISABLE_LTO})
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto -fPIC")
    endif()
  • set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl, --gc-sections -fuse-ld=gold -Wl, --icf=safe -O2 -flto")
    if (NOT DEFINED ENV{DISABLE_LTO})
    message(STATUS "DISABLE_LTO=$ENV{DISABLE_LTO} +++ LTO enabled")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=gold -Wl, --icf=safe -O2 -flto")
    else()
    message(STATUS "DISABLE_LTO=$ENV{DISABLE_LTO} +++ LTO disabled")
    endif()

3.1.4 關閉 exception 和 rtti

  • 編譯選項
  • -fno-exceptions
  • 當開啟-fno-rtti開關時,將禁用 rtti 機制,減小包體積。
  • -fno-rtti
  • 當開啟-fno-exceptions 開關時,將禁用 exception 機制,減小包體積。
  • 上述兩種屬于比較激進的做法,同時也需要代碼配合,但在能保障代碼正確性和穩(wěn)定性的情況下,也能較大幅度的優(yōu)化包體積。目前特效側已經(jīng)盡量避免不必要的 rtti 和 exception 機制。
  • 注意:缺少異常處理和 rtti ,需要 coder 能寫出更高品質(zhì)的代碼。
  • -fno-excpetion需要配合一定的代碼修改:
  • if(!running)
    {
    // throw std::runtime_error("runtime error") // 不可用
    errCode = getRuntimeError();
    return errCode;
    }
  • -fno-rtti也需要配合一定代碼修改:
  • DerivedTarget &target = getTargetPtr();
    // dynamic_cast<BasicTarget *>(target.get())->fun(); // 不可再用
    static_cast<BasicTarget *>(target.get())->fun();

3.1.5 自動刪除引入的靜態(tài)庫中的符號

  • 鏈接選項
  • -Wl,--exclude-libs,ALL(Android端)
  • 刪除庫"ALL"里自動導出的符號(這里ALL替換成不需要的庫名,比如--exclude-libs lib,lib,...)
  • 注意:iOS 不支持這個鏈接選項,因為 macOS 將--exclude-libs作為默認選項

(如果 iOS 要往庫里引入符號,需要手動開啟-reexport-l$(UR_LIB)選項)

if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release" AND ANDROID)
foreach(LIB ${LINK_LIB_LIST})
set(CMAKE_SHARED_LINKER_FLAGS "{CMAKE_SHARED_LINKER_FLAGS} -Wl,--exclude-libs,lib{LIB}.a")
endforeach()
endif()

目前特效在 Android 端均采用了這個選項。

3.1.6 減少符號表

  • -fvisibility=hidden
  • 可隱藏符號的可見性,防止符號沖突,同時減小包體積。
  • 注意:出錯時上層可能無法第一時間定位問題
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections -fvisibility=hidden -g")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections -fvisibility=hidden -g")

目前特效側均使用-fvisibility=hidden

3.1.7 動態(tài)鏈接c++

動態(tài)鏈接 libstdc++ 庫,避免增大庫文件。

3.2 代碼優(yōu)化

一句話總結:代碼量越少,包體積越小,從經(jīng)驗來看100行代碼大概占用1~5K體積;超出這個行/體積 比,代碼肯定有問題。

3.2.1 不要有無效的判斷邏輯( if...else... )

可以采用表驅動的方法實現(xiàn) if else ,減少不必要的代碼引用。

3.2.2 減少模板展開、宏展開

模板展開非常占據(jù)體積,尤其是對于同一種形式的代碼,template 會擴充為多個不同的類。此時最好把公共的部分提取出來,聲明為一個 static method。

如下面的綁定變量的方法:

template <typename T>
static void bindArgs(const Demo& d, T func)
{
auto m = createFun(func);
m->mName = d.name
for (auto i = 0; i < m->getArgc(); ++i)
{
if (i < d.args.size())
m->mArgTypes[i].name = d.args[i];
}
}

template <typename T>
static void bindArgs(const Demo& d, T func, const Var& arg1)
{
auto m = createFun(func);
if (!m)
return;
m->mValues.push_back(arg1);
for (auto i = 0; i < m->getArgc(); ++i)
{
if (i < d.args.size())
m->mArgTypes[i].name = d.args[i];
}
}

// static void bindArgs(const Demo& d, T func, const Var& arg1, const Var& arg2)
// {

可修改為:

// bindArgs 提取出來
static void bindArgs(const Demo& d, Fun* m)
{
for (auto i = 0; i < m->getArgc(); ++i)
{
if (i < d.args.size())
m->mArgTypes[i].name = d.args[i];
}
}

template <typename T>
static void bindArgs(const Demo& d, T func)
{
auto m = createFun(func);
m->mName = d.name;
bindArgs(d, m);
}

template <typename T>
static void bindArgs(const Demo& d, T func, const Var& arg1)
{
auto m = createFun(func);
if (!m)
return;
m->mValues.push_back(arg1);
bindArgs(d, m);
}

3.2.3 避免不必要的 stl/std 使用

比如,部分回調(diào)可以使用函數(shù)指針:std::function <>作為一個 class ,它的體積成本必然比 void * fun 這樣一個函數(shù)指針要來的高;

// using FunInstantiate = std::function<FunInterface*()>; // 不再使用
using FunInstantiate = FunInterface*(*)();

比如,常量字符串引用時可以采用 const char* 類型,避免編譯器調(diào)用隱式拷貝構造;

// void DemoClass::fun(const std::string &name, const DemoPtr &demoPtr) // 不再使用
void DemoClass::fun(const char* name, const DmoePtr &demoPtr)
{
//...
}

3.2.4 頭文件不要出現(xiàn) const、static 變量的定義

頭文件中 const / static 型的變量,會被引入至對應的 cpp 文件,相當于每一份.o 都引入了一長串常量字符串。

3.2.5 不要出現(xiàn)大的數(shù)組

大的數(shù)組會占用數(shù)組大小的體積。

3.2.6 減少不必要的虛基類/虛函數(shù)

// class Child : virtual public Parent // 不再使用
class Child : public Parent
{
//...
}

4 包體積監(jiān)測工具

4.1 為什么要做包體積監(jiān)測工具

抖音每個版本都會有非常多的新能力更新?lián)Q代,每次更新每個需求均會導致包體積的變更。為了能更好的監(jiān)測包體積的變化、確認包體積增長的原因,提升 ROI ,引入包體積監(jiān)測工具,更直觀的確認包體積增長原因,攔截異常增長,輸出每個每個需求帶來的包體積增長大小、包體積增長原因,及時給出包體積告警、定位異常增量 case ,減緩包體積增長,推動業(yè)務優(yōu)化。

圖片

4.2 如何進行包體積監(jiān)測

特效側目前使用的包體積監(jiān)測工具來源于 google 的開源二進制文件體積分析工具 bloaty ,用于分析二進制文件(xxx.exe, xxx.bin)、共享目標文件(xxx.so)、對象文件(xxx.o)和靜態(tài)庫(xxx.a),支持ELF\Mach-O\WebAssembly 格式。它能梳理出文件中各部分的體積組成,拆分出各個 section 大小,結合symbol信息,反推出各方法、源文件的包體積大小。

以特效側 libeffect_sdk.so 為例,對 .so 文件進行組件單元、源文件分析,截取部分輸出結果:

FILE SIZE   
--------------
10.3% 2.25Mi [section .rela.dyn]
7.2% 1.58Mi [section .rodata]
7.2% 1.57Mi Bindings.cpp
3.9% 877Ki [section .data.rel.ro]
2.0% 445Ki [section .text]
1.9% 418Ki [section .gcc_except_table]
1.0% 213Ki base/EffectManager.cpp
0.7% 149Ki bef_info_sticker_api.cpp
0.6% 140Ki base/RenderManager.cpp
0.6% 138Ki Runtime/Engine/Foundation/Bindings.cpp
...

利用上述工具,即可較為清晰的定位各文件帶來的包體積增長。

4.2.1 包體積監(jiān)控工具工作流程

包體積監(jiān)測工具是當前特效需求上車前必過的一環(huán)。所有需求在 MR(merge request)提出、CI 打包完成后都會經(jīng)過包體積的檢查,僅包體積增量符合預期的需求允許跟版合入,所有包體積增量與需求一一對應,記錄在案。

圖片

4.2.2 包體積監(jiān)測工具的分析能力

包體積分析工具支持單個文件分析和版本迭代對比分析。

對于單文件分析,由于特效側主要通過 .so 文件進行交付,在每個 MR 打包完成后,工具將自動獲取對應的 .so 文件和 .so.symbol 文件后,對庫文件的包體積組成、包體積來源進行分析,輸出所有方法函數(shù)、節(jié)區(qū)(section)、編譯單元(xxx.cpp)帶來的包體積大小,確認大小后通過關鍵字匹配確認包體積的增量來源模塊,給出最后的各模塊單元、編譯單元的包體積 profile 。

另一方面,由于特效側能力總是通過需求更新迭代的,每次有實質(zhì)性的需求提交時,將會對比上一版本與當前版本的包體積差異,做好每個版本需求帶來的增量來源記錄。當版本比對結果帶來的增量超過預期值時,將調(diào)起通訊 api ,將包體積超標信息發(fā)出進行報警。

圖片

圖片

4.2.3 包體積數(shù)據(jù)記錄本

所有需求的包體積增量將記錄在包體積記錄本中:當服務收到需求事件時,將調(diào)用 bits/meego 接口,請求需求信息和包大小預設 exp_pack_size 增量寫入 mr_pkg_size 表;等到本地出包完成后,實際的包大小增量 real_pack_size 將被記錄入 mr_pkg_size 表,并將預期值與實際增量進行對比。

最終,所有的包體積增量與歷史的需求增量來源被記錄在案,并通過表查詢接口,在網(wǎng)頁端可根據(jù)需求名 / 時間段 / 分支名 / commit id 等條件按圖索驥,確認包體積增長來源。

圖片

5 總結

經(jīng)過上述代碼體積優(yōu)化積累、實時體積監(jiān)控、需求增量落實到人三位一體,控制特效側包體積有序增長,提升代碼效能。

責任編輯:未麗燕 來源: 字節(jié)跳動技術團隊
相關推薦

2023-07-19 22:17:21

Android資源優(yōu)化

2010-08-03 15:44:08

FlexBuilder

2016-07-22 10:28:47

業(yè)務運維APP

2010-03-18 20:19:16

2023-09-18 23:50:25

二進制文件裁剪Layout

2011-06-30 17:13:17

SEO用戶體驗

2022-06-01 09:18:37

抖音ReDex算法優(yōu)化

2023-03-15 21:38:43

短視頻服務器

2021-01-12 10:16:42

CSS 容器優(yōu)化滾動

2022-10-28 13:41:51

字節(jié)SDK監(jiān)控

2014-03-11 10:35:11

監(jiān)控寶升級驅動

2010-05-18 10:09:38

前端優(yōu)化

2012-04-18 09:22:40

Chrome for

2012-01-17 10:20:25

Web App最佳實踐用戶體驗

2016-09-01 09:39:20

攜程無線

2011-01-13 16:11:13

silverlightwebasp.net

2012-11-05 10:01:32

2012-08-09 10:02:08

面試Google

2012-08-14 10:31:28

面試

2012-08-21 09:20:57

Yahoo
點贊
收藏

51CTO技術棧公眾號

久久美女福利视频| 好吊妞www.84com只有这里才有精品 | 国产区高清在线| 青娱乐精品在线视频| 久热精品视频在线观看| 成人在线视频免费播放| 户外露出一区二区三区| 亚洲免费在线电影| 欧美精品尤物在线| 精品国产亚洲av麻豆| 国产亚洲精品bv在线观看| 中文字幕一区二区三区电影| 波多野结衣三级视频| 国产不卡网站| 一级特黄大欧美久久久| 欧美重口乱码一区二区| 成 人 免费 黄 色| 美女精品自拍一二三四| 97久久精品国产| 亚洲综合视频网站| 久久99国内| 精品盗摄一区二区三区| 九色91popny| 欧美aaaaa性bbbbb小妇| 亚洲免费观看高清完整版在线观看 | 色丁香婷婷综合久久| 久久精品国产在热久久| 国产99久久久欧美黑人| 国产精品自拍视频一区| 亚洲国产老妈| 深夜福利一区二区| 中文字字幕码一二三区| 成人h动漫免费观看网站| 欧美日韩高清一区二区| 日韩无套无码精品| 是的av在线| 午夜视频久久久久久| 免费久久久久久| 91欧美在线视频| 久久精品一区二区三区av| 久久草.com| 手机av免费在线观看| 国产精品888| 91午夜理伦私人影院| 中文字幕乱码在线观看| 日韩精品乱码av一区二区| 欧美中文字幕精品| 久久久久亚洲av成人毛片韩| 亚洲精品社区| 国产91ⅴ在线精品免费观看| 日韩欧美国产亚洲| 亚洲国产专区| 97人人做人人爱| 香蕉免费毛片视频| 国产伦理一区| 日本视频久久久| 国产免费一级视频| 久久中文字幕一区二区三区| 国产aaa精品| 国产成人a v| 日本欧美一区二区| 成人国产亚洲精品a区天堂华泰| 中文字幕一区二区免费| 六月婷婷色综合| 成人伊人精品色xxxx视频| 97人妻精品一区二区三区动漫| 久久激情五月婷婷| 亚洲iv一区二区三区| 国内精品偷拍视频| 成人午夜又粗又硬又大| 精品在线视频一区二区| 欧洲视频在线免费观看| 国产日产亚洲精品系列| 一区二区三区国| h片在线观看网站| 亚洲高清免费视频| 欧美少妇性生活视频| 成人国产一区| 日韩美女一区二区三区四区| 香港三日本8a三级少妇三级99| 九九热hot精品视频在线播放| 日韩美女av在线| 一本一本久久a久久| 一区二区三区四区电影| 2018国产精品视频| 亚洲av人无码激艳猛片服务器| 精品一区二区三区视频在线观看 | 国产91精品入| 亚洲三级 欧美三级| 国产美女网站视频| 韩国久久久久| 国产精国产精品| va视频在线观看| 97久久精品人人做人人爽| 午夜老司机精品| 金瓶狂野欧美性猛交xxxx| 日韩欧美一区二区在线| 日本在线播放一区二区| 奇米影视777在线欧美电影观看| 国产亚洲免费的视频看| 久久精品www人人爽人人| 老鸭窝毛片一区二区三区| 成人激情视频在线观看| 亚洲av成人精品日韩在线播放| 国产日韩欧美高清| 国产真人做爰毛片视频直播| 成人在线免费电影网站| 亚洲福利视频久久| 疯狂撞击丝袜人妻| 久久国产欧美| 国产一区二区三区色淫影院| 免费在线毛片网站| 亚洲一区二区四区蜜桃| 三级视频中文字幕| 校园春色另类视频| 久久99视频精品| 少妇无套内谢久久久久| 26uuu精品一区二区在线观看| 国产又粗又爽又黄的视频| 国产免费不卡| 亚洲第一av网站| 久久国产美女视频| 麻豆一区二区99久久久久| 欧美日韩国产精品一卡| 亚洲制服国产| 欧美精品粉嫩高潮一区二区| 新91视频在线观看| av不卡免费看| 成人免费在线一区二区三区| 女女色综合影院| 在线国产亚洲欧美| 亚洲一区二区三区蜜桃| 亚洲人成久久| 国产精品区一区二区三含羞草| 幼a在线观看| 91九色02白丝porn| 欧洲女同同性吃奶| 亚洲美女啪啪| 国产一区在线免费观看| 肉体视频在线| 精品日韩欧美在线| 久久久久久久久久91| 国产伦精品一区二区三区免费迷 | 国产成人精品亚洲男人的天堂| 国产美女一区二区三区| 91社在线播放| 韩国三级大全久久网站| xxx一区二区| 国产精品视频一二区| 国产精品传媒视频| 在线观看免费不卡av| 91精品久久久久久久蜜月| 国产在线精品播放| 黄色片网站在线| 日韩午夜av一区| 久久久久久久极品内射| av不卡免费在线观看| 久久亚洲中文字幕无码| 天堂日韩电影| 国产成人精品最新| av片在线看| 日韩欧美一区二区免费| 国产在线成人精品午夜| 93久久精品日日躁夜夜躁欧美| 亚洲国产精品久久久久婷蜜芽| 午夜a一级毛片亚洲欧洲| 日韩免费视频在线观看| 免费看美女视频在线网站| 欧美视频精品在线观看| 久久免费看少妇高潮v片特黄| 国产+成+人+亚洲欧洲自线| 我的公把我弄高潮了视频| 人人精品亚洲| 国产精品亚洲欧美导航| av片在线观看永久免费| 亚洲国产精品福利| 最新黄色网址在线观看| 亚洲日本青草视频在线怡红院| 中文字幕一区二区三区人妻在线视频| 99国产精品私拍| 天堂社区 天堂综合网 天堂资源最新版 | 国产精品免费视频xxxx| 成人在线免费看黄| 日韩精品日韩在线观看| 亚洲一卡二卡在线观看| 亚洲综合丁香婷婷六月香| a级大片在线观看| 国产美女一区二区三区| 爱福利视频一区二区| 久久一区二区三区喷水| 国产在线精品一区二区中文 | 精品无码国产污污污免费网站| 蜜桃av一区二区三区电影| 男人天堂手机在线视频| av在线不卡免费观看| 成人黄视频免费| 国产福利一区二区三区在线播放| 欧美高清激情视频| 国产高清在线| 亚洲精品国产品国语在线| 一区二区三区在线免费观看视频| 亚洲一区二区精品3399| 中字幕一区二区三区乱码| 高清国产一区二区| 亚洲色图久久久| 99精品视频网| 韩国黄色一级大片| 国产一区二区三区天码| 国产精品美女xx| 先锋影音网一区二区| 欧美在线性视频| 欧美大胆的人体xxxx| 最近更新的2019中文字幕| 亚洲人午夜射精精品日韩| 日韩欧美一区在线| 亚洲综合五月天婷婷丁香| 欧美日韩中文在线观看| 久久久久久久极品内射| 亚洲欧美另类小说视频| 国产性猛交xx乱| 久久天天做天天爱综合色| 亚洲成年人av| 国产成人日日夜夜| 天天综合天天添夜夜添狠狠添| 久久国产精品久久w女人spa| 少妇高潮喷水在线观看| 欧美国产高清| 男女爱爱视频网站| 99久久.com| 无遮挡亚洲一区| 精品久久久亚洲| 美女亚洲精品| 私拍精品福利视频在线一区| 国产精品日韩欧美一区二区| 日韩高清一区| 亚洲在线免费看| 精品成人18| 成人网址在线观看| 欧洲精品久久久久毛片完整版| 国产精品精品国产| 日韩毛片一区| 国产免费一区二区三区在线观看| 欧美极度另类| 国产精品老女人精品视频| 亚洲不卡系列| 国产精品看片资源| 国产精品天堂蜜av在线播放| 国产精品高清在线观看| 韩国精品主播一区二区在线观看 | 网友自拍区视频精品| 国产乱人伦精品一区二区| 风间由美一区二区av101| 成人精品一二区| 红杏成人性视频免费看| 精品欧美一区二区在线观看视频| 欧美成人午夜77777| 欧美精品在线一区| 欧美一级淫片| 26uuu成人| 欧美激情亚洲| 蜜臀av色欲a片无码精品一区| 亚洲精品孕妇| 已婚少妇美妙人妻系列| 免费看精品久久片| 欧美视频亚洲图片| 成人激情av网| 最近中文字幕在线mv视频在线| 国产亚洲欧美一级| www.99re6| 亚洲一区在线看| 成人免费视频毛片| 欧美日韩一区二区欧美激情| 国产精品毛片一区二区在线看舒淇| 3atv一区二区三区| 亚洲精品综合网| 亚洲欧美一区二区激情| 日本视频在线| 欧美激情视频免费观看| 裤袜国产欧美精品一区| 成人亲热视频网站| 国产人妖ts一区二区| 日韩av影视| 你懂的国产精品永久在线| 免费 成 人 黄 色| 久久成人av少妇免费| 亚洲最大视频网| 国产日韩成人精品| 加勒比av在线播放| 在线精品视频一区二区| 亚洲第一视频在线| 亚洲欧美自拍一区| 中文字幕伦理免费在线视频 | 熟女少妇精品一区二区| 狠狠色丁香婷婷综合| 国产精品无码电影| 国产精品久久久久一区二区三区共 | 黑人精品一区二区三区| 伊人久久久久久久久久久| 激情图片在线观看高清国产| 国产精品白嫩美女在线观看| 我要色综合中文字幕| 日韩一区不卡| 99香蕉国产精品偷在线观看| 手机看片一级片| 久久综合色之久久综合| 欧美黄色免费观看| 欧洲一区二区三区在线| 成人久久久精品国产乱码一区二区 | 蜜桃av免费在线观看| 亚洲午夜久久久久久久久久久| 伊人久久中文字幕| 日韩成人xxxx| 美女航空一级毛片在线播放| 国产精品视频1区| gogo久久日韩裸体艺术| 日韩视频在线免费播放| 日韩精品欧美精品| 国产制服丝袜在线| 一区二区三区资源| 国产一区二区在线视频聊天 | 丝袜美女在线观看| 国产精品直播网红| 久久99国产精品视频| 日本福利视频在线| 成人激情免费网站| 国产一级aa大片毛片| 在线播放亚洲一区| 国产二区在线播放| 国产精品27p| 欧美激情在线免费| 久久久久久久中文| 不卡的av电影| 亚洲国产精品午夜在线观看| 日韩免费高清视频| 欧美xxxx做受欧美88bbw| 亚洲最大的成人网| 一区二区免费不卡在线| 欧美xxxxxbbbbb| 亚洲四区在线观看| 国产精品高潮呻吟av| 日韩在线视频国产| 亚洲视频自拍| av动漫在线播放| 国产九色精品成人porny| 欧美黑人猛猛猛| 日韩欧美国产综合在线一区二区三区| mm1313亚洲国产精品美女| 亚洲专区国产精品| 欧美成人一品| 在线播放av网址| 婷婷丁香激情综合| 亚洲 小说区 图片区 都市| 青青草精品毛片| 欧美特黄一级大片| 蜜臀av免费观看| 成人欧美一区二区三区在线播放| 国产精品乱码久久久| 免费av一区二区| 伊人精品久久| 国产毛片视频网站| 26uuu久久天堂性欧美| 亚洲免费视频二区| www亚洲精品| 国产91精品入| 久久综合久久色| 国产精品家庭影院| 国产成人久久精品77777综合| 欧美激情综合色综合啪啪五月| 欧美一性一交| 亚洲综合欧美在线| 夜夜嗨av一区二区三区四季av| 国产18精品乱码免费看| 2019国产精品自在线拍国产不卡| 久久av免费| 51自拍视频在线观看| 亚洲成年人影院| 成人在线免费观看| 亚洲综合社区网| 视频一区视频二区中文| 国产真实乱在线更新| 亚洲国产精品99| 粉嫩91精品久久久久久久99蜜桃| 日韩国产精品毛片| 97se亚洲国产综合自在线不卡 | 亚洲а∨天堂久久精品9966| 蜜臀国产一区| 激情视频小说图片| 2017欧美狠狠色| 国产人妻精品一区二区三区| 国模精品系列视频| 日韩欧美综合| 久久人妻一区二区| 欧美日韩在线播放三区| tube8在线hd| 亚洲人久久久| 91蜜桃在线观看| www.色日本| 国产精品一区久久久| 亚洲免费观看| 国产av 一区二区三区|