日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS 优化 - 瘦身

發布時間:2023/12/8 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 优化 - 瘦身 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

iOS 優化將是一個專題,其中會包括包體積優化(瘦身)、啟動時間優化、UI 優化等等。那么這個專題的開篇就從瘦身開始吧。

APP 的大小是分為 APP 下載大小和安裝大小兩個概念的。

  • 下載大小是指 App 壓縮包(也就是 .ipa 文件)所占的空間,用戶在下載 App 時,下載的是壓縮包,這樣做可以節省流量;

  • 當壓縮包下載完成后,就會自動解壓,解壓過程也就是通常所說的安裝過程;安裝大小就是指壓縮包解壓后所占用的空間。

用戶在商店看到的大小是安裝大小。如果想看安裝包在各機型上的下載、安裝大小可以在 App Store Connect 后臺查看。

下載及安裝大小示意圖

App Store OTA 下載大小限制:

雖然蘋果歷年都會調整 App 下載大小,由之前的 100M 到后來的 150M 再到現在的 200M。如今,App 下載大小超出 200 MB 時 ,會出現兩種情況:

  • iOS 13 以下的用戶,無法通過蜂窩數據下載 App;

  • iOS 13 及以上的用戶,需要手動設置才可以使用蜂窩網絡下載 App。

Apple __TEXT 段大小限制:

  • iOS 7 之前,二進制文件中所有的 __TEXT 段總和不得超過 80 MB;

  • iOS 7.X 至 iOS 8.X,二進制文件中,每個特定架構中的 __TEXT 段不得超過 60 MB;

  • iOS 9.0 之后,二進制文件中所有的 __TEXT 段總和不得超過 500 MB。

順便給大家說下蘋果將下載大小限制由 100M 調整到 150M 的原因是什么?主要原因就是 Uber 當年用 Swift 重構開發 APP 時,隨著業務的增長,后期發現實在無法再將 APP 尺寸降到 100M 以下,只能聯系蘋果讓其將下載大小提升到 150M,同時蘋果的 Swift 團隊還幫助添加了一些編譯器選項 (-Osize)。

該文主要研究的是如何降低 APP 的下載大小的,因為文章篇幅較長,如果大家不想細讀,可以直接跳過細節展開看每個小節的結論部分。

瘦身方向

將 ipa 安裝包后綴名改為 zip,將其解壓,顯示.app 包內容后,就可以很直觀的看到安裝包的組成部分。一般會包括以下幾個部分:

  • Exectutable: Mach-O 可執行文件

  • Resources:資源文件
    • 圖片資源:Assets.car/bundle/png/jpg 等

    • 視頻 / 音頻資源:mp4/mp3 等

    • 靜態網頁資源:html/css/js 等

    • 視圖資源:xib/storyboard 等

    • 國際化資源:xxx.lproj

    • 其他:文本 / 字體 / 證書 等

  • Framework:項目中使用的動態庫
    • SwiftSupport: libSwiftxxx 等一系列 Swift 庫

    • 其他依賴庫:Embeded Framework

  • Pulgins:Application Extensions
    • appex:其組成大致與 ipa 包組成一致

其實核心組成部分便是資源文件Mach-O 可執行文件兩部分,這兩個部分便是我們的主要瘦身方向。在瘦身過程中,應該盡量使用 ROI 最高的優化手段,付出更少的精力,得到更多的收益。

在介紹我們作為開發者的優化方向之前,我們先看一下蘋果自身對于 APP 下載大小的優化有哪些吧,我們要充分利用 Apple 自身的優化機制。

App Thinning(蘋果自身優化)

App Thinning 是指 iOS9 以后引入的一項優化,Apple 會盡可能,自動降低分發到具體用戶時所需要下載的 App 大小。其主要包含以下三項功能。

Slicing(應用分割)

當向 App Store Connect 上傳 .ipa 后,App Store Connect 構建過程中,會自動分割該 App,會專門針對不同的設備來選擇只適用于當前設備的內容(主要是架構和資源)以供設備下載。其差異性主要是體現在架構(32 位還是 64 位)和資源(@1x、@2x 還是 @3x)等方面上。

其中架構方面開發者不需要去控制,但是對于資源來說要求圖片在 Asset Catalog 管理,如果直接放在 Bundle 中,則不會被優化。

關于 Asset Catalog 相關知識點及優化結論可見下文 Assets Catalog 章節。

總結:盡量將圖片等資源交給Asset Catalog管理。

Bitcode(中間碼)

Bitcode 是一個編譯好的程序的中間表示形式(IR)。上傳到 App Store Connect 中的包含 Bitcode 的 App 將會在 App store 中進行鏈接和編譯。蘋果會對包含 Bitcode 的二進制 app 進行二次優化,而不需要提交一個新的 app 版本到 app store 中。屬于 Apple 內部的優化,但需要注意;

  • 全部都要支持。我們所依賴的靜態庫、動態庫、Cocoapods 管理的第三方庫,都需要開啟 Bitcode。否則打包會編譯失敗,具體錯誤會在 Xcode 中指出;

  • Crash 定位。開啟 Bitcode 后最終生成的可執行文件是 Apple 自動生成的,同時會產生新的符號表文件,所以我們無法使用自己包生成的 DYSM 符號化文件來進行符號化,而是使用使用 Apple 生成的 DYSM 符號化文件;

  • Flutter 不支持 Bitcode,如果項目是包含 Flutter 框架的,就無法使用這種方式;

  • BitCode 在 iOS 開發中是可選的,在 watchOS 開發中是必須要選擇的, Mac OS 是不支持 BitCode 的。

開啟方式: Build Settings -> Enable Bitcode -> 設置為 YES 。

如果想對 Bitcode 了解更深入一些,可以看下我之前的一篇博文--iOS 編譯簡析。

結論:可根據項目實際情況決定是否開啟,如果項目混編了 Flutter、依賴的部分庫不支持 Bitcode 以及不想處理一遍 DYSM 符號化,就不要進行開啟,否則可以選擇開啟。

On-Demand Resources(隨需應變資源)

On-Demand Resource 即一部分圖片可以被放置在蘋果的服務器上,不隨著 App 的下載而下載,直到用戶真正進入到某個頁面時才下載這些資源文件。

應用場景:相機應用的貼紙或者濾鏡、關卡游戲等。

開啟方式: Build Settings -> Enable On Demand Resources -> 設置為 YES(默認開啟)。

設置資源的 Tag 類型,種類包括:

  • Initial install tags:資源和 App 同時下載。在 App Store 中,App 的大小計算已經包含了這部分資源。當沒有 NSBundleResourceRequest 對象訪問它們時,它們將會從設備上清除。

  • Prefetch tag order: 在 App 安裝后開始下載,按照預加載列表中的順序依次下載。

  • Dowloaded only on demand: 只有在 App 中發出請求時才會下載。

如果項目中有 Demand Resources,則最后生成的安裝包結構大致層級為:

  • 項目名.app

  • OnDemandResources 文件夾

具體使用方法這里就不展開講了。

我們在下載安裝包時,不會下載 OnDemandResources 文件夾中的資源,起到減小下載安裝包尺寸的目的。

結論:該方式與下文提到的資源遠程化本質一樣,只不過一個是放在自己服務器,一個是放在蘋果服務器,可根據自己項目實際情況選擇是否使用。

資源文件瘦身

資源文件優化方向比較多,相對優化 Mach-O 可執行文件來講,風險也比較小。

去除無用 / 重復的資源

業務的迭代開發,出現無用的圖片資源是比較正常的,我們可以借助工具找出哪些圖片資源沒有被使用過。推薦下面兩款工具:

  • LSUnusedResources:可視化客戶端工具;

  • FengNiao:命令行工具,可嵌入到 Run Script 中或者在 CI 系統中使用,支持的模式匹配更加強大。

因為這類工具的原理都是在相關文件(.m、.swift 等等)中利用正則表達式檢測是否有圖片名稱的字符,所以存在以下問題。 問題點:

  • 如果代碼中使用的圖標名稱是拼接而成的,就會誤以為相關圖片是廢棄圖片;

  • 如果 Assets.xcassets 文件中直接修改了圖片的名字,也會認為相關圖片可能是廢棄圖片;

可以利用Duplicate Photos從內容上檢測重復/相似圖片。

引申一下:

之所以要使用自動化工具來檢測重復資源的原因是因為資源是 弱類型,我們在項目迭代過程 中手動去維護是相當麻煩的一個過程。轉換一下思維,如果資源變成強類型了, 那我們維護起來就相當容易了。目前就有這樣一個工具 R.swift一定意義上將資源變成強類型, 類似于 Android 開發中的 R 文件。

