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

聊聊iOS 應用瘦身方法思路

移動開發 iOS
如果能夠實現 APP thinning,那么往往 2 倍屏幕的手機包大小會小于 3 倍屏手機的包大小,起到差異性優化的目的。在調研過程中我們還發現,應用的體積與圖片資源的數量密切相關(聽起來好像是廢話)。

[[394887]]

 1. 前言

前段時間注意到我們 APP 的包大小超過100MB了,所以隨口跟呂老板說了下能否采用字體文件(.ttf)替代 PNG 圖片,呂老板對應用瘦身很感興趣因此讓我做下技術調研。這篇文章主要是將我們的各個技術方案的思路做一下整理和總結,希望對大家有所幫助。

2. iOS 內置資源的集中方式

在介紹技術方案前我們先來看下 iOS 內置圖片資源都有哪些常見的方式:

2.1 將圖片存放在 bundle 下

這是一種非常常見的方式,項目中各類文件分類放在各個 bundle 下,項目既整潔又能達到隔離資源的目的。我們項目中圖片絕大多數都是這樣內置的,其加載方式為 [UIImage imageNamed:"xxx.bundle/xxx.png"](請記住這個字符串的規則,因為這種規則非常非常重要!!!"xxx.bundle/xxx.png")。

但是這種方式有比較明顯的缺點:首先使用 bundle 存儲圖片 iOS 系統不會對其進行壓縮存儲,造成了應用體積的增大。其次是使用 bundle 存儲圖片放棄了 APP thinning,其明顯的表現是使用2倍屏手機的用戶和使用3倍屏手機的用戶下載的應用包大小一樣。

如果能夠實現 APP thinning,那么往往 2 倍屏幕的手機包大小會小于 3 倍屏手機的包大小,起到差異性優化的目的。在調研過程中我們還發現,應用的體積與圖片資源的數量密切相關(聽起來好像是廢話)。

換句話說,iPhone 的 rom 存在 4K 對齊的情況,一張 498B 大小的圖片在應用包中也要占據 4KB 大小。因此項目中每添加一張圖片就至少增大了 4KB。

為了證實這個觀點特地創建空應用進行測試。首先創建空應用,其大小在 7P 上為 213KB,引入一張 498B 的圖片前后對比如下:

一張498B的圖片

占據 4KB 磁盤空間

未添加資源的應用

添加圖片資源后的大小

上述實驗未經過 App Store 上線認證,僅僅通過本地打包測試,因此觀點僅供參考。

2.2 使用 .ttf 字體文件替代圖標

使用字體文件替代圖片也是一種比較常見的資源內置方式。很多應用都使用過這種方案,如淘寶、愛奇藝等知名應用,都采用過這種方式。

使用字體文件的好處是顯而易見的,如果 APP 中某個圖片比較大,那么為了保證清晰度,UI 可能會提供比較大的圖標。

使用字體文件會避免這個問題,而且不必導入 @2x 和 @3x 圖片,一套字體文件就能保證 UI 的清晰度。關于如何生成 .ttf 文件在這里就不在贅述了(因為我并不喜歡這個方案),我們只要如何使用就可以了。

字體文件使用起來比較簡單,但是使用方法與 png 圖片的使用方法有很大的不同,因為字體文件時機所展示的圖標都是 UTF8 編碼轉來的字符串。因此當我們需要展示一個圖標的時候不再是使用 UIImageView 了,而是 UILabel。

字體文件展示圖片的代碼示例

由于我們使用了字體來替代圖片,所以我們可以通過設置字體的顏色來改變圖標的顏色。我們之前經常會遇到一個場景,如兩個一模一樣的圖標但是由于顏色不同,UI 同學就需要提供 2 套圖片,每套圖片中包含 @2x 和 @3x 圖片。如果采用了字體替代簡單的圖標,那么 UI 只需要提供一套字體即可,并且拉伸后也不會失真。

使用字體文件的好處總結起來主要有兩點:

  1. 可以降低應用圖片內置資源的體積。
  2. 可以隨意放縮和修改顏色。

