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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 修炼手册】常用技术篇 -- 聊聊 Android 的打包

發布時間:2023/12/15 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 修炼手册】常用技术篇 -- 聊聊 Android 的打包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是【Android 修煉手冊】系列第 10 篇文章,如果還沒有看過前面系列文章,歡迎點擊 這里 查看~

預備知識

  • 了解 android 基本開發
  • 看完本文可以達到什么程度

  • 了解 Android APK 打包的關鍵過程
  • 了解多渠道打包的原理
  • 了解 Multiple APK,Split APKs,App Bundle 的衍生的打包方式
  • 閱讀前準備工作

  • clone CommonTec 項目,其中 simpleapk 是本文用到的示例。
  • 文章概覽

    我們現在大部分開發都是基于 Android Studio 進行的,在 AS 中,我們只需要點擊 Run 按鈕,AS 自動會打包 Apk 安裝至設備中并運行。對于我們來說,其中的打包過程就是一個黑盒,我們所知道的就是 Sources -> AS Compiler -> APK。這篇文章我們就分析一下中間的打包過程,以及打包相關的一些問題。

    我們先了解一下 APK 內部的結構。

    一、Android APK 包結構

    接下來我們看看一個正常的 APK 的結構。
    一個 APK 打包完之后,通常有下面幾個目錄,用來存放不同的文件。
    assets
    原生資源文件,不會被壓縮或者處理
    classes.dex
    java 代碼通過 javac 轉化成 class 文件,再通過 dx 文件轉化成 dex 文件。如果有多個 dex 文件,其命名會是這樣的:
    classes.dex classes2.dex classes3.dex ...
    在其中保存了類信息。
    lib/
    保存了 native 庫 .so 文件,其中會根據 cpu 型號劃分不同的目錄,比如 ARM,x86 等等。
    res/
    保存了處理后的二進制資源文件。
    resources.arsc
    保存了資源 id 名稱以及資源對應的值/路徑的映射。
    META-INF/
    用來驗證 APK 簽名,其中有三個重要的文件 MANIFEST.MT,CERT.SF,CERT.RSA。
    MANIFEST.MF 保存了所有文件對應的摘要,部分內容如下:

    Manifest-Version: 1.0 Built-By: Generated-by-ADT Created-By: Android Gradle 3.4.0Name: AndroidManifest.xml SHA-256-Digest: QxJh66y6ssDSNFgZSlf5jIWXfRdWnqL1c3BSwSDUYLQ=Name: META-INF/android.arch.core_runtime.version SHA-256-Digest: zFL2eISLgUNzdXtGA4O/YZYOSUPCA3Na3eCjULPlCYk= 復制代碼

    CERT.SF 保存了MANIFEST.MF 中每條信息的摘要,部分內容如下:

    Signature-Version: 1.0 Created-By: 1.0 (Android) SHA-256-Digest-Manifest: j8YGFgHsujCHud09pT6Igh21XQKSnG+Gqy8VUE55u+g= X-Android-APK-Signed: 2Name: AndroidManifest.xml SHA-256-Digest: qLofC3g32qJ5LmbjO/qeccx2Ie/PPpWSEPBIUPrlKlY=Name: META-INF/android.arch.core_runtime.version SHA-256-Digest: I65bgli5vdqHKel7MD74YlSuuyCR/5NDrXr2kf5FigA= 復制代碼

    CERT.RSA 包含了對 CERT.SF 文件的簽名以及簽名用到的證書。

    AndroidManifest.xml
    這個文件大家都很熟悉了,全局配置文件,不過這里是編譯處理過的二進制的文件。

    二、APK 打包流程

    2.1 原始打包流程

    我們在上面看了一個完整 APK 的結構,APK 打包的過程其實就是生成上述文件的過程。這里放一張網上流傳比較廣的流程圖。

    主要有下面幾個步驟:

  • 使用 AAPT/AAPT2 編譯資源文件生成 resources.arsc 以及 R.java
  • 使用 aidl 處理 aidl 文件,生成 java 文件
  • 使用 JAVAC 編譯 java 文件,生成 classes 文件
  • 使用 DX/D8 處理 class 文件,生成最終需要的 dex 文件
  • 使用 Android NDK 處理 native 代碼生成 .so 文件
  • 使用 apkbuilder 生成 未簽名的 APK
  • 使用 apksigner 對 Apk 進行簽名,生成最終的 APK
  • 2.2 如何手動使用命令行打包

    平時的開發都是使用 gradle 構建,下面我們不依賴 gradle,直接用官方提供的各個階段的打包工具,手動用命令行打一個 APK,可以更好更詳細的了解其中的過程。 這里直接用 simpleapk 工程做示例。
    官方的打包工具在 android_sdk/build-tools/version/ 目錄下。

    開始之前,我們先創建一個 tmp 目錄用來存放中間產物。創建 tmp/final 存放最終產物。

    1. AAPT2 compile 資源

    使用 AAPT2 處理資源需要兩步,compile 和 link,首先執行 compile 操作。執行下面的命令。

    /Users/zy/android-sdk-mac_x86/build-tools/28.0.2/aapt2 compile -o tmp/res --dir src/main/res/ 復制代碼

    使用 aapt2 對單個資源處理,會生成 xxx.flat 文件,是 aapt2 的中間產物,可以用于后面的資源增量編譯。我們這里通過 --dir 直接指定了資源的目錄,產物 res 是一個壓縮包,里面包含了所有資源處理后的 xxx.flat。
    這里我們再把 res 這個壓縮包解壓一下。執行下面的命令。

    unzip -u tmp/res -d tmp/aapt2_res 復制代碼

    這一步結束以后,目錄是這個樣子的。

    tmp/ ├── aapt2_res │?? └── xxx.flat ├── final └── res 復制代碼
    2. AAPT2 link 資源

    AAPT2 link 是把上一步 compile 處理后的 xxx.flat 資源鏈接,生成一個完整的 resource.arsc,二進制資源和 R.java。執行下面的命令。

    /Users/zy/android-sdk-mac_x86/build-tools/28.0.2/aapt2 link -o tmp/res.apk -I /Users/zy/android-sdk-mac_x86/platforms/android-28/android.jar --manifest src/main/AndroidManifest.xml --java tmp -R tmp/aapt2_res/drawable-hdpi_ic_launcher_foreground.xml.flat -R tmp/aapt2_res/mipmap-anydpi-v26_ic_launcher_round.xml.flat -R tmp/aapt2_res/mipmap-xhdpi_ic_launcher_round.png.flat -R tmp/aapt2_res/values_colors.arsc.flat -R tmp/aapt2_res/drawable-hdpi_ic_launcher_foreground1.xml.flat -R tmp/aapt2_res/mipmap-hdpi_ic_launcher.png.flat -R tmp/aapt2_res/mipmap-xxhdpi_ic_launcher.png.flat -R tmp/aapt2_res/values_strings.arsc.flat -R tmp/aapt2_res/drawable-mdpi_ic_launcher_foreground.xml.flat -R tmp/aapt2_res/mipmap-hdpi_ic_launcher_round.png.flat -R tmp/aapt2_res/mipmap-xxhdpi_ic_launcher_round.png.flat -R tmp/aapt2_res/values_styles.arsc.flat -R tmp/aapt2_res/drawable_ic_launcher_background.xml.flat -R tmp/aapt2_res/mipmap-mdpi_ic_launcher.png.flat -R tmp/aapt2_res/mipmap-xxxhdpi_ic_launcher.png.flat -R tmp/aapt2_res/layout_activity_main.xml.flat -R tmp/aapt2_res/mipmap-mdpi_ic_launcher_round.png.flat -R tmp/aapt2_res/mipmap-xxxhdpi_ic_launcher_round.png.flat -R tmp/aapt2_res/mipmap-anydpi-v26_ic_launcher.xml.flat -R tmp/aapt2_res/mipmap-xhdpi_ic_launcher.png.flat --auto-add-overlay 復制代碼

    執行命令后,會生成 res.apk,里面就是 resource.arsc,處理后的 AndroidManifest.xml 以及 處理后的二進制資源。我們這里也把他解壓出來,后面最終打包的時候使用。執行命令如下。

    unzip -u tmp/res.apk -d tmp/final 復制代碼

    這一步結束以后,目錄狀態如下。

    tmp/ ├── aapt2_res │?? └── xxx.flat ├── com │?? └── zy │?? └── simpleapk │?? └── R.java ├── final │?? ├── AndroidManifest.xml │?? ├── res │?? │?? ├── drawable │?? │?? │?? └── ic_launcher_background.xml │?? │?? ├── xxx 資源目錄 │?? └── resources.arsc ├── res └── res.apk 復制代碼
    3. javac 生成 class 文件

    這一步我們需要處理 java 文件,生成 class 文件。要用到上一步生成的 R.java 文件。執行下面的命令。

    javac -d tmp src/main/java/com/zy/simpleapk/MainActivity.java tmp/com/zy/simpleapk/R.java -cp /Users/zy/android-sdk-mac_x86/platforms/android-28/android.jar 復制代碼

    這一步結束以后,目錄狀態如下。

    tmp/ ├── aapt2_res │?? └── xxx.flat ├── com │?? └── zy │?? └── simpleapk │?? ├── MainActivity.class │?? ├── R$color.class │?? ├── R$drawable.class │?? ├── R$layout.class │?? ├── R$mipmap.class │?? ├── R$string.class │?? ├── R$style.class │?? ├── R.class │?? └── R.java ├── final │?? ├── AndroidManifest.xml │?? ├── res │?? │?? ├── drawable │?? │?? │?? └── ic_launcher_background.xml │?? │?? ├── xxx 資源目錄 │?? └── resources.arsc ├── res └── res.apk 復制代碼
    4. d8 編譯 dex

    這一步是把上一步生成的 class 文件編譯為 dex 文件,需要用到 d8 或者 dx,這里用 d8。執行下面的命令。

    /Users/zy/android-sdk-mac_x86/build-tools/28.0.2/d8 tmp/com/zy/simpleapk/*.class --output tmp --lib /Users/zy/android-sdk-mac_x86/platforms/android-28/android.jar 復制代碼

    命令執行完以后,會生成 classes.dex,這就是最終 apk 里需要的 dex 文件,我們把它拷貝到 final/ 目錄下。執行如下命令。

    cp tmp/classes.dex tmp/final/classes.dex 復制代碼

    這一步結束以后,目錄狀態如下。

    tmp/ ├── aapt2_res │?? └── xxx.flat ├── classes.dex ├── com │?? └── zy │?? └── simpleapk │?? ├── MainActivity.class │?? ├── R$color.class │?? ├── R$drawable.class │?? ├── R$layout.class │?? ├── R$mipmap.class │?? ├── R$string.class │?? ├── R$style.class │?? ├── R.class │?? └── R.java ├── final │?? ├── AndroidManifest.xml │?? ├── classes.dex │?? ├── res │?? │?? ├── drawable │?? │?? │?? └── ic_launcher_background.xml │?? │?? ├── xxx 資源目錄 │?? └── resources.arsc ├── res └── res.apk 復制代碼
    5. 打包 apk

    執行完上述的命令,打包 APK 需要的材料就都準備好了,因為 APK 本身就是 zip 格式,這里我們直接用 zip 命令打包上述產物,生成 final.apk。執行下面的命令。

    zip -r final.apk * 復制代碼
    6. apk 簽名

    上一步打包好的 APK 還不能直接安裝,因為沒有簽名,我們這里用 debug.keystore 給 final.apk 簽名。執行下面的命令。

    /Users/zy/android-sdk-mac_x86/build-tools/28.0.2/apksigner sign --ks ~/.android/debug.keystore final.apk 復制代碼

    這里需要輸入 debug.keystore 的密碼,是 android。

    這樣,最后的 final.apk 就是我們手動生成的 apk 了??梢园惭b嘗試一下了~

    2.3 AS 打包過程

    正常開發中,我們大部分都是直接點擊 AS 中的 Run 去編譯一個 APK。
    我們先來看看在 AS 中點擊 Run 做了些什么事情。我們點擊 Run 運行,然后打開 Build tab 看下具體的輸出,可以發現執行的是 Gradle Task assembleDebug。

    我們在 build.gradle 里添加一行輸出,看看 AS 給 gradle task 添加的額外參數。

    println "projectProperties: " + project.gradle.startParameter.projectProperties 復制代碼

    輸出如下:

    projectProperties: [android.injected.build.density:xhdpi, android.injected.build.api:26, android.injected.invoked.from.ide:true, android.injected.build.abi:x86] 復制代碼

    其中有一個參數 android.injected.invoked.from.ide=true 表明了是從 AS 調用的 Gradle 命令。后面就是執行 Gradle 的打包命令了。而 Gradle 的打包命令,就是執行各個 Task 生成打包需要的文件。如果對這方面不了解,可以看看之前寫的 Android Gradle Plugin 主要流程分析。

    三、多渠道打包

    上面介紹了 Android APK 的打包流程,也通過手動打 APK 體驗了整個流程。
    在實際的生產開發過程中,我們往往會把 APK 發往各個應用市場,很多時候要根據市場渠道進行一些統計,所以就需要對不同的市場渠道進行區分。關于多渠道打包的問題,有不少解決方式。
    最容易想到的就是使用 Gradle 的 Flavor,使用 Flavor 的特性,生成不同的渠道標識。不過這種方式每生成一個渠道包都需要執行一遍構建過程,非常耗時。
    另外一種方式就是使用 apktool 反編譯 APK,修改其中的資源,添加渠道的標識,并進行重新打包簽名,這種方式省去了構建過程,反編譯,打包,簽名這幾個步驟也比較耗時。按照美團博客的數據,打包 900 個渠道包將近三個小時。

    所以需要再尋找其他的方法。在此之前,我們先看下 Android APK 簽名的方式。了解了簽名方式,才能更好的去了解方法實現。

    在了解 APK 簽名之前,我們先看一下 Zip 的文件格式,因為 APK 本質上是一個 Zip 文件,而多渠道打包就涉及到 Zip 的文件格式。

    3.1 Zip 文件格式

    APK 的本質是一個 Zip 文件,我們可以用 file 命令看一下。是 V2.0 版本的 Zip 格式文件。

    一個 Zip 文件的格式基本如下:

    主要可以分為三個大區域:
    數據區
    核心目錄(central directory)
    目錄結束標識(end of central directory record,EODR)

    3.1.1 數據區

    這個部分記錄了文件壓縮信息和文件原始數據,每一個文件信息用一個 [local file header + file data + data descriptor] 來描述 local file header
    記錄了文件的壓縮信息,主要內容如下:

    descriptionlengthcontent
    local file header signature4 bytes (0x04034b50)文件頭標識, 0x04034b50
    version needed to extract2 bytes解壓所需要的最低版本
    general purpose bit flag2 bytes通用標志位
    compression method2 bytes壓縮方式
    last mod file time2 bytes文件最后修改時間
    last mod file date2 bytes文件最后修改日期
    crc-324 bytesCRC-32 校驗碼
    compressed size4 bytes壓縮后文件大小
    uncompressed size4 bytes未壓縮文件大小
    file name length2 bytes文件名長度
    extra field length2 bytes擴展區長度
    file name (variable size)文件名
    extra field (variable size)擴展數據

    file data
    保存了文件的壓縮數據

    data descriptor

    descriptionlengthcontent
    crc-324 bytescrc32 校驗碼
    compressed size4 bytes壓縮后文件的大小
    uncompressed size4 bytes未壓縮文件的大小

    表示文件的結束,只有在 local file header 中的 general purpose bit flag 第三 bit 位為 3 的時候才會出現。一般情況下沒有

    3.1.2 核心目錄

    核心目錄保存了對壓縮文件更多的信息以及對 Zip64 的支持信息。 主要有兩個部分 file header 和 digital signature

    file header
    是對文件更為具體的描述,每一個 file header 都對應一個 local file header。

    descriptionlengthcontent
    central file header signature4 bytes (0x02014b50)核心文件頭標志,魔數 0x02014b50
    version made by2 bytes壓縮使用的版本
    version needed to extract2 bytes解壓需要的版本
    general purpose bit flag2 bytes通用位標志
    compression method2 bytes壓縮方法
    last mod file time2 bytes文件最后修改時間
    last mod file date2 bytes文件最后修改日期
    crc-324 bytescrc-32 校驗碼
    compressed size4 bytes壓縮后的文件大小
    uncompressed size4 bytes壓縮前的文件大小
    file name length2 bytes文件名長度
    extra field length2 bytes擴展區長度
    file comment length2 bytes文件注釋長度
    disk number start2 bytes文件在磁盤上的起始位置
    internal file attributes2 bytes內部文件屬性
    external file attributes4 bytes外部文件屬性
    relative offset of local header4 bytes對應的 local file header 的偏移
    file name (variable size)文件名
    extra field (variable size)擴展數據
    file comment (variable size)文件注釋

    Digital signature
    官方文檔中沒有對 Digital signature 有太具體的介紹,但是有提到 核心目錄是可以壓縮和加密的,盲猜是用來加密核心目錄的。

    descriptionlengthcontent
    header signature4 bytes (0x05054b50)
    size of data2 bytes
    signature data (variable size)
    3.1.3 核心目錄結束標志

    目錄結束標志是在整個文件的結尾,用于標記壓縮目錄數據的結束。每個 Zip 文件有且只有一個結束標志記錄。

    descriptionlengthcontent
    end of central dir signature4 bytes (0x06054b50)目錄結束標記,魔數 0x06054b50
    number of this disk2 bytes當前磁盤編號
    number of the disk with the start of the central directory2 bytes核心目錄起始位置的磁盤編號
    total number of entries in the central directory on this disk2 bytes磁盤上記錄的核心目錄數量
    total number of entries in the central directory2 bytes核心目錄結構數量
    size of the central directory4 bytes核心目錄大小
    offset of start of central directory with respect to the starting disk number4 bytes核心目錄起始位置的偏移
    .ZIP file comment length2 bytes注釋長度
    .ZIP file comment (variable size)注釋內容

    上面基本上就是一個通用的 Zip 包結構了。 下面就看看 Android 的簽名機制。

    3.2 V1 簽名

    V1 簽名的機制主要就在 META-INF 目錄下的三個文件,MANIFEST.MF,CERT.SF,CERT.RSA,他們都是 V1 簽名的產物。
    MANIFEST.MF 保存了所有文件對應的摘要,部分內容如下:

    Manifest-Version: 1.0 Built-By: Generated-by-ADT Created-By: Android Gradle 3.4.0Name: AndroidManifest.xml SHA-256-Digest: QxJh66y6ssDSNFgZSlf5jIWXfRdWnqL1c3BSwSDUYLQ=Name: META-INF/android.arch.core_runtime.version SHA-256-Digest: zFL2eISLgUNzdXtGA4O/YZYOSUPCA3Na3eCjULPlCYk= 復制代碼

    CERT.SF 保存了MANIFEST.MF 中每條信息的摘要,部分內容如下:

    Signature-Version: 1.0 Created-By: 1.0 (Android) SHA-256-Digest-Manifest: j8YGFgHsujCHud09pT6Igh21XQKSnG+Gqy8VUE55u+g= X-Android-APK-Signed: 2Name: AndroidManifest.xml SHA-256-Digest: qLofC3g32qJ5LmbjO/qeccx2Ie/PPpWSEPBIUPrlKlY=Name: META-INF/android.arch.core_runtime.version SHA-256-Digest: I65bgli5vdqHKel7MD74YlSuuyCR/5NDrXr2kf5FigA= 復制代碼

    CERT.RSA 包含了對 CERT.SF 文件的簽名以及簽名用到的證書。

    在 APK 簽名時,主要流程如下:

    計算 APK 中文件摘要,保存摘要的 base64 編碼到 MANIFEST.MF 文件中 ->計算 MANIFEST.MF 文件的摘要,保存其 base64 編碼到 CERT.SF 文件中 -> 計算 MANIFEST.MF 文件中每個數據塊的摘要,保存其 base64 編碼到 CERT.SF 文件中 -> 計算 CERT.SF 文件摘要,通過開發者私鑰計算數字簽名 -> 保存數字簽名和開發者公鑰到 CERT.RSA 文件中 復制代碼

    在 APK 校驗時,主要流程如下:

    通過CA 證書解密 CERT.RSA 中的數字證書和對 CERT.SF 的簽名 -> 通過簽名校驗 CERT.SF 文件是否被修改 -> 通過 CERT.SF 驗證 MANIFEST.MF 文件是否被修改 -> 通過 CERT.SF 驗證 MANIFEST.MF 文件中數據項是否被修改 -> 通過 MANIFEST.MF 校驗 APK 中的文件是否被修改 復制代碼

    我們在上面講了 Zip 文件的結構,通過上面校驗過程,我們可以發現,在 APK 校驗過程中,只是校驗了數據區的內容,剩余的兩個部分沒有做處理。
    所以如果修改剩余兩個部分,簽名校驗過程中是不會發現的,要寫入信息,EOCD 的注釋字段是很好的選擇。所以將渠道信息寫入 EOCD 的注釋字段,就可以達到打入渠道信息的目的。這就是騰訊 VasDolly 做的事情。
    除此之外,我們可以發現,APK 簽名校驗過程中,并沒有對 META-INF 文件夾下的文件進行簽名和校驗,所以可以在 META-INF 文件夾下新增一個空文件,這樣也可以攜帶渠道信息。這就是美團做的事情。

    3.3 V2 簽名

    本來使用上述方案,一切都是很美好的,然而在 Android 7.0 的時候,引入新的簽名方式,APK Signature Scheme v2,導致 V1 上的多渠道簽名方案失效。我們先看看 V2 簽名的原理。
    按照官方文檔來看,V2 簽名是在 數據區和核心目錄區之間,新增了一個 APK Signing Block 區塊,用來記錄簽名信息。
    簽名前后的結構如下。

    APK Signing Block 格式如下:

    descriptionlengthcontent
    size of block8 bytes簽名塊的長度
    ID-value保存了一系列 ID-value
    size of block8 bytes簽名塊的長度,和第一個字段一樣
    magic16 bytes簽名塊標記,魔數

    APK Signing Block 中,會對其他三個模塊都進行簽名,簽名信息保存在 ID-value 中 ID 為 0x7109871a 對應的 value 中。
    在校驗簽名時,會按照下面的邏輯進行。

    首先檢查是否包含 V2 簽名塊,如果包含 V2 簽名塊,就采用 V2 簽名進行驗證,如果沒有包含 V2 簽名塊,就采用 V1 簽名驗證。
    因此,采用 V2 簽名進行驗證時,V1 方案中添加 EOCD 注釋和 META-INF 空文件的方式就都失效了。
    看到這里,我們會發現,V2 簽名驗證了其他三個模塊數據,但是沒有對 APK Signing Block 本身進行驗證,而其中的 ID-value 是一組數據,所以可以在這里添加包含渠道信息的 ID-value。這就是 V2 簽名下生成多渠道包的原理。 上述原理具體的代碼,可以看 github.com/Tencent/Vas… 和 github.com/Meituan-Dia…

    3.4 V3 簽名

    在 Android 9.0 中引入了新的簽名方式 V3。為了解決簽名簽名過期的問題。V3 簽名在 V2 的 APK Signing Block 中新增了一個簽名塊,保存了 supported SDK 版本以及密鑰流轉結構。由于對 V2 結構沒有進行大的更改,所以不會對多渠道打包方案造成影響。關于 V3 簽名更具體的信息,可以查看官方文檔。

    四、其他打包方式

    4.1 Multiple APKs

    上面說的 APK 結構和打包,都是完整包含了所有資源,包括適配不同的分辨率,適配不同的 API 等等,但其實在每一個用戶設備上,只會用到其中的一種,其余的資源只會占用包大小。所以 Google 也提供了一些其他方法,可以根據不同分辨率,不同 ABI 等等來打包,從而減少包大小。
    在 Android L 之后,Android 支持了 Multiple APKs,簡單來說就是可以通過不同分辨率,不同 CPU 架構,不同 API level 把同一個應用打包成對應不同設備的多個 APK,然后在不同的設備上安裝不同的 APK,來減少體積。
    文檔里提供的了詳細的解釋,我們這里看一下,通過配置不同分辨率,生成的 APK 是什么樣的。
    我們先在 build.gradle 中添加下面的配置。

    android {...splits {// Configures multiple APKs based on screen density.density {// Configures multiple APKs based on screen density.enable true// Specifies a list of screen densities Gradle should not create multiple APKs for.exclude "ldpi", "xxhdpi", "xxxhdpi"// Specifies a list of compatible screen size settings for the manifest.compatibleScreens 'small', 'normal', 'large', 'xlarge'}} } 復制代碼

    含義很清楚了,就不多解釋了。然后我們編譯,可以看到,生成的 APK 不是一個,而是四個。

    其中 simpleapk-universal-debug.apk 是包含了所有資源的完整 APK。其他三個 apk 分別是根據不同分辨率生成的。其中只包含了對應分辨率需要的資源。從而減少了包大小。我們可以對比一下兩個 APK 就看出區別了。

    4.2 Split APKs

    Android L 以后提供了 Split APKs 的多 APK 構建機制,可以將一個 APK 基于 CPU 架構,屏幕密度等緯度拆分成多個 APK,當下載應用時,會依據當前的設備配置選擇對應的 APK 安裝。
    Split APKs 打包以后,會生成一個 Base APK 和多個 Split APK。
    Base APK 包含了通用的資源,而 Split APK 就是用戶設備特有的資源。用戶安裝時會安裝 Base APK 以及其設備對應的 Split APK,從而減少了其他無用資源的包大小。
    我們正常開發中不會生成 Split APKs,不過我們可以打開 Instant Run 對應用進行編譯,現在的 Instant Run 在 Android 5.0 設備上也是采用 Split APKs 的原理。
    使用 Instant Run 以后,在 build/intermediates/split-apk/debug/slices/ 下面,可以看到生成的 Split APKs,我們選擇其中一個,在 manifest 文件中,定義了 split 標簽,表示當前的 Split APK 編號。

    在 build/intermediates/instant-run-apk/debug/ 下面,是 Base APK,包含一些公共的資源。

    我們在安裝 Split APKs,可以使用 adb install-multiple 以及 adb shell pm install-create,adb shell pm install-write,adb shell pm install-commit 等命令來進行。具體命令可以參考這里。

    4.3 App Bundle

    App Bundle 是 2018 年 Google I/O 大會上引入的新的 App 動態化框架,是借助 Split APKs 原理完成的動態加載。
    和傳統安裝方式對比如下。

    App Bundle 依賴于 .aab 文件。一個 aab 的結構如下。

    base/ 中是通用的資源,feature1/ feature2/ 中是根據特定屏幕密度,CPU 架構等區分的特定資源。

    我們以 simpleapk demo 為例看一下 App Bundle 的使用。要使用 App Bundle,需要創建一個 base module 和 feature module。
    我們的 simpleapk 是 base module,然后創建了一個 feature module。這里要注意的是 feature module 需要選擇 Dynamic Feature Module。

    創建 feature module 以后我們看看其 build.gradle 文件,可以看到依賴了 base module。

    dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation project(':simpleapk') } 復制代碼

    然后在 base module 里配置了 dynamicFeatures。

    android {bundle {// ...}dynamicFeatures = [":dynamic_feature"] } 復制代碼

    我們在項目中執行 bundleDebug 命令,就可以看到,在 build/outputs/bunudle/debug 目錄下就生成了 xxx.aab 文件,Google Play 會根據 xxx.aab 生成用戶安裝所需要的 APK 了。
    .aab 本質也是一個 zip 文件,我們解壓看看。包里的內容如下。

    我們可以通過 Google 提供的 bundletool 將 .aab 文件生成 APK。執行下面的命令。

    java -jar bundletool-all-0.10.2.jar build-apks --bundle=build/outputs/bundle/debug/simpleapk.aab --output=bundle.apks 復制代碼

    生成的 bundle.apks 也是一個 zip 文件,我們也解壓看看。

    可以看到,bundle.apks 里包含了兩個目錄,一個是 splits/,下面放的是 Base APK 和 Split APK,另一個目錄是 standalones/,下面放的是根據不同屏幕密度生成的完整的 APK,用來在不支持 App Bundle 的設備上進行安裝。

    當然現在 App Bundle 的使用,完全依賴于 Google Play,所以國內還是無法使用的。不過對其原理的了解,我們也能知道 Google 是如何區減少包大小的。

    總結

    參考資料

    Zip 文件格式

    pkware.cachefly.net/webdocs/APP… blog.csdn.net/a200710716/…

    簽名

    source.android.com/security/ap… source.android.com/security/ap… zhuanlan.zhihu.com/p/26674427

    Android Build Tools

    tech.meituan.com/2014/06/13/… tech.meituan.com/2017/01/13/… developer.android.com/studio/comm…

    Multiple APKs

    developer.android.com/studio/buil…

    Split APKs

    www.infoq.cn/article/2Mg… blog.csdn.net/ximsfei/art…

    App Bundle

    developer.android.com/guide/app-b… developer.android.com/studio/comm…

    歡迎關注下面賬號,獲取最新技術文章:
    Github
    掘金
    知乎

    總結

    以上是生活随笔為你收集整理的【Android 修炼手册】常用技术篇 -- 聊聊 Android 的打包的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    亚洲国产中文在线观看 | 色婷婷a | 69国产盗摄一区二区三区五区 | 免费精品人在线二线三线 | 91麻豆精品91久久久久同性 | 久久精品一二三区 | 激情综合婷婷 | 国产 日韩 在线 亚洲 字幕 中文 | 男女激情片在线观看 | 免费色视频在线 | 蜜臀av性久久久久av蜜臀三区 | 久久久国产精品久久久 | 日日日操操 | 亚洲综合欧美精品电影 | 日本aaaa级毛片在线看 | 91av在线播放| 国产精品99久久久久久人免费 | 亚洲人人av | 91在线视频 | 狠狠狠色 | 国产一区二区视频在线播放 | 一级黄色片在线观看 | 狠狠综合久久 | 久热免费在线 | 日本特黄特色aaa大片免费 | 天天噜天天色 | 午夜a区| 国产高清一 | 日韩精品一区二区三区水蜜桃 | 偷拍区另类综合在线 | 特级毛片aaa | 日韩欧美在线综合网 | 午夜精品久久久久99热app | 欧美一级xxxx | 99久久久国产精品美女 | 色欲综合视频天天天 | 国产精品一区二区美女视频免费看 | 成人av视屏 | 亚洲成人中文在线 | 91成品视频 | 婷婷去俺也去六月色 | 免费a网| 在线观看国产日韩欧美 | 久久激情综合网 | 国产一在线精品一区在线观看 | 91av短视频 | 婷婷久久久久 | 久久99国产综合精品免费 | 狠狠操在线 | 国产精品欧美日韩在线观看 | 成人国产在线 | 国产精品1024 | 久久神马影院 | 国产一区二区在线播放视频 | 夜夜操天天干, | 成人羞羞免费 | 日韩久久精品一区二区 | 在线播放日韩 | 中文字幕精品三级久久久 | 国产在线视频在线观看 | 久久伊人色综合 | 一二区av| 欧美黄在线 | 欧美精品久久99 | 精品国产aⅴ一区二区三区 在线直播av | 精品免费在线视频 | 国产拍在线 | 国产成人精品免高潮在线观看 | 国内免费的中文字幕 | 97超碰影视 | 精品亚洲在线 | 久久精品视频在线观看 | 久久免费视频国产 | 婷婷六月天丁香 | 久久97久久97精品免视看 | 国产精品成人在线观看 | 欧美日韩高清一区二区三区 | 欧美日韩国内在线 | 色资源网免费观看视频 | 玖玖综合网 | 欧美日韩精品区 | 免费毛片一区二区三区久久久 | 日韩免费av网址 | 又爽又黄又无遮挡网站动态图 | avove黑丝 | 亚洲人片在线观看 | 日夜夜精品视频 | 黄色软件在线观看免费 | 日韩资源视频 | 中文字幕第一页在线视频 | 国产精品第7页 | 午夜美女wwww | 午夜久久电影网 | 免费福利在线播放 | 日韩成人免费在线电影 | 国产在线观看午夜 | 久久爱综合 | 免费黄色av电影 | 综合亚洲视频 | 国产精品 亚洲精品 | 日韩一级网站 | 黄色大片视频网站 | 麻豆一区二区 | 91视视频在线直接观看在线看网页在线看 | 婷婷综合在线 | 色网免费观看 | 麻豆视频在线播放 | 久久成人综合 | 天天色天天操综合 | 国产精品久久久久一区二区三区 | 在线观看成人国产 | 国产一区二区在线免费 | 综合亚洲视频 | 一区二区国产精品 | a黄色片在线观看 | 视频成人免费 | 天天天天综合 | 亚洲精品国产日韩 | 黄色成人小视频 | 成年人天堂com | 亚洲国产精品人久久电影 | 色综合咪咪久久网 | 97国产大学生情侣白嫩酒店 | 免费91在线观看 | 欧美电影黄色 | 国产精品自产拍在线观看中文 | 国产精品白丝jk白祙 | 久久美女免费视频 | 91精品久久香蕉国产线看观看 | 亚洲区精品视频 | 色在线最新 | 国内成人综合 | 中文字幕在线播放第一页 | 视频在线观看一区 | avwww在线| 日日草视频 | 黄色资源在线观看 | 天天操天天操天天 | 999久久国精品免费观看网站 | 超碰精品在线观看 | 国产精品国产三级国产aⅴ9色 | 久久爱资源网 | 久久久久久国产精品免费 | 欧美a级一区二区 | 91麻豆精品一区二区三区 | av888.com| 亚洲国产精品va在线看黑人动漫 | 久草网站在线 | 亚洲精品午夜国产va久久成人 | 天天操天天干天天 | 久草电影在线 | 国产精品嫩草影院9 | 91在线精品播放 | 中文一区在线观看 | 激情久久综合网 | 精品视频在线免费观看 | 日韩一区二区三区免费视频 | 国产中文视 | 91一区二区在线 | 免费观看一区二区三区视频 | 99久久婷婷国产 | 99视频+国产日韩欧美 | 激情欧美丁香 | 欧美日韩在线观看不卡 | 欧美一区二区三区激情视频 | 99视频精品免费观看, | 欧美另类巨大 | 天天综合网 天天 | 国产一线在线 | 91亚洲精品在线观看 | 色99中文字幕 | 成人小视频在线播放 | 久久视奸 | 欧美黄色特级片 | 毛片视频电影 | 国产3p视频 | 成人av中文字幕在线观看 | 久久国产精品电影 | 成人免费在线视频 | 久久在线免费观看 | 国产日韩精品在线 | 日本一区二区高清不卡 | 人人草人 | 欧美日在线 | 久久综合九色综合久久久精品综合 | 欧美精品一区二区免费 | 日本黄色大片免费 | 国语精品免费视频 | 久久精品视频免费 | 一区二区精品视频 | 日韩精品一区二区不卡 | 久久成年人 | 国产中文字幕久久 | av大全在线免费观看 | 日韩高清一区 | 在线观看 亚洲 | 爱色av.com| 久久视频中文字幕 | 日日爽天天 | 日本黄色免费在线观看 | 午夜国产在线观看 | 黄色软件大全网站 | 狠狠色2019综合网 | www免费网站在线观看 | 日本一区二区高清不卡 | 91人人爽久久涩噜噜噜 | 亚洲综合成人在线 | 日日天天狠狠 | 国产高清一区二区 | av成人资源 | 欧美了一区在线观看 | 开心激情五月婷婷 | 在线视频你懂得 | 婷婷精品进入 | 天天射天天射天天 | 91人人网| 五月天视频网站 | 久久国产精品免费一区 | 99精品亚洲 | 97av超碰| 久草在线免费资源站 | 色婷婷综合久久久久 | 久99久久| av解说在线观看 | 亚洲天堂精品视频在线观看 | 日韩亚洲欧美中文字幕 | 最近中文字幕视频完整版 | 中文字幕在线视频免费播放 | 亚洲精品欧洲精品 | 免费91在线观看 | 婷婷激情综合网 | 精品国产亚洲一区二区麻豆 | 国产手机免费视频 | 久久国产精品99国产 | 日韩色av色资源 | 欧美日韩亚洲精品在线 | 色狠狠狠 | 日韩精品一区二区三区免费观看视频 | 成人av一区二区三区 | 69夜色精品国产69乱 | 人人舔人人 | 亚洲成人家庭影院 | 天天摸天天操天天爽 | 国产精品自产拍在线观看中文 | 久久久国产精品一区二区中文 | 黄色片毛片 | 成人精品国产 | 天天射天天操天天干 | 国产在线免费av | 精品国产伦一区二区三区免费 | 在线中文字幕一区二区 | 天天操天天操天天爽 | 成人免费看电影 | 久久视频在线观看中文字幕 | 91av欧美 | 天天爱天天操天天爽 | 狠狠狠狠狠狠狠 | 又黄又刺激视频 | 香蕉视频免费看 | 色综久久 | 超碰国产人人 | 五月婷婷色播 | 久久五月精品 | 激情影院在线 | 97超在线| 久久99精品国产麻豆婷婷 | 免费日韩av电影 | 久久不射电影网 | 免费看的黄色片 | 日本韩国精品一区二区在线观看 | 日韩精品久久久久久中文字幕8 | 一区二区三区免费在线观看视频 | 伊人视频 | 九九爱免费视频 | 91在线播放综合 | 精品国产一区二区三区男人吃奶 | 中文视频一区二区 | 美女中文字幕 | 91在线小视频 | 精品一区二区精品 | 91视频91蝌蚪| 亚洲成人二区 | 国产精品久久久久久久久久久久久 | 亚洲天天做 | 天天操月月操 | 国产精品免费视频久久久 | 在线国产日本 | 亚洲三级国产 | 超碰在线97观看 | 日韩电影一区二区在线观看 | 亚洲欧美日韩在线一区二区 | 色a综合| 国产精品一区在线观看 | 国产精品欧美一区二区三区不卡 | 麻豆国产精品视频 | 久久激情综合 | 亚洲精品456在线播放乱码 | 在线观看免费版高清版 | 日韩色高清 | 韩日精品在线 | 1000部18岁以下禁看视频 | 韩日视频在线 | 亚洲va在线va天堂 | 亚洲成av人片在线观看香蕉 | 国产.精品.日韩.另类.中文.在线.播放 | 中文字幕在线乱 | 国产日本高清 | 韩日在线一区 | 97成人资源 | 久久国产美女 | 国产精品永久免费 | 国产又粗又硬又长又爽的视频 | 香蕉视频一级 | 精品久久久久久亚洲综合网站 | 蜜臀aⅴ国产精品久久久国产 | 99电影| 黄色av一级 | 黄色资源网站 | 在线播放 日韩专区 | 久久tv| 狠狠久久伊人 | 在线天堂中文www视软件 | 国产综合视频在线观看 | 亚洲成人精品av | 国产高清视频色在线www | 国产精品欧美久久久久天天影视 | 国产视频一区在线免费观看 | 99久久精品免费 | 欧美精品中文字幕亚洲专区 | 天操夜夜操 | 久久精品—区二区三区 | 国产a免费| 亚洲精品网址在线观看 | 国产精品18久久久久vr手机版特色 | 国产成a人亚洲精v品在线观看 | 狠狠黄 | 成人h动漫精品一区二 | 黄色在线观看免费 | 在线观看视频免费大全 | 五月激情天 | 中文字幕在线观看网址 | 黄色国产成人 | 精品一区二区三区四区在线 | a v在线观看| 国产精品99在线观看 | 欧美日韩国产精品一区二区三区 | 亚洲精品高清在线观看 | 六月丁香在线观看 | 521色香蕉网站在线观看 | 日韩极品视频在线观看 | 最近中文字幕mv免费高清在线 | 97视频在线播放 | 久久综合五月 | 免费在线观看一区二区三区 | 亚洲激情 | 国产国产人免费人成免费视频 | 欧美日韩国产页 | 日韩av高清 | 18国产精品白浆在线观看免费 | 久久精品99视频 | 天天草天天干天天射 | 国产精品久久久久999 | 午夜精品电影 | 91精品国产99久久久久 | www蜜桃视频 | 五月婷婷激情网 | 精品免费视频 | 国产麻豆精品一区 | 久久成人18免费网站 | 国产美女精品视频免费观看 | 九九九视频在线 | 一区二区视频欧美 | 免费观看一区二区三区视频 | 日韩v在线 | 国产99久久久国产精品免费看 | 超级碰碰视频 | 国产在线观看xxx | 成人精品在线 | 亚洲欧美在线观看视频 | 911久久香蕉国产线看观看 | 国产精品资源在线观看 | 最新色站 | 色香蕉在线视频 | 亚洲国内在线 | 韩日色视频 | 国产亚洲欧美精品久久久久久 | 国产成人一区二区啪在线观看 | 国产一区精品在线观看 | 黄色精品国产 | 久久男人影院 | 国产精品久久久久久久久久了 | 久久精品视频播放 | 日韩特级毛片 | 亚洲天堂网站 | 丝袜少妇在线 | 国产99久久久国产 | 天天操天天舔天天干 | av三级av| 精品视频国产 | 欧美在线视频a | 国产精品久久二区 | 人人澡人人澡人人 | 久久 地址 | 人人草在线视频 | 日本在线中文在线 | 天天干.com | 久久欧美综合 | 亚洲成人精品久久久 | 日韩有码在线播放 | a级国产乱理伦片在线播放 久久久久国产精品一区 | www.天堂av | 日韩精品视频在线免费观看 | 999国内精品永久免费视频 | 国产精品女同一区二区三区久久夜 | 亚洲激情六月 | 97看片| 很污的网站 | 欧美日韩色婷婷 | 五月天综合色激情 | 精品国产一区在线观看 | 黄色片软件网站 | 国产精品电影在线 | 高潮久久久久久 | 免费69视频| 欧美精品乱码久久久久久 | 91丨九色丨蝌蚪丨老版 | 久久99影院 | 最新中文字幕在线资源 | 亚洲精品麻豆视频 | 日韩精品视频在线免费观看 | 黄色av电影在线观看 | 国产一线二线三线在线观看 | 精品综合久久 | 久久色在线播放 | 天天拍天天操 | 国产不卡一区二区视频 | 黄色亚洲在线 | 精品视频久久久久久 | 精品九九九 | 国产免费高清 | 99爱精品视频 | 在线观看免费版高清版 | 久久网站最新地址 | 最近日本韩国中文字幕 | 国产一二三四在线视频 | 免费午夜网站 | 午夜美女福利 | 日韩精品aaa| 国产精品亚洲人在线观看 | 久草精品免费 | 久99久视频| 日韩激情中文字幕 | 91视频麻豆 | 亚洲永久精品在线 | 人人爱爱人人 | 精品一区精品二区 | 中文字幕韩在线第一页 | 成人午夜在线观看 | 日本婷婷色 | 久久在线视频在线 | 婷婷五月情 | 成人免费在线电影 | 国产偷v国产偷∨精品视频 在线草 | 国产精品久久久久久久久久久不卡 | 日本不卡123区 | 人人讲下载 | 激情五月婷婷综合网 | 久久久精品免费看 | 欧美日韩国产一二三区 | www.色综合.com | 久久久久久高清 | 91精品国产高清自在线观看 | 911亚洲精品第一 | 天天操人人要 | 日韩欧美专区 | 国产a级精品 | 99精品电影 | 亚洲黄色a | 日韩免费电影一区二区 | 中文字幕人成一区 | 欧美成人黄色片 | 在线免费观看成人 | 综合色播| 精品久久国产精品 | 亚洲黄色在线 | 香蕉视频免费在线播放 | 亚洲色图av| 91cn国产在线 | 婷婷六月中文字幕 | 国产精品99久久久久久小说 | 欧美精品久久久久久 | 久色婷婷 | 在线视频精品播放 | 国产日本高清 | www.干| 国产精品系列在线 | 欧美日在线观看 | 婷婷深爱| 成人黄色在线视频 | 美女精品在线观看 | 免费成人结看片 | 五月综合 | 久久综合九色欧美综合狠狠 | 欧美一级日韩三级 | 亚洲色影爱久久精品 | 久久久免费精品国产一区二区 | 九九热精品视频在线观看 | 91看片淫黄大片一级在线观看 | 91精品国产91久久久久久三级 | av解说在线观看 | 精品国产一区二区三区四 | 成人av电影免费在线播放 | 日韩精品不卡在线观看 | 欧美孕妇与黑人孕交 | 99久久精品久久亚洲精品 | 美女网站视频免费黄 | 久久久久麻豆 | 国产999精品久久久影片官网 | 国产亚洲观看 | 国产激情电影综合在线看 | 99久久精品一区二区成人 | 91视频91自拍 | 亚洲视频第一页 | 国产精品av电影 | 97精品一区二区三区 | av一区在线播放 | 超碰97在线资源站 | 日本精品久久久久中文字幕5 | 国产黄色免费看 | 亚洲天堂精品 | 亚洲国产成人久久综合 | 亚洲乱亚洲乱亚洲 | 日韩在线视频免费看 | 亚洲桃花综合 | 中文在线字幕观看电影 | 亚洲激情久久 | 亚洲春色综合另类校园电影 | 特级西西444www大胆高清无视频 | 久久久久成人免费 | 精品国产一区二区三区久久久 | 午夜久久网 | 国产成人高清在线 | 在线视频观看成人 | 奇米网777 | 亚洲播放一区 | 久久国产精品网站 | 国产精品免费在线视频 | 国产在线观看,日本 | 久久精品免费播放 | 日韩不卡高清 | 欧美国产在线看 | 久久午夜精品视频 | 成人黄性视频 | 亚洲精品美女久久久 | 成人午夜电影网 | 91黄色在线看 | 日韩av片无码一区二区不卡电影 | 国产一区二区三区在线免费观看 | 久久成人免费 | 日韩精品一区二区在线观看 | 伊人婷婷色| 国产一级视频在线观看 | 国产在线观看xxx | 99国产精品一区二区 | 国产精国产精品 | 最近中文字幕mv免费高清在线 | 亚洲精品久久久久久久蜜桃 | 91精品伦理 | 亚洲精选久久 | 国产黄免费看 | 黄色国产精品 | 黄色精品一区 | 久久国产手机看片 | 999热视频| 亚州av网站大全 | 亚洲最新av在线 | 91麻豆精品国产自产在线 | 免费看片黄色 | 欧美性成人 | 日韩视频免费观看高清完整版在线 | 国产亚洲一区二区在线观看 | 免费看色网站 | 国产精品成人久久久久 | 国产麻豆精品久久一二三 | 久久99国产精品久久99 | 一级精品视频在线观看宜春院 | 亚洲影院天堂 | 成人久久免费视频 | 久久精品一区二区三区中文字幕 | 在线成人观看 | 91av免费看 | 中文字幕在线日 | 亚洲精品久久久久www | 欧美精品久久久久久 | 午夜久久久久久久久久影院 | 成人激情开心网 | 一级一级一片免费 | 亚洲最大av| 免费网站v | 91av在线国产 | 欧美精品一区二区蜜臀亚洲 | 婷婷丁香自拍 | 7777xxxx| 天天操综合网 | 91视频在线免费下载 | 亚洲成人av电影在线 | 亚洲成a人片在线www | 国产大尺度视频 | 成人网色 | 精品久久久久久久久久久久久久久久久久 | 五月天丁香亚洲 | 久久精品亚洲精品国产欧美 | 中文字幕a∨在线乱码免费看 | 国产亚洲综合精品 | 二区在线播放 | 中文字幕av在线播放 | 久草在线播放视频 | 精品一区久久 | 狠狠操综合网 | 人人澡澡人人 | 日韩在线观看中文 | 日韩av区| 99视频在线免费看 | 欧美日韩国产一区 | 久久国产精品视频观看 | www.天天草| 91九色蝌蚪国产 | 看国产黄色片 | 国内精品久久久久久久影视麻豆 | 国产色秀视频 | 不卡av在线播放 | av超碰在线 | 久久久久久黄色 | 日韩一级成人av | 国产理论一区二区三区 | 国产在线一区二区 | 不卡av电影在线 | 久久精品视频免费观看 | 91精品啪| 日韩成人不卡 | 国产精品成人自拍 | 91理论片午午伦夜理片久久 | 国产色综合 | 制服丝袜在线 | 91精品啪在线观看国产81旧版 | 91探花视频 | 激情网站免费观看 | av中文天堂在线 | 日韩极品在线 | 免费福利视频网站 | 一级特黄aaa大片在线观看 | 一区二区三区四区五区六区 | 在线导航av | 免费看av片网站 | 久久在线免费观看视频 | 在线观看视频一区二区三区 | 色婷婷精品大在线视频 | 亚洲在线激情 | 成人在线观看免费视频 | 亚洲日本精品视频 | 久久精品4 | 天天操天天综合网 | 欧美一级电影片 | 日韩在线视频免费观看 | 黄色软件网站在线观看 | 日韩免| 午夜12点 | 久久久久高清毛片一级 | 四虎在线观看视频 | 激情五月在线视频 | 欧洲视频一区 | 精品二区视频 | 中文字幕亚洲精品日韩 | 精品国产精品久久 | 97人人模人人爽人人少妇 | 欧美美女激情18p | 久久精品久久久久电影 | 四虎影视成人永久免费观看视频 | 麻豆久久久久 | 久久久午夜剧场 | 久久久久久久久精 | 美女在线免费观看视频 | 国产一区免费在线观看 | 国产久草在线 | 欧美日韩二区在线 | 在线观看日韩精品 | 美女国产在线 | 五月天电影免费在线观看一区 | 视频二区在线 | 嫩草伊人久久精品少妇av | 国产精品第7页 | 日韩在线观看a | 九九久久免费视频 | 日韩网站在线免费观看 | 午夜视频在线观看一区二区三区 | 久草五月 | 国产精品久久久久久久99 | 亚洲va欧美va人人爽春色影视 | 天天爽天天碰狠狠添 | 人人爱爱人人 | 久久成年人网站 | 最近最新中文字幕 | 久久免费电影网 | 欧美一级片在线播放 | 97超碰中文 | 亚洲精品1234区 | 久久艹人人 | 久久99精品国产99久久 | 欧美精品黑人性xxxx | 久爱精品在线 | 五月婷婷六月丁香激情 | 免费看在线看www777 | 国产精品理论视频 | 成人国产精品久久久春色 | 欧美日韩视频精品 | 国产在线免费 | 国产精品久久视频 | 国产超碰在线 | 久草在线观看资源 | av中文字幕在线观看网站 | 日韩h在线观看 | 精品免费观看视频 | 免费午夜在线视频 | 午夜视频99 | 97电影手机 | 在线观看免费国产小视频 | 国产一区二区免费 | 亚洲成人免费 | 色久网 | 97免费中文视频在线观看 | 国产精品久久综合 | 一区 二区 精品 | 99久在线精品99re8热视频 | 91精品网站 | 久久精品99国产精品日本 | 天天干婷婷 | 久久国产精品色av免费看 | av一区二区在线观看中文字幕 | 天天色天天操综合网 | www.天天成人国产电影 | 国产精品国产三级国产aⅴ入口 | 久久婷婷激情 | 美女视频黄的免费的 | 制服丝袜成人在线 | 亚洲闷骚少妇在线观看网站 | 国产精品成人国产乱 | 亚洲精品影视在线观看 | 亚洲综合成人av | 亚洲午夜久久久久久久久 | 欧美日韩xx| 欧美成年人在线观看 | 国产精品国内免费一区二区三区 | 超薄丝袜一二三区 | 色综合中文综合网 | 久久久久久综合 | 欧美日韩精品在线免费观看 | 五月婷婷影院 | 国产精品中文字幕在线播放 | 国产又黄又爽又猛视频日本 | 国产第一页福利影院 | 2000xxx影视 | 免费a级观看 | 特级西西www44高清大胆图片 | 99精品免费久久久久久久久日本 | www视频在线免费观看 | 在线之家免费在线观看电影 | 久草视频在线播放 | 中文在线www | 中文字幕丝袜制服 | 国产精品久久久久久婷婷天堂 | 成人久久国产 | av夜夜操 | 一级片黄色片网站 | 在线观看www.| 久久视频网址 | 伊人网综合在线观看 | 99热精品视| 99亚洲精品在线 | 正在播放亚洲精品 | 国产成人久久精品亚洲 | 久久99精品国产91久久来源 | 欧美日韩一二三四区 | 久久黄色小说视频 | 国产日韩欧美视频在线观看 | 超碰人人在线观看 | 色99之美女主播在线视频 | 日本精品小视频 | www黄免费| 亚洲一级黄色片 | 亚洲精品自拍 | 久久久久久国产精品亚洲78 | 黄网站app在线观看免费视频 | 欧美日韩国语 | 亚洲乱码久久久 | 狠狠狠狠干 | 天堂视频一区 | 日韩视频在线不卡 | 中文字幕中文字幕在线中文字幕三区 | 色综合天天综合在线视频 | 91在线观看黄 | 精品久久久久免费极品大片 | 日韩在线视频线视频免费网站 | 在线 高清 中文字幕 | 一级一片免费视频 | 精品天堂av| 精品影院一区二区久久久 | 精品久久久999 | 五月婷婷欧美 | 在线电影中文字幕 | 国产xxxx| 日日爽天天操 | 久久久国产一区 | 久久久精品国产免费观看同学 | 成人在线观看av | 日日干精品 | 九九在线视频免费观看 | 国产尤物视频在线 | 精精国产xxxx视频在线播放 | 久久99亚洲精品久久久久 | 中文字幕精品一区二区精品 | 草 免费视频 | 亚洲视频在线观看免费 | 精品一区二区在线免费观看 | 国产精品嫩草影院99网站 | 精品久久久久久一区二区里番 | 欧美日韩精品在线一区二区 | 国产又粗又猛又爽又黄的视频先 | 玖玖视频精品 | 久久精品伊人 | 精品久久久久久久久久岛国gif | 国产高清在线免费视频 | 国产一区在线不卡 | 天天爽人人爽夜夜爽 | 天天干天天射天天爽 | 国产经典三级 | 午夜精品久久久久久 | 99热这里有 | 国产精品成人国产乱一区 | 五月天精品视频 | 综合色影院| 婷婷久操 | 97色免费视频| 国产成人一区二区在线观看 | 久久草在线视频国产 | 午夜少妇 | 中文字幕一区二区三区在线视频 | 欧美日韩久久不卡 | 久久久久区 | 999久久久久久久久 69av视频在线观看 | 免费看久久 | 午夜国产一区 | 日韩a级黄色片 | 久久另类小说 | 97在线精品国自产拍中文 | 欧美一区二区视频97 | 毛片www | 少妇bbw搡bbbb搡bbbb | 久久97久久97精品免视看 | 国产黑丝一区二区三区 | 99精品久久99久久久久 | 久久伦理电影网 | www五月天com| 久久成人免费 | 久久综合中文字幕 | 精品一区二区在线免费观看 | 国产高清免费观看 | 欧美日韩一区久久 | 国产一级片免费播放 | 激情久久五月天 | 最新色站 | 成人av手机在线 | 99精品国产成人一区二区 | 欧美精品久久久久久久久久丰满 | 国产精品情侣视频 | 青青河边草免费直播 | 99久久久成人国产精品 | 激情视频区| 中文字幕人成一区 | 天天综合天天做天天综合 | 中文字幕在线观看91 | 国产精品成人一区二区三区吃奶 | 中文在线亚洲 | a√天堂资源 | 91久久一区二区 | 亚洲精品免费在线播放 | 天天操天天干天天爽 | 久久伊人精品天天 | 日韩一二区在线观看 | 操碰av| 久久亚洲欧美日韩精品专区 | 在线播放日韩 | 黄色三级免费片 | 国产精品毛片久久久久久久久久99999999 | 久久久福利 | a久久久久 | 久久免费视频4 | 成人午夜剧场在线观看 | 国产高清视频在线 | 欧美一级片免费在线观看 | 永久黄网站色视频免费观看w | 国产色视频一区 | 在线激情电影 | 最新日本中文字幕 | 国产女人40精品一区毛片视频 | 99久久婷婷国产综合亚洲 | 天堂av在线免费观看 | 99热这里只有精品在线观看 | 日韩精品网址 | 午夜精品一区二区三区视频免费看 | 亚洲精品ww | 97视频网址 | 天天躁天天躁天天躁婷 | 少妇bbbb搡bbbb搡bbbb | 91探花国产综合在线精品 | 超碰97人人干| 色综合激情网 | 国产精品久久久av | 亚洲免费永久精品国产 | 日韩欧美一区二区三区黑寡妇 | 99热官网 | 国产精品一区二区久久久久 | 日本大片免费观看在线 | 天天搞夜夜骑 | 六月丁香在线视频 | 久久你懂得 | 黄色在线观看网站 | 在线v片免费观看视频 | 久久r精品 | 婷婷激情影院 | 天天操天天综合网 | 最近2019中文免费高清视频观看www99 | 久久露脸国产精品 | www.亚洲黄| 中文字幕电影网 | 7799av | 亚洲v欧美v国产v在线观看 | 国产成人1区 | 国产精品视频永久免费播放 | 国产高清日韩 | 日韩电影精品一区 | 国产在线精品区 | 五月婷婷,六月丁香 | 久久天堂网站 | 天天干天天操天天搞 | 色综合天天在线 | 国产高清中文字幕 | 二区三区精品 | 91成人蝌蚪 | 国产精品久久久久久久婷婷 | 免费福利在线观看 | 亚洲人成人99网站 | 国产91成人在在线播放 | 黄色一级大片在线免费看国产一 | 97免费视频在线 | 最近日韩免费视频 | 久久免费一 | 日韩网站在线播放 | 中文字幕一区二区三区四区 | 色在线网站 | 99久久激情 | 色噜噜噜噜 | 国产明星视频三级a三级点| 久久精品一区二区 | 国产精品大全 | 狠狠久久婷婷 | 一区二区三区在线免费观看视频 | 久草综合视频 | 99视频精品视频高清免费 | 探花在线观看 | 黄色av影院 | 最新真实国产在线视频 | 99精品在线看 | 亚洲永久av | 九九免费视频 | 成人av在线电影 | 国产精品岛国久久久久久久久红粉 | 色综合www | 美女网站视频色 | 久久国产美女视频 | av一级一片| 亚洲精品国产精品久久99热 | av网站播放 | 中文字幕成人网 | 狠狠狠干狠狠 | 高清久久久 | 久久人人精 | 在线视频精品播放 | 午夜在线观看一区 | 久久精品视频18 | 久久天天操| 国产区第一页 | 日韩毛片在线免费观看 | 狠狠色丁香婷婷综合久小说久 | 一区二区三区视频网站 | 婷婷在线观看视频 | 欧美人牲 | 性色av免费观看 | 欧女人精69xxxxxx |