可利用fdupes查找項目中的重復文件。其原理是對比不同文件的簽名,簽名相同的文件就會判定為重復資源。

mac 上可直接通過 brew install fdupes 進行安裝,可以使用 fdupes -Sr 文件夾名稱 來查看所有涉及到的目錄和子目錄中的重復文件的大小,其余相關指令可自行查閱,不建議使用 fdupes 相關命令直接刪除搜索出來的重復資源,風險比較高。

結論:考慮到工具的不準確性,可以利用工具粗檢測一下哪些資源沒有被使用,然后經人工確認后才統一進行刪除。對于工具無法檢測出來的資源,就只能人工進行篩查了,可每人分配幾個模塊,提高效率。

資源壓縮

請注意:這里的資源不包括 Assets Catalog 管理的資源。

PNG 資源

這一部分涉及前因后果比較多,為保證大家能看懂,會先鋪墊一些原理性知識,請耐心閱讀。

Xcode 的 Build Setting 提供的給我們兩個編譯選項來幫助壓縮 PNG 資源 。

Remove Text Medadata From PNG Files(默認開啟):能幫助我們移除 PNG 資源的文本字符,比如圖像名稱、作者、版權、創作時間、注釋等信息。 Compress PNG Files(默認開啟):當設置為 YES 后,打包的時候會利用 pngcrush 工具自動對項目中所有 PNG 圖片進行無損壓縮以及修改文件格式,該工具是開源的--pngcrush 地址。

Compress PNG Files 設置為 YES 后,XCode 會調用該路徑的腳本 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/iphoneos-optimize。

pngcrush 工具在其同級目錄存放,iphoneos-optimize 腳本中關于 PNG 壓縮的內容如下:

sub?optimizePNGs?{my?$name?=?$File::Find::name;if?(?-f?$name?&&?$name?=~?/^(.*)\.png$/i)?{my?$crushedname?=?"$1-pngcrush.png";//?$PNGCRUSH便是pngcrush工具路徑my?@args?=?(?$PNGCRUSH,?"-q",?"-iphone",?"-f",?"0"?);if?(?$stripPNGText?)?{push?(?@args,?"-rem",?"text"?);}push?(?@args,?$name,?$crushedname?);if?(system(@args)?!=?0)?{print?STDERR?"$SCRIPT_NAME:?Unable?to?convert?$name?to?an?optimized?png!\n";return;}unlink?$name?or?die?"Unable?to?delete?original?file:?$name";rename($crushedname,?$name)?or?die?"Unable?to?rename?$crushedname?to?$name";print?"$SCRIPT_NAME:?Optimized?PNG:?$name\n";} }

從內容上來看,腳本是通過png 后綴名來判斷是否為 png 圖片,如果圖片改變后綴名,則該圖片則不會被 pngcrush 工具進行處理。

我們可以通過下面命令手動使用 pngcrush 工具。

#?image.png?經編碼后?生成?image1.png xcrun?-sdk?iphoneos?pngcrush?-iphone?-f?0?image.png?image1.png#?image.png?經解碼后?還原成?image1.png #?即使還原回去與原圖片也不會完全一致,這里就不展開描述了 xcrun?-sdk?iphoneos?pngcrush?-revert-iphone-optimizations?image.png?image1.png

pngcrush 工具編碼結果主要變化內容如下:

  • 在 IHDR 塊之前插入了 CgBI 塊來表示這種格式

  • 修改 IDAT 塊中的數據,去除 zlib 壓縮頭和 Adler-32 校驗和;

  • 八位真彩色圖像按 BGR/BGRA 順序存儲,而不是按 IHDR 塊中指示的 RGB 和 RGBA 順序存儲

  • 圖像像素使用預乘 alpha;

  • 修改后的文件使用。png 為有效圖像定義的文件擴展名以及內部文件結構,但符合 PNG 的查看和編輯軟件不再能夠處理它們;

  • 增加了一個 iDot 數據塊,是 Apple 自定義的數據塊,暫時不知其作用;

其本質是使正常的 png 圖片變成了一個優化后的 CgBI 格式的 png??梢岳胮ngcheck查看處理前的圖片信息,利用pngdefry查看處理后的圖片信息(其還可以將 CgBI 格式的 png 還原回去,這個功能跟 pngcrush 工具解碼功能類似)。

從上述變化內容來看, pngcrush 工具編碼過程并不是簡單的壓縮數據,更重要的是對文件格式做了修改。因為 iPhone 中,圖像是以 BGRA 格式在內存中處理的,所以修改后的格式變成了 iPhone 能更方便處理的格式,加快處理速度。

根據我自己測試的壓縮效果來看,對于 Bundle 中放置的 png 圖片,經過 pngcrush 的處理,大小不降反增,目前暫時沒有找到哪些具體因素影響其壓縮效果。

pngcrsuh測試效果對比圖

結論:Compress PNG Files 雖然是壓縮 PNG,但其最主要的目的并不是為了壓縮圖片大小, 而是將 PNG 轉換成 iOS 更容易處理、更塊速度的去識別的格式,可以根據項目在開啟、關閉兩種情況下的打包大小,自行取舍。

非 PNG 資源

非 PNG 資源壓縮包含兩種方式:

  • 直接通過一些壓縮工具將資源進行壓縮,格式保持不變,如一些圖片資源、音視頻資源等,圖片壓縮工具下文會有介紹。

  • 還有一些文本資源,如 json 文件、html 文件等,無法使用上述的方式壓縮,可以采用壓縮成 zip 等壓縮格式的方式,可分為三步:
  • 壓縮階段:在 Build Phase 中添加腳本,構建期間對白名單內的文本文件做 zip 壓縮;

  • 解壓階段:在 App 啟動階段,在異步線程中進行解壓操作,將解壓產物存放到沙盒中;

  • 讀取階段:在 App 運行時,hook 讀取這些文件的方法,將讀取路徑從 Bundle 改為沙盒中的對應路徑;

結論:可選用合適的壓縮工具對音視頻、非 Assets Catalog 管理的圖片資源進行壓縮。對于一些比較大的文本文件可選用第二種運行時解壓讀取的方式,如 Lottie 動畫的 json 文件。

Assets Catalog

Assets Catalog 涉及的技術點比較多,后續可能會單獨開一篇博文專門講這一部分內容。

去除 @1x 圖片

@1x 圖是 iPhone 3Gs 用的,iPhone 4 開始使用 @2x 圖了,iPhone 6p 開始使用 3x 圖。

結論:可以刪除 Assets 中所有 @1x 的圖片資源。

圖片壓縮

Assets.car 文件是工程中 Asset Catalog 的構建產物。Xcode 構建過程中,在 compile asset catalog 節點時, 構建 Asset Catalog 的工具 actool 會首先對 Asset Catalog 中的 png 圖片進行解碼,得到 Bitmap 數據,然后再運用 actool 的編碼壓縮算法進行編碼壓縮處理。

如果你開發時放入到 Assets 中的是 jpg 格式文件,在最終生成的 Assets.car 文件中也會成為 png 圖片。

xcrun assetutil --info Assets.car 。可使用該命令檢查 Assets.car 中每張圖片使用的編碼壓縮算法。

目前 actool 會使用的壓縮算法包括 lzfse 、 palette_img 、 deepmap2 、 deepmap_lzfse 、 zip ,影響其使用何種算法的因素包括 iOS 系統版本ASSETCATALOG_COMPILER_OPTIMIZATION 設置(位于 Build Setting 中)等;

  • iOS 11.x 版本:對應的壓縮算法為 lzfse、zip;

  • iOS 12.0.x - iOS 12.4.x: 對應的壓縮算法為 deepmap_lzfse、palette_img;

  • iOS 13.x: 對應的壓縮算法為 deepmap2 ;

按照壓縮比來講 lzfse < palette_img ~= deepmap_lzfse < deepmap2

如果設置了 ASSETCATALOG_COMPILER_OPTIMIZATION 為 space 那么在低版本 iOS 系統上,使用 lzfse 壓縮算法的圖片會變成 zip 的算法,可減少 iOS 11.x 及以下的 iOS 設備圖片的占用大小。其他 iOS 版本的壓縮算法不受這個配置的影響。

  • 無損壓縮通過變換圖片的編碼壓縮算法減少大小,但是不會改變 Bitmap 數據,對于 actool 來說,它接收的輸入(Bitmap 數據)沒有改變,所以無損壓縮無法優化 Assets.car 的大小,但是可以用來優化非 Asset Catalog 管理的圖片。

  • 使用有損壓縮方式并采用合適的壓縮方法是可以減小 Assets.car 的大小??梢詫D片采用RGB with palette(調色板算法)編碼方式來達到圖標壓縮的效果,這種編碼方式進行壓縮特別適合內部顏色相對接近的圖標。但是需要注意如果圖片中有半透明效果,這種壓縮方式可能會導致半透明的地方出現噪點,所以壓縮之后請注意仔細檢查一下。

RGB with palette 編碼的得到的字節流首先維護了一個顏色數組。顏色數組每個成員用 RGBA 四個分量維護一個顏色。圖像中的每個像素點則存儲顏色數組的下標代表該點的顏色。顏色數組維護的顏色種類和數量由圖片決定,同時可以人為的限制顏色數組維護顏色的種類的上限,默認為最大值 256 種,具體原理詳見底部相關鏈接 --【Palette Images】;

使用下文提到的 ImageOptim-CLI 工具,我們可以改變圖片的編碼方式為 RGB with palette,命令如下:

imageoptim -Q --no-imageoptim --imagealpha --number-of-colors 16 --quality 40-80 ./1.png

--number-of-colors:控制顏色數組維護顏色的數量; --quality:控制圖片的質量變為原來的百分比; 命令中的數值可以在顯著減少包大小的同時維持肉眼看不到的質量變化。

以圖片資源舉例,我們可以使用工具對其進行壓縮,推薦幾款工具如下:

  • TinyPng:網頁工具,有損壓縮;

  • TinyPNG4Mac:TinyPng 的客戶端工具,無需聯網使用瀏覽器;

  • ImageOptim: 客戶端工具,支持無損壓縮及有損壓縮兩種形式,可自定義設置壓縮方式。

  • ImageOptim-CLI:Mac 可使用brew install imageoptim-cli安裝,其會根據你的指定,選擇性調用 JPEGmini、ImageAlpha、ImageOptim 等工具,實現中間過程自動化。

如果想將 car 文件中的 png 提取出來,可以使用Asset Catalog Tinkerer。

引申一下,好的工具是開發利器,之前整理了一些好用的 Mac 效率工具,可見Mac 效率軟件。

結論:能用 Asset Catalogs 管理的資源,盡量使用 Asset Catalogs 來管理。使用 Asset Catalog 管理圖片不要對圖片進行無損壓縮,最終起不到壓縮效果,如果想要壓縮,可以采用上面所提到的有損壓縮方式,并檢查壓縮后的效果。

圖片資源使用 Webp 格式

谷歌開源的格式,Webp 壓縮率比較高,同時支持有損和無損兩種壓縮模式,可以帶來更小的圖片體積,而且肉眼看不出差異。根據 Google 的測試,無損壓縮后的 WebP 比 PNG 文件少了 26%的體積,有損壓縮后的 WebP 圖片相比于等效質量指標的 JPEG 圖片減少了 25%~34% 的體積。

但是 WebP 與 JPG 以及 PNG 相對比,在編解碼的 CPU 消耗以及解碼時間上會差一些,因為編碼是用戶上傳圖片時的一次性操作,并且編碼過程是在服務器后臺進行,對用戶的影響不大,對用戶影響大的主要是解碼過程,會導致圖片加載速度慢一些。所以,我們需要根據項目的實際情況在性能和體積上做取舍。

如果從服務器帶寬以及流量來看,因為圖片的體積變小,所以會減小帶寬,降低成本。

推薦二種轉 WebP 格式的方法

  • iSpart:騰訊出品,GUI 工具;

  • webp 工具: 在 Mac 下,可以使用 Homebrew 安裝 WebP 工具--brew install webp;

iOS 原生并不支持 WebP 格式加載,需要引入 SDWebImage/WebP,或者進行自研。

結論:該方案適合整個大前端及后端統一調整,整體進行優化,如果是單一的客戶端進行調整,可能達不到最優效果。

資源動態化

除了上文提到的使用 On-Demand Resources 方式將部分資源放在蘋果服務器之外,我們也可以將一些本地資源轉移到自己的服務器上去。這樣不僅降低了安裝包大小,也將這些資源動態化了。適合放在服務器的資源應包含以下幾個特性:

  • 不影響首屏加載體驗;

  • 變化頻率較高;

  • 尺寸很大;

如一些 Banner 廣告圖、主題資源、音視頻資源、H5 資源資源。

結論:可盡量將滿足上述特性的資源放置在服務器。

圖標優化

  • 使用 tint color 精簡單色圖標;

  • 使用圖標字體(IconFont)替換單色圖標;

  • 將部分相似圖標進行整合;

結論:如果項目有相對的設計規范及標準圖標樣式,使用圖標字體是一個很好的方案。剩余的優化點根據項目實際情況決定是否使用。

編譯選項改進

Xcode 支持編譯器層面的一些優化選項,通過修改 Build Setting 的一些相關配置,可以讓我們介于更快的編譯速度和更小的二進制大小并且更快的執行速度之間自由選擇想要進行的優化粒度,這些選項有的會影響資源文件,有的會影響可執行文件,因為內容比較多,所以起一個獨立的章節描述。

這種方式的性價比很高,改動一項配置,就可能會帶來收益,但是可能具有一定的風險,需要謹慎。

下文中提到的一些 Xcode 默認配置可能在低版本 Xcode 上不是默認配置,如果不是默認,可手動勾選。

去除無用架構

可以在 Build Setting - Excluded Architectures 項設置排除的架構。

先看一下幾種架構的含義:

  • 模擬器 32 位處理器測試需要 i386 架構;

  • 模擬器 64 位處理器測試需要 x86_64 架構;

  • 真機 32 位處理器需要 armv7, 或者 armv7s 架構;

  • 真機 64 位處理器需要 arm64 架構。

armv6armv7armv7sarm64
iPhone
iPhone2
iPhone3G
第一代和第二代 iPod Touch
iPhone4
iPhone4S
iPad1-iPad3,3、4 代 iPod Touch
iPad mini
iPhone5
iPhone5C
iPad4
iPhone 5S 等剩余全部機型

結論:理論上只保留 arm64 架構其實就夠用了,可以去除 armv6 、 armv7 、 armv7s 三種架構。

使用鏈接時優化 LTO(Link-Time Optimization)

可以在 Build Setting - Link-Time Optimization 項設置優化方式

其提供三種選項:

  • No 不開啟鏈接期優化;(默認項)

  • Monolithic 生成單個 LTO 文件,每次鏈接重新生成,無緩存高內存消耗,參數 LLVM_LTO=YES;

  • Incremental 生成多個 LTO 文件,增量生成,低內存消耗,參數 LLVM_LTO=YES_THIN;

LTO 能帶來的優化有:

  • 將一些函數內聯化:不用進行調用函數前的壓棧、調用函數后的出棧操作,提高運行效率與??臻g利用率;

  • 去除了一些無用代碼:如果一段代碼分布在多個文件中,但是從來沒有被使用,普通的 -O3 優化方法不能發現跨中間代碼文件的多余代碼,因此是一個局部優化。但是 Link-Time Optimization 技術可以在 link 時發現跨中間代碼文件的多余代碼;

  • 對程序有全局的優化作用:這是一個相對廣泛的概念。舉個例子來說,如果一個 if 方法的某個分支永不可能執行,那么在最后生成的二進制文件中就不應該有這個分支的代碼。

LTO 會降低編譯鏈接的速度,所以建議在打正式包時開啟; 開啟了 LTO 之后,Link Map 的可讀性明顯降低,多出了很多數字開頭的類(LTO 的全局優化導致的),所以如果需要閱讀 Link Map,可以先關閉 LTO;

LTO 雖然是鏈接期優化,但是仍然需要編譯期參與,加入了 LTO 的編譯出來的 .a 本質是 LLVM 的 BitCode,如果使用未開啟 LTO 構建出來的的 .a 直接是機器碼了。直接鏈接是無法完成 LTO 優化的。

開啟 LTO 之后跨編譯單元的重復代碼會被鏈接器單獨生成以 .lto.o 為后綴的目標文件進行鏈接。尤其是對于 Objc Runtime 需要的一些結構, 比如方法簽名的 literal string、protocol 的結構等有比較大的優化。同時開啟 Oz 和 LTO 可以讓外聯函數都只存在一份能夠最大限度的優化安裝包體積(是全局的優化作用,將已經外聯的函數去重)。如果項目中大量的使用了 Protocol 建議還是開啟這個選項。

結論:可將Link-Time Optimization選項由 NO 改為 Incremental 。

語言編譯優化

OC

OC 關于編譯內聯優化的參數位于 Build Settings -> Apple Clang - Code Generation -> Optimization Level ,選項如下:

  • None[-O0]: 編譯器不會優化代碼,意味著更快的編譯速度和更多的調試信息,默認在 Debug 模式下開啟;

  • Fast[-O, O1]: 編譯器會優化代碼性能并且最小限度影響編譯時間,此選項在編譯時會占用更多的內存;

  • Faster[-O2]:編譯器會開啟不依賴空間 / 時間折衷所有優化選項。在此,編譯器不會展開循環或者函數內聯。此選項會增加編譯時間并且提高代碼執行效率;

  • Fastest[-O3]:編譯器會開啟所有的優化選項來提升代碼執行效率。此模式編譯器會執行函數內聯使得生成的可執行文件會變得更大。一般不推薦使用此模式;

  • Fastest Smallest[-Os]:編譯器會開啟除了會明顯增加包大小以外的所有優化選項。默認在 Release 模式下開啟;

  • Fastest, Aggressive Optimization[-Ofast]:啟動 -O3 中的所有優化,可能會開啟一些違反語言標準的一些優化選項。一般不推薦使用此模式。

結論:使用默認配置即可,無需修改。

Swift

Swift 關于編譯內聯優化的參數位于 Build Settings -> Swift Compiler - Code Generation -> Optimization Level ,可選參數如下。

  • No optimization[-Onone]:不進行優化,能保證較快的編譯速度。默認在 Debug 模式開啟;

  • Optimize for Speed[-O]:編譯器將會對代碼的執行效率進行優化,一定程度上會增加包大小。默認在 Release 模式下開啟;

  • Optimize for Size[-Osize]:編譯器會盡可能減少包的大小并且最小限度影響代碼的執行效率。

Optimize for Size 的核心原理是對重復的連續機器指令外聯成函數進行復用,和函數內聯的原理正好相反。因此,將其開啟,能減小二進制的大小,但同時理論上會帶來執行效率的額外消耗,對性能(CPU)敏感的代碼使用需要評估。

具體官方描述可見Code Size Optimization Mode in Swift 4.1

配合其使用的還有Compliation Mode設置,其含有兩個選項

  • Single File:單個文件優化,可以減少增量編譯的時間,并且可以充分利用多核 CPU,并行優化多個文件,提高編譯速度。但是對于交叉引用無能為力;

  • Whole Module:模塊優化,最大限度優化整個模塊,能處理交叉引用。缺點不能利用多核 CPU 的優勢,每次編譯都會重新編譯整個 Module;

在 Relese 模式下 -Osize 和 Whole Module 同時開啟效果會發揮的最好,從現有的案例中可以看到它會減少 5%~30% 的可執行文件大小,并且對性能的影響也微乎其微(大約 5%)。

結論:將 Release 默認下配置改為 Optimize for Size[-Osize],Compliation Mode選項改為Whole Module

死代碼裁剪

可以在 Build Setting - DEAD_CODE_STRIP 項設置。

在構建完成之后如果是 C、C++ 等靜態的語言的代碼、一些常量定義,如果發現沒有被使用到將會被標記為 Dead code。開啟 DEAD_CODE_STRIP = YES 這些 Dead code 將不會被打包到安裝包中。在 LinkMap 這些符號也會被標記為 <<dead>> 。

該項其實也屬于在清除無用代碼。

結論:默認配置即為 YES,所以使用默認配置即可,無需修改。

去除符號信息

可執行文件中的符號是指程序中的所有的變量、類、函數、枚舉、變量和地址映射關系,以及一些在調試的時候使用到的用于定位代碼在源碼中的位置的調試符號,符號和斷點定位以及堆棧符號化有很重要的關系。

Strip Style

Strip Style 表示的是我們需要去除的符號的類型的選項,其分為三個選擇項:

  • All Symbols: 去除所有符號,一般是在主工程中開啟;

  • Non-Global Symbols: 去除一些非全局的 Symbol(保留全局符號,Debug Symbols 同樣會被去除),鏈接時會被重定向的那些符號不會被去除,此選項是靜態庫 / 動態庫的建議選項;

  • Debug Symbols: 去除調試符號,去除之后將無法斷點調試。

結論:主工程選擇All Symbols,靜、動態庫選擇Non-Global Symbols。

Strip Linked Product

并不是所有的符號都是必須的,比如 Debug Map,所以 Xcode 提供給我們 Strip Linked Product 來去除不需要的符號信息 (Strip Style 中選擇的選項相應的符號),去除了符號信息之后我們就只能使用 dSYM 來進行符號化了,所以需要將 Debug Information Format 修改為 DWARF with dSYM file。

需要注意Strip Linked Product 選項在 Deployment Postprocessing 設置為 YES 的時候才生效,而 Deployment Postprocessing 在 Archive 時不受手動設置的影響,會被強制設置成 YES。

結論:將Deployment Postprocessing設置為 NO,將Strip Linked Product設置為YES,將Release模式的下的Debug Information Format 修改為 DWARF with dSYM file。

Strip Debug Symbols During Copy

與 Strip Linked Product 類似,但是這個是將那些拷貝進項目包的三方庫、資源或者 Extension 的 Debug Symbol 去除掉,同樣也是使用的 strip 命令。這個選項不受Deployment Postprocessing的控制,所以我們只需要在 Release 模式下開啟,不然就不能對三方庫進行斷點調試和符號化了。

Cocoapods 管理的動態庫 (use_framework!) 的情況就相對要特殊一點,Cocoapods 中的的動態庫是使用自己實現的腳本 Pods-xxx-frameworks.sh 來實現拷貝的,所以并不會走 Xcode 的流程,當然也就不受 Strip Debug Symbols During Copy 的影響。當然 Cocoapods 是源碼管理的,所以只需要將源碼 Target 中的 Strip Linked Product 手動設置為 YES 即可。

結論:Strip Debug Symbols During Copy在Release 模式下設置為YES,在Debug模式下設置為false。

Strip Swift Symbols

開啟 Strip Swift Symbols 能幫助我們移除相應 Target 中的所有的 Swift 符號,這個選項也是默認打開的。 這一選項是出現 Xcode 將 xcarchive 包導出成 ipa 文件過程中出現的,不是通過Build Setting設置的。

示意圖

結論:一般默認勾選,如果沒勾選請手動勾選。

選項設置方式優化

大部分項目都會使用 Cocoapods 工具進行管理,Cocoapods 的 project 文件在每次 pod install 或者 pod update 會重置,所以需要 hook pod install 來設置 Pods 中每個 Target 的編譯選項。

post_install?do?|installer|installer.pods_project.targets.each?do?|target|target.build_configurations.each?do?|config|config.build_settings['ENABLE_BITCODE']?=?'NO'config.build_settings['STRIP_INSTALLED_PRODUCT']?=?'YES'config.build_settings['SWIFT_COMPILATION_MODE']?=?'wholemodule'if?config.name?==?'Debug'config.build_settings['SWIFT_OPTIMIZATION_LEVEL']?=?'-Onone'config.build_settings['GCC_OPTIMIZATION_LEVEL']?=?'0'elseconfig.build_settings['SWIFT_OPTIMIZATION_LEVEL']?=?'-Osize'config.build_settings['GCC_OPTIMIZATION_LEVEL']?=?'s'endendend end

Mach-O 可執行文件瘦身

在對 Mach-O 文件進行瘦身優化時,我們可以通過分析 Link Map 文件來給我們一定的數據參考,幫助我們分析 Mach-O 文件的構成。

Link Map 是編譯鏈接時可以生成的一個 txt 文件,它生成目的就是幫助程序員分析包大小。Link Map 記錄了每個方法在當前的二進制架構下占據的空間。通過分析 Link Map,我們可以了解每個類甚至每個方法占據了多少安裝包空間。

開啟 Build setting 中的 Write Link Map File 開關,Xcode 就會生成一份 Link Map 文件。其中生成的 Link Map 文件路徑如下: ~/Developer/Xcode/DerivedData/項目/Build/Intermediates.noindex/項目.build/Debug-iphonesimulator/項目.build/項目-LinkMap-normal-x86_64.txt

如果直接閱讀 Link Map 文件,效率會比較低,也不直觀,我們可以使用一些工具幫助我們分析。

LinkMap 工具地址

LinkMap效果圖

清除無用代碼

通過 AppCode 查找無用代碼

AppCode 提供了非常強大的代碼靜態檢查工具,使用 Inspect Code,可以找到很多代碼優化的地方;

AppCode Inspect

基于源碼掃描

一般都是對源碼文件進行字符串匹配。例如將 A *a、[A xxx]、NSStringFromClass("A")、objc_getClass("A") 等歸類為使用的類,@interface A : B 歸類為 定義的類,然后計算差集。

基于源碼掃描 有個已經實現的工具 -- fui,它的實現原理是查找所有 #import "A" 和所有的文件進行比對。

手動去除

  • 已經下線的陳舊代碼,AB 試驗已經下線的代碼;

  • 通過轉 H5、Hybrid 或者 RN 實現的 Native 功能,可以定期清理;

  • 將部分功能進行重構,以此去除一定的代碼。

多個可執行文件中去除相同代碼

這里的多個可執行文件一般是指 APP 宿主程序與 Extension 程序,如果 APP 宿主程序與 Extension 程序都依賴同一個靜態庫庫時,就會導致兩個可執行文件中都包含相同的代碼;個人覺得有兩種解決方案:

  • 考慮到 Extension 程序相對宿主程序來說功能較小,可盡量使用原生功能,不接入三方庫;

  • 如果想要接入同一份庫,可將該庫以動態庫的方式引入,最終兩個可執行文件會動態鏈接同一份庫,避免了重復代碼;

結論:根據項目實際情況選用解決方案。

更多優化

Pod

使用 resource_bundles 配合 xcassets 的方式來集成各個插件中的資源文件,因為 resource_bundle 中的資源在構建期能經過 Xcode 的優化,而 resource 中的資源則不能。并且這種形式可以將每個 pod 的資源放在自己的 Bundle 中,更方便管理。

結論:自定義 Pod 如果含有資源,盡量使用 resource_bundle 的方式引用資源。

編碼素質

  • 代碼復用,禁止無腦拷貝代碼,共用代碼下沉為底層組件;

  • 重復功能的框架使用一套;

  • 不要因為一個很小的功能就引入一個框架,或者有類似輕量級框架時轉而選擇一個功能強大但重量級框架;

  • ...

  • 結論:這一部分需要從提升個人編碼素質、團隊文化以及團隊管理等方面入手。

    其他

    還有一些優化方式,如二進制段壓縮,__TEXT 段遷移等方式,大家可以去尋找相關的資料查看,這里只簡單介紹相關的原理。

    • 二進制段壓縮:Mach-O 文件中并不是每個段 / 節在程序啟動的第一時間都要被用到??梢栽跇嫿ㄟ^程中將 Mach-O 文件中的這部分段 / 節壓縮,然后只要在這些段被使用到之前將其解壓到內存中,就能達到了減少包大小的效果,同時也能保證程序正常運行。

    • **TEXT 段遷移:將可執行文件的 **TEXT 段中的部分節移動到其它的段,提高了可執行文件的壓縮效率。具體可見相關鏈接中【今日頭條優化實踐:iOS 包大小二進制優化,一行代碼減少 60 MB 下載大小】;

    • ...

    最后

    本文主要歸納總結了一些常用的瘦身方法,當然不同的項目需求以及業務場景都會產生一些對應的瘦身方法,大家可以根據自己的業務特性去尋找一些更好更優的瘦身技巧。

    最后,祝大家周末愉快!

    Let's be CoderStar!

    相關鏈接

    • 我在 Uber 親歷的最嚴重的工程災難

    • iOS 安裝包瘦身實踐

    • 今日頭條 iOS 安裝包大小優化 - 新階段,新實踐

    • 干貨|今日頭條 iOS 端安裝包大小優化—思路與實踐

    • 今日頭條優化實踐: iOS 包大小二進制優化,一行代碼減少 60 MB 下載大小

    • 探究 WebP 一些事兒

    • Palette Images

    • iOS PNG 使用指南

    • iOS 減包實戰:Compress PNG Files 作用分析

    • iOS App 瘦身減肥記

    • iOS 安裝包瘦身 (上篇)

    • iOS 安裝包瘦身(下篇)


    有一個技術的圈子與一群同道眾人非常重要,來我的技術公眾號,這里只聊技術干貨。

    微信公眾號:CoderStar

    ?

    總結

    以上是生活随笔為你收集整理的iOS 优化 - 瘦身的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    午夜av影院| 日日碰夜夜爽 | 99精品欧美一区二区蜜桃免费 | 国产探花视频在线播放 | 欧美成人性战久久 | 国产精品成人久久久 | av亚洲产国偷v产偷v自拍小说 | 伊人网av | 99精品免费视频 | 人人视频网站 | 国产精品美女毛片真酒店 | 日韩av资源在线观看 | 91视频免费网址 | 久草视频在线观 | av免费片| 午夜手机电影 | 久久天堂网站 | 欧美另类z0zx | .国产精品成人自产拍在线观看6 | 欧美日韩国产在线精品 | 中文字幕在线观看第一页 | 国产精品成人一区二区三区 | 日本性生活免费看 | 黄在线| 干天天 | 日韩精品一区二区三区水蜜桃 | 人人干,人人爽 | 免费国产在线观看 | 国产在线观看黄 | 久久99精品国产99久久6尤 | 日韩亚洲欧美中文字幕 | 99精品久久久久久久 | 一级淫片a| 黄网站污 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 国产视频在线观看一区二区 | 人人干人人添 | 97视频在线观看免费 | 夜色在线资源 | 爱射综合| av免费看看| 亚洲天堂网站视频 | 九九九在线观看 | www久草| 天天摸天天舔天天操 | 5月丁香婷婷综合 | 免费久久99精品国产 | 午夜影视一区 | 国产精品久久久久av福利动漫 | 久久久私人影院 | 中文字幕在线播放第一页 | 激情欧美一区二区免费视频 | 国产亚洲精品久久久久动 | 97在线免费 | 超碰伊人网 | 99精品视频在线观看免费 | 在线观看中文字幕2021 | 国产在线观看免费 | 97视频人人| 九色福利视频 | 亚洲不卡av一区二区三区 | 日韩精品一区二区电影 | 欧美极品久久 | 视频一区二区视频 | 免费a视频 | 99九九99九九九视频精品 | 丁香婷婷深情五月亚洲 | 亚洲高清视频在线播放 | 久久国产欧美日韩 | 欧美一区二区三区在线观看 | 在线成人小视频 | 波多野结衣视频一区二区三区 | 国产伦精品一区二区三区免费 | 成人a在线观看 | 一级α片 | 18做爰免费视频网站 | 中文字幕在线播放av | 国产午夜精品理论片在线 | 久久久久国产成人精品亚洲午夜 | 99视频国产精品免费观看 | 人人爱爱| 亚洲资源在线观看 | h视频在线看| 亚洲精品国久久99热 | 丝袜av网站 | 国产美女精品视频 | 在线亚洲免费视频 | 亚洲专区免费观看 | 综合久久一本 | 97av在线视频免费播放 | 521色香蕉网站在线观看 | a色视频| 亚洲视频精选 | 欧美在线视频第一页 | 中文字幕人成乱码在线观看 | 亚洲一级二级 | 一区二区三区精品在线视频 | 色狠狠一区二区 | 免费av黄色 | 国产精彩视频一区二区 | 免费十分钟 | 亚洲va欧美 | 精品一区二区三区在线播放 | 精品一区二区三区香蕉蜜桃 | 狠狠综合久久 | 成人一区二区三区在线 | 人人揉人人揉人人揉人人揉97 | 精品国产一区二区三区久久久蜜月 | 久草在线最新免费 | 亚洲国产网址 | 国产一区在线观看免费 | 黄色毛片网站在线观看 | 日日夜夜噜噜噜 | 最新国产在线 | av先锋影音少妇 | 国产精品久久久久久妇 | 六月天综合网 | 天天性天天草 | 婷婷5月色 | 超碰官网 | 伊人电影天堂 | 日韩综合一区二区三区 | 日本aaaa级毛片在线看 | 99综合久久| 久草视频播放 | 国产精品美女久久久久久久 | 免费黄色av电影 | 91视频xxxx| 天天玩天天操天天射 | 久久精品视频免费观看 | 日韩电影中文字幕在线 | www成人精品 | 亚洲精品免费观看视频 | 亚洲最新视频在线 | 91精品国产一区二区在线观看 | 国产精品免费麻豆入口 | 亚洲 在线 | 成人免费在线电影 | 久久中文字幕导航 | 日韩中文在线字幕 | 国产亚洲在线观看 | 91精品电影 | www.亚洲黄| 精品乱码一区二区三四区 | 免费高清在线观看成人 | 色小说av| 国产精品永久免费 | 久久久久久久久艹 | 日本久久电影 | 欧美日本在线视频 | 久久免费视频在线观看 | 久久涩涩网站 | av中文天堂| 亚洲国产影院 | 西西444www大胆高清图片 | 久99精品 | 91传媒视频在线观看 | 久草久热 | sm免费xx网站 | 天天干天天草 | 亚洲精品在线视频网站 | 天天天天天天天天操 | 色婷婷天天干 | 国产成人黄色在线 | 国产精品久久久久久久久久久久午 | 五月婷婷丁香色 | 97精品国产91久久久久久 | 欧女人精69xxxxxx | 黄色小视频在线观看免费 | 国产黄色片免费观看 | 超碰97人人射妻 | 久99视频| 在线日本看片免费人成视久网 | 国产日韩在线看 | 播五月婷婷 | 午夜国产一区 | 久久久久久毛片 | 日本精品一区二区三区在线观看 | 福利片视频区 | 在线观看中文字幕dvd播放 | 国产小视频在线观看免费 | 国产精品美女免费视频 | 欧美激情精品久久久 | 亚洲成av | 日韩在线理论 | 欧美成人在线免费 | 在线免费中文字幕 | 日韩高清久久 | 久久久久麻豆v国产 | 中文高清av| 欧美日韩中文国产 | 天天干天天干天天射 | 波多野结衣在线视频一区 | 色婷婷国产精品一区在线观看 | 国产盗摄精品一区二区 | 亚洲精品国精品久久99热一 | 欧美精品一区二区在线观看 | 午夜av免费在线观看 | 国产另类av| 久草在线最新视频 | 久久精品国产成人精品 | 亚洲在线a | 日本中文字幕观看 | av电影一区 | 午夜私人影院久久久久 | 国产精品一区二区免费看 | 五月综合网站 | 在线国产视频 | 色天天久久 | 久久久精品国产一区二区 | 91亚洲综合| 亚洲成人一二三 | 国产婷婷一区二区 | 在线观看免费一级片 | 久久精品视频5 | 久久久久亚洲国产精品 | 国产在线观看你懂的 | 亚洲网久久 | 亚洲国产成人在线播放 | 日韩城人在线 | 中文字幕免费高清 | 国产亚洲视频在线 | 欧美精品久久久久a | 天天av在线播放 | 日韩中文字幕在线看 | 久久久久久久免费 | 99久精品视频 | 中文字幕在线国产 | 91最新国产| 亚洲国产精品视频在线观看 | 91精品欧美 | 亚洲精品成人免费 | 国内精品久久久久久久影视简单 | 成人动漫一区二区三区 | 91av视频| 日韩二区在线播放 | 中字幕视频在线永久在线观看免费 | 手机看片中文字幕 | 欧美-第1页-屁屁影院 | 国产黄色精品在线观看 | 三级小视频在线观看 | 一二区精品 | 91精品国产一区二区在线观看 | 在线视频黄 | 免费高清在线观看成人 | 超碰在线观看av | 日韩a级免费视频 | 国产黄色免费看 | 久久超碰网| 成人免费亚洲 | 国产精品系列在线 | 人人搞人人干 | 国产精品自产拍在线观看中文 | 婷婷精品在线视频 | av片中文| 日韩免费中文字幕 | 欧美日韩在线观看一区二区 | 91桃色在线观看视频 | 伊人婷婷在线 | 婷婷av综合 | 亚洲成人av片 | 日韩色视频在线观看 | 国产成人一级 | 特黄特黄的视频 | 午夜电影 电影 | 欧美精品免费一区二区 | 中文字幕在线视频免费播放 | 国产一级黄大片 | 国产福利一区二区三区在线观看 | 国产福利a | 精品视频亚洲 | 日日操天天爽 | 国产一级片免费播放 | 高清av中文在线字幕观看1 | 91刺激视频 | 国产小视频在线免费观看视频 | 亚洲成a人片综合在线 | 国产精品一区二区三区四区在线观看 | 日韩一级电影在线观看 | 福利电影一区二区 | 91在线超碰 | 亚洲天堂色婷婷 | 国产最顶级的黄色片在线免费观看 | 欧美日韩国内在线 | 免费看国产a | 人人超碰97 | 色综合久久88色综合天天 | 国产一级片直播 | 亚洲电影院 | 91精品在线免费视频 | 中文字幕av播放 | 亚洲小视频在线 | 国内精品在线观看视频 | 国产高清不卡 | 一区三区视频在线观看 | 美女免费视频一区二区 | 懂色av一区二区三区蜜臀 | 五月天婷婷在线观看视频 | 久久好看免费视频 | 精品国产_亚洲人成在线 | 免费精品在线观看 | 国产亚洲精品免费 | 久久久久久久18 | 伊人资源视频在线 | 午夜美女av | 亚洲人成人在线 | 国产 视频 高清 免费 | 91精品老司机久久一区啪 | 日韩精品五月天 | 久久免费观看少妇a级毛片 久久久久成人免费 | 久久综合五月天 | 最新日韩在线观看视频 | 韩日精品在线 | 天堂在线一区二区 | 天天综合导航 | 成年人免费观看国产 | 日韩欧美电影网 | 欧美一二区在线 | 人人爽人人乐 | 中文字幕影片免费在线观看 | 亚洲精品www. | 国产精品福利一区 | 99中文在线 | 波多野结衣一区二区三区中文字幕 | 在线视频观看国产 | 国产视频资源 | 国产高清免费 | 成人污视频在线观看 | 免费www视频| 伊人超碰在线 | 91视频在线免费下载 | 国产精品私人影院 | 蜜臀aⅴ国产精品久久久国产 | 久久99国产精品免费网站 | 最近中文字幕免费 | 久久国产免 | 日本高清久久久 | 99精品在线直播 | 日韩在线电影一区 | 色综合网 | 99视频在线免费观看 | 蜜桃视频在线视频 | 亚洲精品国产精品国自产在线 | 久久99国产精品免费 | 亚洲人成人天堂h久久 | 中文字幕av免费在线观看 | 丰满少妇在线观看 | 亚洲欧洲日韩在线观看 | 国产伦理久久精品久久久久_ | 久久久免费在线观看 | 操老逼免费视频 | 久久亚洲国产精品 | 欧美精品久 | 婷婷精品视频 | 色婷婷激情四射 | 亚洲国产日韩一区 | 最新婷婷色| 国产一区欧美日韩 | 国产精品一码二码三码在线 | 国产一级二级三级视频 | 另类老妇性bbwbbw高清 | 97国产精品视频 | 国产一区二区网址 | 成人国产电影在线观看 | 97国产小视频 | 97福利在线 | .精品久久久麻豆国产精品 亚洲va欧美 | av资源中文字幕 | 麻豆av一区二区三区在线观看 | 国产精品免费久久久久影院仙踪林 | 国产精品男女啪啪 | 中文字幕一区二区三区在线播放 | 亚洲电影av在线 | 国产成年免费视频 | 日韩成人xxxx| 中国一级片视频 | 国内久久| 日韩av一区二区三区在线观看 | 色狠狠一区二区 | 亚洲黄色免费观看 | 久久avav| 成人三级视频 | 国产三级精品在线 | 日韩免费在线 | 久久久国产精品电影 | 91视频免费 | 97超碰影视 | 人人草在线视频 | 黄色小网站免费看 | 久久福利综合 | 干狠狠| 97精品电影院 | 亚洲精品永久免费视频 | 国产又黄又爽无遮挡 | 国产一区二区精品 | 国产日韩中文字幕在线 | freejavvideo日本免费 | 99在线观看视频网站 | 国产精品自产拍在线观看中文 | 九九热精品在线 | 久久精品欧美一 | 成人午夜性影院 | 探花在线观看 | 97超碰中文字幕 | 夜夜骑天天操 | 午夜久久成人 | 精品国产乱码久久 | 天天操天天干天天摸 | 久久综合在线 | 中文字幕在线电影 | 日韩高清不卡在线 | 91高清免费观看 | 狠狠操狠狠干2017 | 啪啪激情网 | 92精品国产成人观看免费 | 国产精品欧美日韩 | 久久免费的视频 | 少妇bbb搡bbbb搡bbbb | 日韩二级毛片 | 成人中文字幕+乱码+中文字幕 | 不卡中文字幕在线 | 久草视频免费 | 九九在线国产视频 | 尤物九九久久国产精品的分类 | 国产福利在线免费 | 午夜色大片在线观看 | 日韩有码中文字幕在线 | 国产精品一区二区在线播放 | 激情丁香月 | 在线日韩亚洲 | 亚洲欧美日韩国产精品一区午夜 | 99在线热播精品免费 | 久久久精品欧美一区二区免费 | 久久久三级视频 | 99在线精品免费视频九九视 | 亚洲精品午夜久久久 | 欧美一区二区三区激情视频 | 91丨九色丨蝌蚪丨老版 | 国产小视频免费在线网址 | 人人干人人艹 | 国产精品乱码久久久 | 久久九九视频 | 国产在线精品一区二区不卡了 | 日韩精品一区二区免费视频 | 69精品视频在线观看 | 97超碰国产精品女人人人爽 | 色com网| 国内精品久久久久久久影视麻豆 | 开心激情综合网 | 丰满少妇久久久 | 日韩高清久久 | 手机成人av在线 | 国产精品成 | 九九九视频在线 | 日韩精品一区二区不卡 | 亚洲精品玖玖玖av在线看 | 亚洲精品tv久久久久久久久久 | www视频在线观看 | 黄色日视频 | 国产精品视频app | 免费黄色小网站 | 国产精品午夜在线观看 | 亚洲视频99 | 在线免费观看av网站 | 丁香影院在线 | 免费毛片一区二区三区久久久 | 狠狠狠色丁香婷婷综合激情 | 欧美日韩一区二区三区不卡 | 久久人人干| 青春草视频在线播放 | 国产999精品久久久久久绿帽 | 久产久精国产品 | 精品在线视频播放 | 青草视频免费观看 | 精品久久久成人 | 日韩精品三区四区 | 久久免费av电影 | 亚洲婷婷在线视频 | 久久a视频 | 亚洲午夜久久久久 | 欧美最猛性xxxxx亚洲精品 | 麻豆免费在线播放 | 国产精品久久久久aaaa | 国产精品96久久久久久吹潮 | 在线精品在线 | 亚洲码国产日韩欧美高潮在线播放 | 中文永久免费观看 | 日韩免费高清 | 国产99久久久精品 | 免费观看一级一片 | 五月激情站 | 国模一二三区 | 久久久免费在线观看 | 中文欧美字幕免费 | 久久av一区二区三区亚洲 | 国产不卡精品 | 97品白浆高清久久久久久 | 黄色片免费看 | 国产色一区 | 久久69av| 日韩av在线资源 | 欧美精品亚州精品 | 亚洲精品欧美专区 | 操久在线 | 99se视频在线观看 | 丝袜av网站 | 又黄又爽又刺激视频 | 超薄丝袜一二三区 | a午夜电影 | 在线观看黄色 | 欧美一区在线观看视频 | 色婷婷www| 中文字幕在线不卡国产视频 | 在线久草视频 | av在线免费观看不卡 | 国内成人综合 | 久久欧美视频 | a在线免费观看视频 | 色噜噜日韩精品欧美一区二区 | 热久久国产精品 | 久久精品中文 | 国产精品久久在线 | 中文字幕在线视频一区二区三区 | 玖玖精品在线 | 欧美一级黄色视屏 | 五月婷婷色丁香 | 国内视频在线 | 国产免费又黄又爽 | 99久久久久久国产精品 | 久久艹综合| 精品视频资源站 | 色婷婷综合久久久久中文字幕1 | 一级免费观看 | 国产精品一区二区三区在线播放 | 久久蜜桃av| 热久久国产精品 | 国产不卡精品 | 欧美日韩视频在线一区 | 久久高清av | 精品九九九九 | 久草久热 | 精品9999 | 99综合电影在线视频 | 婷婷色亚洲| 亚洲免费精品视频 | 国产精品毛片一区二区 | 欧美日韩视频观看 | 成人午夜电影在线 | 69久久夜色精品国产69 | 亚洲精品a区 | 一区二区三区电影大全 | 91精品欧美一区二区三区 | 又粗又长又大又爽又黄少妇毛片 | 亚洲精品小视频 | 中文在线免费一区三区 | 中文字幕在线国产 | 99久久婷婷国产一区二区三区 | 在线 你懂 | 日韩激情片在线观看 | 在线国产日韩 | 婷婷丁香在线 | 在线观看久久久久久 | 在线观看免费av片 | 韩国精品在线观看 | 日韩中文字幕免费在线播放 | 国产特黄色片 | 狠狠狠狠狠狠操 | 亚州精品国产 | 日韩国产精品一区 | 美女搞黄国产视频网站 | 欧美日韩在线免费观看视频 | 国内精品久久久久影院一蜜桃 | 久久久久久免费视频 | 天天爽人人爽夜夜爽 | 天天干天天做天天操 | 开心激情久久 | 天天天天天天天天操 | 天天操操操操操操 | 久久9视频 | 在线看岛国av | 91九色成人 | 亚洲精品国产成人 | 99热高清 | 午夜av在线| 久草av在线播放 | 伊人婷婷在线 | 久久伦理网 | 精品久久久久久电影 | 天堂v中文 | 久久精品中文字幕少妇 | 日韩av女优视频 | 久久久这里有精品 | 操操操日日日干干干 | 婷婷深爱激情 | 免费色视频在线 | 久久亚洲综合国产精品99麻豆的功能介绍 | 91九色性视频 | 国产精品乱码一区二区视频 | 麻豆极品| 国产永久免费观看 | 日本精品一区二区在线观看 | 人人爱人人添 | 91精品国| 色中色亚洲 | 99视频精品| 欧美国产大片 | 国产精品一区二区在线观看 | 日韩在线高清视频 | www欧美xxxx | 九九久久影视 | 国产一区在线精品 | 中文字幕乱在线伦视频中文字幕乱码在线 | 在线观看你懂的网址 | 色综合激情久久 | 美女精品在线观看 | 国产精品自产拍在线观看蜜 | 午夜久久久久久久久久久 | 国产精品四虎 | 在线观看一级视频 | 免费国产ww | 日韩午夜电影网 | 粉嫩一区二区三区粉嫩91 | 天天爱天天舔 | 国产精品一区二区av | 婷婷视频在线观看 | 色综合天天射 | 黄色网免费 | 九色激情网 | 免费黄色a级毛片 | 麻豆视频免费在线观看 | 亚洲精品高清视频在线观看 | 天天操天天舔天天爽 | 欧美一区二区三区四区夜夜大片 | 日韩高清精品免费观看 | 欧美一区二区在线免费看 | 日韩欧美一区二区三区黑寡妇 | 欧美激情视频在线免费观看 | 日韩精品一区二区三区在线视频 | 久久久久看片 | 色网站免费在线观看 | 在线视频婷婷 | 一区二区三区视频网站 | 亚洲精品一区中文字幕乱码 | 能在线观看的日韩av | 97在线免费观看 | 在线看国产一区 | 最近中文字幕完整高清 | 国产一级久久久 | 超碰在线99 | 美女啪啪图片 | 国内精品久久久久影院一蜜桃 | 日韩精品免费一区二区在线观看 | 久久久久五月 | 国产在线色站 | 国产激情久久久 | 夜夜婷婷 | 天天插视频 | 啪啪午夜免费 | 国产69精品久久久久9999apgf | 91精品久久久久久久91蜜桃 | 中文字幕黄色网 | 99精品在线视频播放 | 色综合天天做天天爱 | 在线观看色网 | 五月天综合色 | 射射色 | 亚洲区精品 | 人人超碰免费 | 国产成人1区 | 亚洲精品视频在线观看免费视频 | 丁香九月激情综合 | 久久精品黄 | 精品国产电影一区二区 | 成人免费视频播放 | 中文字幕在线观看完整 | 欧美一级电影免费观看 | 国产九色视频在线观看 | 国产亚洲精品久久久久久大师 | 日韩有码欧美 | 日韩久久精品一区二区 | 最近高清中文字幕在线国语5 | 91精品国产乱码久久 | 手机看片中文字幕 | 久久午夜精品影院一区 | 在线国产不卡 | 91麻豆精品| 日韩大片在线免费观看 | 久久久久国产精品视频 | 国产精品久久久久四虎 | 精品国产一区二区三区久久久 | 亚洲丝袜一区 | 久久伦理电影 | 欧美成人精品xxx | 国产色视频123区 | 亚洲第一av在线 | 日韩综合精品 | 麻豆手机在线 | 国产精品69久久久久 | 伊甸园av在线 | 日韩乱码在线 | 国产精品久久久久久久久久久久冷 | 欧美一区二区三区免费观看 | 国产xvideos免费视频播放 | 日本中文不卡 | 二区视频在线 | 色www.| 久久99精品国产麻豆婷婷 | 久久91网| 日韩激情小视频 | 国产福利在线不卡 | 国产精品av久久久久久无 | 啪啪免费视频网站 | 亚洲 欧美 日韩 综合 | 国产一区二区三区免费观看视频 | 偷拍精偷拍精品欧洲亚洲网站 | 国产精品丝袜在线 | 探花视频在线观看免费版 | 天天射天天操天天 | 天堂在线免费视频 | 国产手机在线 | 免费网站黄色 | 国产成人三级在线 | 久草在线欧美 | 国产免费久久精品 | 韩国av免费在线观看 | 久热av在线 | 免费看一级一片 | 成人av片免费看 | 伊人五月天综合 | 日韩在线观看影院 | 欧美国产一区在线 | 国产999精品久久久 免费a网站 | 久99精品| 99r在线观看 | 国产最顶级的黄色片在线免费观看 | 亚洲丝袜一区二区 | 91九色精品 | 久久69av| 久久久免费精品国产一区二区 | 在线观看中文字幕亚洲 | 亚洲精品高清在线观看 | 免费精品在线观看 | 操操操天天操 | 久久欧美精品 | 日日添夜夜添 | 91免费网 | www.精选视频.com | 色姑娘综合天天 | 国产成人精品久久久久蜜臀 | 国产亚洲精品久久久久久移动网络 | 国产小视频在线观看 | 深爱激情五月网 | 中中文字幕av在线 | 日韩欧美在线不卡 | 国产精品高清在线 | 国产精品久久久久久一区二区三区 | 国产h在线观看 | 手机av电影在线观看 | 日本资源中文字幕在线 | 成人黄色免费在线观看 | 欧美午夜性 | 国产成人一区二区三区免费看 | 精品人人爽| 国产精品久久久久久久久久妇女 | 亚洲一区精品人人爽人人躁 | 伊人中文在线 | 97在线免费观看 | 2019中文在线观看 | 激情久久小说 | 日韩久久精品一区二区 | 91精品国产麻豆 | 黄色成人免费电影 | 欧美黄色成人 | 国产精品免费观看久久 | 日韩一二三 | 免费亚洲电影 | 91精品久久久久久久91蜜桃 | 久久视频精品在线观看 | 国产亚洲精品久久久久久网站 | 人人舔人人爽 | 久久久这里有精品 | 久在线 | 日韩精品久久久久久久电影99爱 | 国产区在线看 | 久久黄色精品视频 | 超碰人人乐 | 久久国产麻豆 | 91久久人澡人人添人人爽欧美 | 久久性生活片 | 欧美国产高清 | 亚洲精品国产精品国产 | 91黄色免费网站 | 美国av大片 | 亚洲在线色| 91人人爽久久涩噜噜噜 | 天天操天天插 | 亚洲精品美女免费 | 97看片 | 国产精品欧美精品 | 国内精品久久久久久久久久清纯 | 亚洲精品国产精品国自产在线 | 亚洲专区欧美专区 | 天天射夜夜爽 | 欧美孕交vivoestv另类 | 欧美一级性生活 | 成人av在线亚洲 | 色姑娘综合天天 | 色九九视频| 久久丝袜视频 | 国产亚洲欧美在线视频 | 精品国产一区二区三区久久影院 | 精品国产一区二区三区久久久蜜月 | 亚洲国产影院 | 午夜影视av| 精品国产一二区 | 久热爱 | 999精品视频| 午夜影院三级 | 毛片.com| 久久久www成人免费毛片麻豆 | 国产欧美三级 | 欧美淫aaa免费观看 日韩激情免费视频 | 一级一片免费视频 | 五月婷久久 | 天天舔天天射天天操 | 免费视频你懂的 | 日韩丝袜在线观看 | 美女视频网| 黄色一级片视频 | 国产xx在线 | 午夜精品久久久久久久爽 | 五月婷婷一级片 | 狠狠久久伊人 | 中文av免费| 久草视频在线免费播放 | 午夜在线看片 | 91在线视频免费91 | 久久久黄视频 | 久久精品www人人爽人人 | 黄色avwww| 999免费视频 | 999国内精品永久免费视频 | 久久,天天综合 | 日韩欧美视频免费在线观看 | 99精品久久只有精品 | 久久精品久久国产 | 久久超碰网 | 日韩剧| 五月天狠狠操 | 国产精品 欧美 日韩 | 天天天干天天天操 | 国产精品入口a级 | 91最新网址在线观看 | 婷婷六月天在线 | 欧美片网站yy| 色婷婷精品大在线视频 | 久久99精品一区二区三区三区 | 免费看麻豆 | 国产黄在线播放 | 9999毛片| 国产成人av一区二区三区在线观看 | 国产精品粉嫩 | 日韩中文在线电影 | 深夜免费网站 | 不卡视频在线 | 久草网在线观看 | 国产一级视频在线观看 | 欧美福利网址 | av综合 日韩 | 国产精品欧美一区二区 | 国产精品永久免费观看 | 国产精品久久99综合免费观看尤物 | 免费观看www7722午夜电影 | 天天色天天射天天干 | 国内精品视频在线 | 日韩免费一二三区 | 亚洲天堂网视频在线观看 | 久久精品高清视频 | 国产精品久久久av久久久 | 久久躁日日躁aaaaxxxx | 在线国产小视频 | 欧美日韩中文在线视频 | 亚洲国产影院av久久久久 | 综合激情婷婷 | 亚洲 在线 | 日b视频在线观看网址 | 亚洲黄色av网址 | 激情欧美一区二区三区免费看 | 成 人 黄 色 片 在线播放 | 日日碰夜夜爽 | 久久久久久久久久久久影院 | 久热爱| 国产视频中文字幕 | 国产一级久久久 | 亚洲三级黄 | 国产一区二区日本 | 久久亚洲电影 | 中文字幕在线看视频 | 国产高h视频| 国产精品免费大片视频 | 亚洲成av人影片在线观看 | www.色在线| 成人啊 v | 免费在线观看成人小视频 | 黄色一区三区 | 九九精品毛片 | 91香蕉视频污在线 | 91av视频在线播放 | 久草在线观看视频免费 | 国产色视频网站2 | 国产香蕉久久精品综合网 | 久久精品久久精品久久39 | 国产色在线 | 99国内精品久久久久久久 | 欧美一级片在线 | 美女网站久久 | 国产又粗又猛又黄又爽的视频 | 国产欧美精品一区二区三区四区 | 久久免费视频99 | 欧美日韩国产一区二区三区在线观看 | 91成人亚洲 | 国产中文字幕视频在线观看 | 欧美亚洲精品在线观看 | 久久久精品免费观看 | 热久在线| 日韩久久一区二区 | 久久视精品 | 国产精品久久久久国产精品日日 | 在线亚洲天堂网 | 久久精品在线 | 在线久热 | 久草资源免费 | av在线播放中文字幕 | 久久国产精品99国产精 | 欧美日韩精品免费观看 | 极品久久久 | 国产精品久久影院 | 日韩精选在线观看 | 91九色视频网站 | 欧美日bb | 97人人艹| www.五月天 | 亚洲精品xxxx | 亚洲人成精品久久久久 | 开心激情网五月天 | 一区精品在线 | 在线影院中文字幕 | 五月天丁香综合 | 黄色片毛片 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 99热精品在线观看 | 91视频观看免费 | 丁五月婷婷 | 日韩欧美在线不卡 | 国产精品资源在线 | 中文字幕 二区 | 97精品国产 | 久草在线资源观看 | 久久视频一区 | 91热爆视频 | 99久高清在线观看视频99精品热在线观看视频 | 亚洲精品乱码久久久久久蜜桃91 | 亚洲激情小视频 | 992tv在线观看 | 国产精品毛片久久久久久久久久99999999 | 丁香久久综合 | 国产不卡在线观看 | 日韩高清不卡一区二区三区 | 欧美性久久久 | 日韩av电影手机在线观看 | 色婷婷亚洲综合 | 一本大道久久精品懂色aⅴ 五月婷社区 | 成人a级大片| 久草精品视频在线观看 | 国产福利小视频在线 | 黄色成人av网址 | 麻豆视频在线观看免费 | 欧美日韩在线精品一区二区 | 日韩精品中文字幕在线 | 激情自拍av| 午夜视频福利 | 91麻豆精品国产自产 | 中国一级片在线观看 | 91av精品| 欧美黄在线 | 亚洲成人国产 | 手机成人在线电影 | 99色精品视频 | 最近免费中文视频 | 麻豆久久久久久久 | 免费观看www7722午夜电影 | 精品视频在线看 | 国产精品久久久久永久免费看 | 97超级碰碰 | 国产又黄又爽无遮挡 | 精品一二 | 日韩av中文在线 | 国产日韩亚洲 |