但是其缺點也很明顯:

  1. 圖標的查找和替換比較麻煩,不如直接使用圖片那樣簡單。
  2. 最重要的是如果在 58 同城 APP 中使用,則意味著無法替換之前存在的圖片,只能起到縮小增量的目的,無法減小全量。

ps:任何一種需要大刀闊斧改革的優化都是一種不明智的行為。

2.3圖片存在Assets.xcassets下(蘋果推薦,我也推薦)

使用 Assets.xcassets 是蘋果推薦的一種方式。Assets.xcassets 是 iOS7 推出的一種圖片資源管理工具,將圖片內置到 Assets.xcassets 下系統會對圖片資源進行壓縮,并且支持 APP thinning。

APP Slicing

項目優化不能脫離場景,很多很好的方案由于場景的限制并不能起到優化的作用。因此先簡單介紹下我們的項目場景:為了達到跨團隊快速開發的目的,我們項目很早就利用cocoapods 實現組件化。項目中存在多個業務 pod,每個 pod 都有各自的團隊維護,各個團隊的代碼彼此不開放,各個 pod 最終會被編譯為.a的形式。

這里需要說明一下我為什么要強調 .a,與 .a 相對應的還有一個 .framework,他們之間有一個重要的區別就是資源的問題。framework 中可以存放資源,但是 .a 卻不可以,因此生成 .a 的 pod 下的資源會被轉移到 main bundle 下,這為資源沖突造成了隱患,為了避免這種沖突我們之前采用的使用 bundle 管理資源,bundle 名很少會重復這樣就大大降低了資源沖突的可能性。

優化的前提之一也是不破壞這種組件化開發的模式,換句話說也就是各個業務線不產生資源耦合、業務線的 RD 不必擔心彼此資源的沖突、業務 Pod 下的資源文件彼此隔離。哪怕招聘團隊中存在 a.png,房產團隊中也存在 a.png 也不會有什么問題。所以我們先要拋出兩個問題:

1. cocoapods 是否支持使用 Assets.xcassets。

2. 各個 pod 各自維護自己的 Assets.xcassets 會不會造成資源沖突。

為了弄清楚上面兩個問題,我們先要看下 podspec 的幾個重要參數:

podspec

s.public_header_files :表明了哪些路徑下的文件可以在 framework 外被引用。

source_files :源文件路徑。

s.resources :資源文件路徑及文件類型。

s.resource_bundles :資源文件路徑及類型,同時資源文件會被打成 bundle。(推薦使用)。

實驗發現各個 pod 下都可以創建自己的 xcassets,因此問題1不算問題是問題。如果我們在各個業務 pod 下都創建 .xcassets 文件內置圖片,那么 cocoapods 的腳本會在編譯時將各個目錄下的 xcassets 文件內容提取出來,合并到一個 xcassets 中并生成一個 .car 文件。

這樣的話如果資源文件重名,那么很可能其中某一個文件會被覆蓋替換。因此我們主要是要解決問題2。查看 podspec 的寫法發現 s.resource_bundles 貌似是我們所需要的法寶。為此我們天真的以為問題馬上就要解決了:

將指定路徑下的資源打包成bundle

最終打包結果很理想,確實能夠生成 ImagesBundle.bundle,并且 bundle 下存在Assets.car。

mainbundle下存在ImagesBundle

ImageBundle.bundle下存在Assets.car

事情到這里可能已經看到曙光了,但是我們發現通過

  1. [UIImage imageNamed:@"ImagesBundle.bundle/1"]; 

加載不出來圖片。必須使用

  1. [UIImageimageNamed:@"1"inBundle:[WBIMViewControllericonBundle]compatibleWithTraitCollection:nil]; 

才能加載出來。

圖片加載失敗

指定bundle后加載成功

也就是說只有 Assets.car 如果不在 main bundle 下,那么加載圖片都需要指定bundle。

既然需要指定 bundle 加載圖片,那么如何獲取這個 bundle 呢?換句話說如何才能低成本的將現在項目中的圖片放到特定 bundle下的 Assets.car 文件中呢?

對此我們提出了一個解決方案:

1. 在 pod 下新建一個空文件夾。找出該 pod 存放圖片的所有 bundle,在新建文件夾下創建與 bundle 數量相等的 Asset。

2. 修改 podspec 文件,設置 resource_bundles 將 Asset 指定為資源,并指定 bundle名稱。如 A.bundle,其對應的 Asset 最終資源 bundle 為 A_Asset.bundle。

3. 新增方法,imageWithName:,從符合 xxx.bundle/yyy.png 特征的參數中獲取 bundle 名和圖片名 xxx_Asset.bundle 和 yyy.png,獲取圖片并返回。

4. 查找并全部替換 imageNamed: 和 imageWithContentOfFile: 為 imageWithName:

只要能拿到原來代碼中 imageNamed: 的參數就能知道現在圖片存在那個 bundle 下,這樣就能通過 imageNamed:inBundle: 獲取到圖片,其思路如下圖所示:

imageWithName:方法內部處理

打包后bundle情況

看到這里老司機們已經應該能遇見這種優化的成本了。加載圖片都需要指定 bundle 也就意味著成千上萬處的 API 需要修改。我們最初探討到這里的時候首先想到的是腳本,但是這個方案很快就被否定了,因為項目中存在大量的 XIB,XIB 中設置圖片我們無法通過腳本替換 API。

為了解決 XIB 設置圖片的問題,我們首先想到了AOP。通過 hook XIb 加載圖片的方法將方法偷偷替換為 imageNamed:inBundle: ,但是很遺憾我們 hook 了 UIImage 所有加載圖片的方法,沒有一個方法能拿到 XIB 上所設置的圖片名稱,也就意味著我們無法得知優化后的圖片在哪個 bundle 下,也就不知道圖片該如何加載。

雖然有坎坷,但是我們始終堅信 XIB 一定是通過某些方法將圖片加載出來的,我們一定能拿到這個過程!為了驗證這個問題,首先定義一個 UIImageView 的子類,并將 XIB 上的 UIImageView 指定為這個子類。

大家都知道通過XIB加載的視圖都一定會執行 initWithCoder: 方法

UIImageView的子類加載

我們發現在得到執行 [super initWithCoder:aDecoder] 之前通過 lldb 查看 slef.image 是nil。當執行完這行代碼后 self.image 就有值了。

因此推斷圖片的信息(圖片名稱、路徑等信息)都在 aDecoder 中!在網上搜索了一些資料后發現 aDecoder 有一些固定的key,可以通過這些固定的 key 得到一部分信息。如

aDecoder可以通過某些key得到其中信息

很顯然通過 “UIImage” 這個 key 能拿到圖片,但是很遺憾經過多次嘗試沒能找到圖片的路徑信息。因此這個問題的關鍵是怎么找到合適的 key,為了解決這個問題,最好是能拿到 aDecoder 的解碼過程。

因此 hook aDecoder 的解碼方法 decodeObjectForKey:是個不錯的選擇。如果能拿到 xib 上設置的圖片名稱那么我們就可以根據圖片名稱獲取到正確的圖片路徑。經過斷點查看 aDecoder 是UINibDecoder(私有類)類型。

aDecoder

hook UINibDecoder的decode方法

打印系統 decode 的所有 key 后發現有個 key 為 UIResourceName,value 為圖片的名稱。也就是說我們能得到 XIB 上設置的圖片名稱了。但是這個圖片的名稱怎么傳遞給這個 XIB 對應的UIImageView 對象呢?

換句話說也就是說我們怎么把圖片傳給這個 XIB 對應的 view 呢?為了將圖片名稱傳給 UIImageView,需要給 aDecoder 添加一個 block 的關聯引用。

UIImageView在initWithCoder:的時候設置回調

在 hook 到的 decodeObjectForKey: 方法中將圖片名稱回傳給 initWithDecoder: 方法:

aDecoder hook到圖片名稱后回調給UIImageView類

這里需要注意的是一點是:XIB 默認設置圖片是在 rentun value 之后,也就是說如果我們回調過早有可能圖片被替換為 nil。因此需要 dispatch_after 一下,等 return 之后再回調圖片名稱并設置圖片。

