發布人:Google Android 開發顧問 Wojtek Kaliciński
歡迎關注『谷歌開發者』官方微信公眾號,與谷歌一起創造未來!
Android Studio 2.2 最近發布了許多新增功能和改進功能(詳情請戳這里)。在 Android Gradle 插件中,由于部分變更發生在后臺,因此很容易被忽略,如最近重新設計的集成 APK 打包和簽署步驟。
1. APK Signature Scheme v2
在 Android 7.0 Nougat 中引入了全新的 APK Signature Scheme v2 后,我們決定重新設計匯編 APK 在 Android Gradle 插件中的工作方式。您可以在文檔中閱讀有關 v2 簽名的所有底層技術信息,下面只是簡要介紹您作為 Android 應用開發者所需了解的信息:
用于驗證 APK 完整性的 APK 加密簽名現在直接位于 ZIP Central Directory 前面。
在 v1 中,簽名通過整個 APK 文件的二進制內容進行計算并驗證,而不是通過歸檔中每個文件的已解壓文件內容。
可同時通過 v1 和 v2 簽名對 APK 進行簽署,以使其仍能向后兼容以前的 Android 版本。
為什么針對 Android 的 APK 驗證方式做出此變更?首先是為了增強這個全新的簽名格式的安全性和擴展性,其次是為了改進性能,新的簽名可大幅縮短在設備上進行驗證的時間(不需要費時地解壓縮),從而加快應用安裝速度。
不過,這個全新的簽名架構對 APK 創建進程有新的限制。由于在 v1 中僅驗證未解壓的文件內容,因此,在 APK 簽署后可進行許多修改 - 可以移動甚至重新壓縮文件。事實上,編譯過程中要用到的 zipalign 工具就是這么做的,它用于根據正確的字節限制調整 ZIP 條目,以改進運行時性能。
由于 v2 簽名將驗證歸檔中的所有字節,而不是單個 ZIP 條目,因此,在簽署后無法再運行 zipalign。正因如此,現在,在編譯過程中,我們將壓縮、調整和簽署合并成一步完成。
在編譯過程中,如有任何自定義任務篡改 APK 文件或對其進行后處理(無論以任何方式),請務必停用它們,否則,v2 簽名會有作廢的風險,從而導致您的 APK 與 Android 7.0 及更高版本不兼容。
如果您選擇手動簽署和調整(例如,通過命令行),我們在 Android SDK 中提供了一個名為 apksigner 的新工具,該工具可同時提供 v1 和 v2 APK 簽署與驗證。請注意,如果您使用 v2 簽名,則在運行 apksigner之前,必須先運行 zipalign。還要記住,來自 JDK 的 jarsigner 工具與 Android v2 簽名不兼容,因此,如果您要保留 v2 簽名,您不能用它來重新簽署 APK。
在使用 Android Gradle 插件進行編譯時,如果您要停用添加 v1 或 v2 簽名功能,您可以在 build.gradle 中將以下行添加到 signingConfig 部分:
v1SigningEnabled false
v2SigningEnabled false
注:默認情況下,Android Gradle 插件 2.2 同時啟用這兩個簽署架構。
2. 發行編譯版本,減小 APK 大小
在重新設計打包程序時,我們借此機會對發布的 APK 大小進行了一些優化,從而實現更快的下載,減小了 Play 商店上的增量更新大小并減少設備空間的浪費。以下是我們做出的一些變更:
現在,對歸檔中的文件進行了排序,以最大程度減少 APK 編譯之間的差異。
所有文件時間戳和元數據均清零。
針對所有文件并行選擇級別 6 和級別 9 壓縮,并使用其中最優的壓縮,例如,就壓縮包大小而言,級別 9 壓縮作用不大,此時,選擇級別 6 可實現更好的性能。
以未壓縮的形式存儲原生庫,并在 APK 中調整頁面。這樣一來,可為 Android 6.0 Marshmallow 中的 android:extractNativeLibs="false" 選項提供支持,并允許應用使用較少的設備空間,同時在 Play 商店上產生較小的更新。
使用 Zopfli 壓縮并不能更好地支持 Play 商店更新算法。因此,不建議您使用 Zopfli 重新壓縮您的 APK。您仍可以并且我們也建議您預優化單個資源,如項目中的 PNG 文件。
這些變更有助于確保您的版本盡可能精簡,以便即使網絡連接較慢或設備性能不佳,用戶仍可以下載和更新您的應用。但對于調試版本會怎樣呢?
3. 調試版本,加快安裝速度
開發應用時,您想要實現快速的迭代周期 - 在連接的設備或模擬器上更改代碼、進行編譯并部署。
自 Android Studio 2.0 開始,我們就一直致力于盡可能加快所有步驟。借助 Instant Run,我們現在可在運行時只更新更改的代碼和資源,而新的模擬器可提供多處理器支持和更快的 ADB 速度,從而可以加快 APK 傳輸和安裝。編譯改進可進一步縮短所需的時間,在 Android Studio 2.2 中,我們針對調試版本引入了增量打包和并行壓縮。通過結合其他功能,如針對目標設備密度和 ABI 有選擇性地打包資源,可加快您的開發速度。
注意:為 Instant Run 創建或通過調用調試版本創建的 APK 文件不能在 Play 商店上分發!它們包含用于 Instant Run 的其他儀器代碼,但缺少除開始編譯時連接的設備配置資源之外的其他設備配置資源。
請確保您僅分發可使用 Android Studio Generate Signed APK 命令或 assembleRelease Gradle 任務創建的 APK 的發行版本。