Google Play免安裝應用可以提供豐富的原生體驗,只要點按網頁鏈接即可使用。用戶無需事先安裝即可體驗應用,提高了互動水平和質量。不過,為了讓免安裝應用能夠像普通移動網頁一樣快速加載,您需要創(chuàng)建一個結構良好、運行高效的免安裝應用。免安裝應用的二進制文件越小,加載速度越快,用戶體驗越流暢。
本文檔介紹了在管理應用結構和二進制文件大小時應遵循的最佳做法,以幫助您實現流暢的免安裝應用體驗。您也可以采用相同的做法來改進您的安裝式應用。
重構為多個功能模塊
將應用重構為多個功能模塊,可以最大程度地縮減應用二進制文件的大小。先從基礎功能模塊開始,然后將主題相關的工作流提取到各自的功能模塊中。為每個功能模塊分配一個啟動Activity和唯一網址,以便用戶能夠成功完成該模塊的工作流。
創(chuàng)建功能模塊時,應盡可能縮減基礎功能模塊的大小,尤其要注意應用中需要訪問依賴庫的部分。如果某個特定的庫只供一個功能模塊使用,應將該庫導入功能模塊本身,而非基礎功能模塊。請注意,要為特定功能模塊發(fā)布免安裝應用,該功能模塊和基礎功能模塊的總大小必須小于15 MB。
注意:如果您的免安裝應用包含的方法數目超過DEX限制(65536個方法),您仍可啟用Multidex并發(fā)布免安裝體驗,前提是應用滿足總大小上限。
最佳做法
在重構您的應用時,請牢記以下最佳做法:
兩種應用類型均使用相同的代碼庫
使用相同的模塊化代碼庫創(chuàng)建安裝式應用和免安裝應用,可以簡化應用的項目管理流程。
采用多個功能模塊的設計
即使您的應用目前只有一個工作流且只需要一個功能模塊,也最好采用多個功能模塊設計。這樣一來,在應用中添加現有模塊就不會影響原始功能模塊的大小。
一開始不要關注功能模塊大小限制
功能模塊大小限制不適用于本地構建的二進制文件。您也可以通過內部測試軌道發(fā)布免安裝應用,該軌道會對功能模塊大小實行15 MB的限制。只有Alpha和正式版軌道會實行15 MB的限制。
更新應用資源
某些應用(尤其是代碼庫歷史較長的應用)包含應用二進制文件不再使用的資源。要設法縮小應用模塊,可考慮以下常見的多余代碼來源。
縮減圖片的文件大小
您可以使用WebP文件格式代替PNG格式,從而大幅縮減應用的可繪制對象的總大小。Google Play免安裝體驗提供完整的WebP支持,包括透明度和無損壓縮,因此圖片質量會保持不變。
注意:此規(guī)則的一個例外是應用的啟動器圖標:該圖標必須使用PNG格式。不過,此規(guī)則對應用總大小的影響極小,因為大多數項目都將啟動器圖標存儲在mipmap目錄中。
如果可能,請移除對使用其他PNG圖片的所有向后兼容性要求。如果您必須使用PNG圖片,請將它們放在用于構建和安裝應用的模塊中。
注意:將應用的圖片轉換為矢量可繪制對象可以節(jié)省更多空間。不過,不同于從PNG轉換到WebP,您需要將應用代碼更改為使用矢量可繪制對象。
移除未使用的語言
如果您的應用支持多種語言,請盡可能減少本地化資源的數量。如果您使用“app compat”庫(例如android.support.v7.appcompat),這一步就特別有用。此庫包含多種語言的消息,其中一些可能不受您的應用支持。
要了解詳情,請查看如何移除未使用的備用資源(尤其是未使用的語言)。
移除多余文件
您的應用可能不再使用已導入到項目中的部分資源。為幫助移除這些資源,Android Studio針對這種特定情況提供了Lint檢查。要使用該工具,請完成以下步驟:
按Control+Alt+Shift+I(在Mac OS上按Command+Alt+Shift+I)。
在顯示的對話框中,輸入"unused resources"。
選擇Unused resources選項,啟動資源使用情況檢查流程。
如果應用中仍存在大型資源,請考慮是否可以從應用軟件包中移走這些資源,并在用戶開始與應用互動之后將其作為獨立文件下載下來。這種圖片加載延遲通常需要更改代碼,但由于這種方式只會下載用戶明確請求的資源,因此可以大幅縮減免安裝應用的文件大小。
移除未使用的庫
隨著應用范圍的擴大,其采用的依賴項數量可能會非常驚人,特別是以下類型之一:
原生庫:包含免安裝應用從不運行的原生代碼的庫。
傳遞依賴項:應用中已導入的庫所依賴的庫。
Android Studio提供了幾個有用的工具,用于識別應用項目中的任何無關依賴項:
外部庫
Android Studio的Project視圖包含一個External Libraries部分。
此部分包含您的應用使用的所有庫,包括原生代碼和所有傳遞依賴項。在此視圖中,查找應用不需要的未使用或重復的庫。
APK分析器
您可以使用APK分析器工具比較不同的build,包括免安裝應用build。
在確定您的應用不需要的庫之后,請在Gradle構建文件中添加如下所示的代碼行來排除它們:
<feature_module>/build.gradle
dependencies{
implementation('some-important-but-large-library'){
exclude group:'com.example.imgtools',module:'native'
}
}
有關縮減應用依賴項的總導入大小的詳情,請參閱Gradle的依賴項管理指南。
實現資源云端分發(fā)
如果您需要進一步縮減應用大小,可能需要利用資源的云端分發(fā)。