受此啟發,我們也可以 hook UIImage 的 imageNamed: 方法,根據參數的規則到 xxxCopy.bundle 下獲取圖片,并返回圖片。這就意味著放棄通過腳本修改 API,減少了代碼的改動。

看到這里似乎是沒有什么問題,但是我們忽略了一個很嚴重的問題 aDecoder 對象和 UIImageView 類型的對象是一一對應的嗎?一個 imageView 它的 aDecoder 是它唯一擁有的嗎?帶著這個問題,我們先來看下打印信息:

重復生成UIImageView對象和aDecoder對照關系

重復生成對象并打印后發現 aDecoder 的地址都相同,也就是說存在一個 aDecoder 對應多個UIImageView 的現象。因此異步方案不適用,需要同步進行設置圖片,因此全局變量最為合適。

其實這一點很容易理解,aDecoder 是與 XIB 對應的,XIB 是不變的所以 aDecoder 是不變的。

因此異步回調的方案不適用,需要同步進行設置圖片,在這種情況(主線程串行執行)下跨類傳值全局變量最為合適:

hook UINibDecoder的decodeObjectForKey

hook UIImageView 的initWithCoder:

上面兩段代碼僅僅介紹思路,可能加載圖片的代碼并不是十分的嚴謹,請讀者自己鑒別。同理hook 項目中 UIImage 所用到的加載圖片的API即可加載圖片。

如果將所有的hook方法放到一個類中,那么只要將這個類拖入到項目中,并將項目中所有的bundle下的圖片都放到對應的 Assets.xcassets 文件下那么無需修改一行代碼即可將所有的圖片遷移到 Assets.xcassets 下,達到應用瘦身的目的。

但是我們組內老練的架構師們指出:項目中 hook 如此重要的 API 對增加了項目維護的難度。這也引發了我對項目中 AOP 場景的思考,項目中到底 hook 了多少 API?

可能在我場多年的老司機們都難以回答了,為此特地趕制了一個基于 fishhook 的一個 hook 打印工具,檢測和統計項目中的 AOP 情況。但是缺點是必須調整編譯順序保證工具類最先被load。

hook method_exchangeImplementations 方法

檢測方法(字典寫入時不要忘了加鎖)

 

責任編輯:武曉燕 來源: 網羅開發
相關推薦

2015-02-02 11:03:12

2019-01-30 11:21:57

Swift iOS開發

2024-06-27 12:26:32

2021-08-12 18:49:41

DataStreamAPI注冊

2020-12-22 06:05:43

Mbedtls應用基礎

2019-01-09 13:20:28

GPU虛擬化應用

2021-08-23 14:36:26

coredump

2013-06-28 17:47:59

移動應用

2022-11-26 08:16:26

2022-11-02 09:39:51

數據恢復Kubernetes

2021-01-22 05:49:41

數據源思路規劃

2018-05-18 08:20:32

數據治理應用

2012-08-28 09:12:52

App瘦身

2021-04-30 17:02:52

coredump內核故障

2011-09-01 11:12:02

Restaurant 美食應用餐飲應用

2017-02-09 17:30:05

Android應用瘦身

2017-03-02 15:09:29

AndroidAPK瘦身實踐

2011-04-22 11:09:41

華碩家用臺式電腦晶品CP5

2022-01-26 08:47:17

部署應用分布式

2020-06-10 08:55:36

Docker容器工具
點贊
收藏

51CTO技術棧公眾號

精品国产va久久久久久久| 亚洲一区二区三区黄色| free性欧美hd另类精品| 成人深夜在线观看| 日韩av片永久免费网站| 欧美久久久久久久久久久| 福利网站在线观看| 久久久久国产精品麻豆ai换脸 | 亚洲ai欧洲av| 中文字幕日韩免费| 中文av一区| 亚洲免费成人av电影| 五月激情婷婷在线| 国产精品vvv| 国产精品家庭影院| 精品久久久久久亚洲| 中文字幕第99页| 在线精品福利| 日韩在线免费视频| 国产激情第一页| gogo大尺度成人免费视频| 粉嫩老牛aⅴ一区二区三区| 艳母动漫在线免费观看| 九色视频网站在线观看| 床上的激情91.| 国产欧美日韩中文| 日韩精品在线观看免费| 欧美三级视频| 色婷婷久久av| 法国空姐电影在线观看| 白嫩白嫩国产精品| 4438x亚洲最大成人网| 日韩一级在线免费观看| 国产美女高潮在线| 亚洲免费在线视频| 在线免费一区| lutube成人福利在线观看| 97久久超碰精品国产| 97免费资源站| 国产黄色高清视频| 狠狠网亚洲精品| 国产精品视频区| 国产免费www| 久久青草久久| 欧美在线中文字幕| 日韩av大片在线观看| 韩国亚洲精品| 欧美激情a∨在线视频播放 | 亚洲国产精品欧美一二99| 日韩 欧美 自拍| 日韩在线资源| 中文字幕亚洲在| 在线精品日韩| 黄网址在线观看| 一色屋精品亚洲香蕉网站| 亚洲精品日韩精品| 91这里只有精品| 欧美国产成人精品| 亚洲一区二区三区精品动漫| 黄色片视频在线观看| 久久精品免费在线观看| 日本一区视频在线播放| 一级毛片视频在线| 国产精品久久久久久户外露出| 亚洲视频在线二区| 黄色在线免费看| 日韩一区在线看| 欧美日韩中文字幕在线播放| 婷婷色在线资源| 亚洲一区二区三区四区在线免费观看 | 亚洲 欧美 精品| 久久久精品综合| 日韩精品一线二线三线| 免费av网站在线观看| 亚洲欧美一区二区三区国产精品 | 国产美女一区| 国产精品永久免费在线| 国产女人高潮毛片| 成人免费看黄yyy456| 精品一区在线播放| av在线电影观看| 亚洲美女免费视频| 国产av人人夜夜澡人人爽麻豆| 日本不卡免费高清视频在线| 在线观看免费亚洲| 青青草精品在线| 日本一区福利在线| 中文字幕亚洲综合久久| 男女羞羞免费视频| 亚洲欧美清纯在线制服| 国产精品日韩欧美| 日韩在线观看视频一区二区三区| 久久久久亚洲综合| 亚洲五码在线观看视频| 精品众筹模特私拍视频| 色婷婷av一区二区三区大白胸| 国产三级精品三级在线| 国产成人一二| 日韩中文字幕精品视频| 日本午夜精品理论片a级app发布| 小嫩嫩精品导航| 95av在线视频| 九色国产在线观看| 亚洲在线视频免费观看| 黄色一级免费大片| 豆花视频一区二区| 日韩一区视频在线| 你懂的国产在线| 国产一区二区三区免费观看| 欧美不卡三区| 欧美xxxx黑人又粗又长| 欧美在线观看一区二区| 在线观看亚洲免费视频| 四季av一区二区三区免费观看 | 久久精品视频6| 日本大胆欧美人术艺术动态| 国产精华一区| 日本精品一区二区三区在线播放| 精品成人av一区| 人妻巨大乳一二三区| av伊人久久| 欧美一区二区三区免费视| aaa国产视频| 国产精品国产自产拍高清av王其| 国产91对白刺激露脸在线观看| 91国产一区| 色多多国产成人永久免费网站 | 日韩欧美一二三区| 极品久久久久久久| 久久一区视频| 久久久久九九九| aa国产成人| 精品剧情v国产在线观看在线| 亚洲女人毛茸茸高潮| 日一区二区三区| 久久亚洲精品欧美| 日本在线影院| 亚洲激情第一页| 久久国产在线观看| 懂色一区二区三区免费观看| 国产日产欧美一区二区| 国产电影一区二区| 久久精品男人天堂| aaa一区二区| 一区二区三区四区蜜桃| 四虎国产精品永久免费观看视频| 国产高清久久| 成人美女av在线直播| 色大18成网站www在线观看| 欧美日韩aaaaaa| 中文字幕求饶的少妇| 美女网站视频久久| 一本一本a久久| 国产精品欧美一区二区三区不卡 | 亚洲男人av| 国产丝袜高跟一区| 日本中文字幕在线观看视频| 国产欧美一区二区精品忘忧草| 国产熟人av一二三区| 欧美系列电影免费观看| 国产精品视频99| 精品176二区| 日韩欧美黄色影院| 日产精品久久久久| 久久先锋影音av| 在线观看av网页| 国产精品久久久久久久| 亚洲综合在线做性| 国产精品一品| 亚洲免费视频一区二区| 日韩乱码一区二区三区| 综合婷婷亚洲小说| jjzz黄色片| 男人天堂欧美日韩| 亚洲欧美日韩另类精品一区二区三区| 青青久久精品| 欧美激情亚洲国产| 蜜桃视频在线免费| 欧美嫩在线观看| 久久国产免费观看| 久久精品亚洲精品国产欧美 | 一区二区三区在线免费看| 国模精品系列视频| 懂色av中文在线| 欧美老年两性高潮| av成人免费网站| 99久久精品国产精品久久| 国产在线精品91| 日韩大片在线观看| 国产亚洲情侣一区二区无| 秋霞国产精品| 欧美激情一区二区三区高清视频| 日韩欧美在线番号| 91精品国产综合久久精品麻豆| 国产乡下妇女做爰| 中文字幕精品三区| 亚洲av人人澡人人爽人人夜夜| 青青草原综合久久大伊人精品优势| 欧美美女黄色网| blacked蜜桃精品一区| 99久热re在线精品996热视频| 高清不卡亚洲| 色综合天天狠天天透天天伊人 | 中文字幕免费不卡| 成人做爰www看视频软件| 日韩高清国产一区在线| 成人黄色大片网站| 爽成人777777婷婷| 免费成人深夜夜行视频| 这里视频有精品| 成人精品视频99在线观看免费| 台湾佬中文娱乐网欧美电影| 精品国产一区二区在线| 美丽的姑娘在线观看免费动漫| 欧美va天堂va视频va在线| 最新国产中文字幕| 色综合久久久久综合| 国产精品6666| 亚洲人成网站精品片在线观看| 91成人精品一区二区| 91在线看国产| 丰满人妻一区二区三区免费视频棣 | 中文字幕 久热精品 视频在线 | 欧美激情a∨在线视频播放| 日本在线视频站| 国产一区二区精品丝袜| 亚洲色欧美另类| 精品国免费一区二区三区| 国产精品高潮呻吟av| 欧美中文字幕亚洲一区二区va在线| 亚洲综合一二三| 午夜不卡av免费| 久久久久久天堂| 亚洲理论在线观看| 人人澡人人澡人人看| 国产精品私人自拍| 亚洲AV无码成人精品区明星换面| 91香蕉国产在线观看软件| 日韩av无码一区二区三区不卡| 高清成人免费视频| 亚洲成人福利视频| 高清av一区二区| 日本一区二区免费视频| 懂色av一区二区夜夜嗨| 国产精品亚洲一区二区无码| 国产成人精品亚洲日本在线桃色 | 视频精品国内| 91九色蝌蚪成人| 日韩中文字幕视频网| 波多野结衣久草一区| 一区二区三区四区视频免费观看 | 99成人超碰| 青青草免费在线视频观看| 亚洲精品一二三区区别| 中文字幕在线中文| 极品日韩av| 北条麻妃在线视频观看| 国产麻豆综合| the porn av| 精久久久久久久久久久| 免费在线观看日韩av| 9l国产精品久久久久麻豆| 波多野结衣办公室33分钟| 久久精品日产第一区二区三区高清版| 蜜桃无码一区二区三区| 国产精品免费网站在线观看| 亚洲天堂一级片| 亚洲一线二线三线视频| av黄色在线看| 欧美色视频在线| 国产男女裸体做爰爽爽| 精品国产乱码久久久久久免费 | 爽爽爽爽爽爽爽成人免费观看| 很黄的网站在线观看| 久久久久久久久久国产| 亚洲精品一区| 亚洲mm色国产网站| 久久黄色影视| 亚州欧美一区三区三区在线| 亚洲高清资源在线观看| 成人精品视频在线播放| 久久高清国产| 中文国产在线观看| 91啪亚洲精品| 久久久精品少妇| 午夜欧美视频在线观看| 最近中文字幕在线观看视频| 日韩精品一区二区在线| 国产高清视频在线播放| 欧美裸体xxxx极品少妇| gogo亚洲高清大胆美女人体| 成人女保姆的销魂服务| 奇米影视777在线欧美电影观看| 午夜精品一区二区三区在线观看| 欧美激情视频一区二区三区免费| 免费在线观看亚洲视频| 韩国午夜理伦三级不卡影院| 超碰97在线资源站| 亚洲欧美区自拍先锋| 日本中文字幕第一页| 日韩一本二本av| caoporn国产精品免费视频| 欧美激情久久久久| 久久99久久久精品欧美| 久久人人97超碰人人澡爱香蕉| 久久久久久久久99精品大| 亚洲国产精品久久久久爰色欲| 国产精品1区2区3区在线观看| 亚洲自拍偷拍图| 午夜一区二区三区视频| 国产乱码精品一区二区三区精东| 精品无人国产偷自产在线| 91高清在线观看视频| 国产精品一区二区性色av| 免费电影一区二区三区| 国产一区二区三区小说| 狠狠狠色丁香婷婷综合久久五月| 91视频免费观看网站| 亚洲高清免费在线| 国产成人精品一区二区无码呦| 中文字幕在线看视频国产欧美| aa级大片免费在线观看| 91在线观看网站| 久久久久久久久久久久久久久久久久| 免费日韩视频在线观看| proumb性欧美在线观看| 国产精品111| 欧美大片在线观看一区二区| 黄av在线播放| 91精品久久久久久久久不口人| 国内黄色精品| 日韩精品无码一区二区三区免费| 91亚洲精品久久久蜜桃| 久久精品国产亚洲AV无码男同| 日韩欧美一区二区在线视频| 日本中文在线观看| 国产欧美一区二区| 日韩精品水蜜桃| 中文字幕第88页| 国产精品萝li| 91久久国语露脸精品国产高跟| 日韩在线视频一区| 欧美美女被草| 亚洲一区二区精品在线观看| 麻豆传媒一区二区三区| 日韩在线视频免费看| 欧美精品一级二级| caopon在线免费视频| 2020国产精品久久精品不卡| 亚洲影视一区| 中文字幕av一区二区三区人妻少妇 | 精品久久久久久综合日本| 亚洲久久成人| 亚洲男人在线天堂| 欧美视频在线观看 亚洲欧| 十九岁完整版在线观看好看云免费| 国外成人在线播放| 亚洲v天堂v手机在线| 成人精品小视频| 中文在线一区二区| 国产精品欧美综合亚洲| 久久久精品一区二区| 伊人精品久久| 欧美 丝袜 自拍 制服 另类| 久久综合国产精品| 在线播放成人av| 久久高清视频免费| 丁香一区二区| 天天碰免费视频| 亚洲免费观看高清完整版在线观看 | 日韩精品成人在线观看| 国产精品一线二线三线| 久久婷婷国产综合精品青草| 中文在线字幕免费观| 欧美精品一区二区三区国产精品| 女同另类激情重口| 三级在线视频观看| 一区二区三区在线免费播放| 天天操天天射天天| 国产精品尤物福利片在线观看| 欧美日韩a区| 免费福利视频网站| 日韩欧美自拍偷拍| 亚洲欧洲日本韩国| 国产精品99久久久久久大便| 成人国产精品免费观看动漫| 欧美成人一区二区三区四区| 久久精品久久久久久国产 免费| 成人黄色av网址| 天天干在线影院| 亚洲一区日韩精品中文字幕| 国产精品一区二区婷婷| 99re在线观看| 日韩电影一区二区三区四区| 国产av 一区二区三区| 亚洲欧美日韩中文在线| 亚洲一区二区三区中文字幕在线观看| 97国产精东麻豆人妻电影| 亚洲精品午夜久久久| 黄视频在线播放|