您好,登錄后才能下訂單哦!
引言:在過去幾年中,APK 文件的大小曾急劇增長態勢。一般來說,其原因如下:Android開發者獲取了更多的依賴庫,添加了更多的密度,Apps 增加了更多的功能。但實際上我們應該讓APKs 盡可能的小,更小的APK 意味著用戶可以更快地下載和安裝應用,并使它占用更小的內存。
本文選自《Gradle for Android 中文版》,將研究如何設置Gradle 構建配置文件中的幾個屬性,以縮小APK 文件。
ProGuard 是一個Java 工具,其不僅可以縮減APK 文件大小,還可以在編譯期優化、混淆和預校驗你的代碼。其通過你應用的所有代碼路徑,來找到未被使用的代碼,并將其刪除。
ProGuard 還會重命名你的類和字段。這一過程將保留應用的蹤跡,讓反編譯工程師更加難以讀懂代碼。
在Gradle 的Android 插件中,其構建類型下面有一個叫作minifyEnabled 的布爾類型屬性,你需要將它設置為true 來激活ProGuard :
android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' } } }
當minifyEnabled 被設置為true 后,在構建過程中,proguardRelease task 會被執行,并調用ProGuard。
在激活ProGuard 之后,應重新測試整個應用,因為ProGuard 可能會移除一些你仍需要使用的代碼。這也是很多開發者不喜歡ProGuard 的原因。為了解決這個問題,你可以定義ProGuard 規則,排除那些被刪除或混淆的類。我們可以使用proguardFiles 屬性來定義包含ProGuard 規則的文件。例如,為了保留一個類,你可以像下面這樣添加一條簡單的規則:
-keep public class <MyClass>
getDefaultProguardFile(‘proguard-android.txt’) 方法從Android SDK 的tools/proguard 文件夾下的proguard-android.txt 文件中獲取默認的ProGuard 設置。
在Android Studio 中,proguard-rules.pro 文件被默認添加到新的Android 模塊,所以你可以在該文件中簡單地添加一些針對該模塊的規則。
提示:你構建的每個應用或依賴庫都有不同的ProGuard 規則,所以在本書中,我們不會考慮更多的細節。如果你想了解更多關于ProGuard和ProGuard規則的信息,則可以通過http://developer.android.com/tools/help/proguard.html. 來查閱AndroidProGuard 的官方文檔。除了縮減Java 代碼外,還可以縮減使用過的資源。
當給App 打包時,Gradle 和Gradle 的Android 插件可以在構建期間刪除所有未使用的資源。如果你有舊的資源忘記刪除,那么這個功能可能非常有用。另外一個使用案例是當你導入一個擁有很多資源的依賴庫,而你只使用了其中的一小部分時,你可以通過激活縮減資源來解決這個問題。縮減資源的方式有兩種:自動和手動。
最簡單的方式是在你的構建中設置shrinkResources 屬性。如果設置該屬性為true,則Android 構建工具將自動判定哪些資源沒有被使用,并將它們排除在APK 外。使用此功能有一個要求,即必須同時啟動ProGuard。這是因為縮減資源的工作方式是,直到代碼引用這些資源被刪除之前,Android 構建工具不能指出哪些資源沒有被用到。
下面的代碼片段展示了在某個構建類型中,如何配置自動化資源縮減:
android { buildTypes { release { minifyEnabled = true shrinkResources = true } } }
如果你想看看在激活了自動化資源縮減之后,APK 縮減了多少,則可以運行shrink-ReleaseResources 任務。該任務會打印出包的大小縮小了多少:
:app:shrinkReleaseResourcesRemoved unused resources: Binary resource data reduced from 433KB to 354KB: Removed 18%
你可以通過在構建命令中添加 –info 標志,來獲得APK 縮減資源的概覽:
$ gradlew clean assembleRelease –nfo
當你使用該標志時,Gradle 會打印出許多關于構建過程的額外信息,包括最終構建不會輸出的每個資源。
自動資源縮減有一個問題,即它可能移除了過多的資源,特別是那些被動態使用的資源可能被意外刪除。為了防止這種情況的發生,你可以在res/raw/ 下的一個叫作keep.xml的文件中定義這些例外。一個簡單的keep.xml 文件如下所示:
<?xml version="1.0" encoding="utf-8"?><resources xmlns:tools="http://schemas.android.com/tools"tools:keep="@layout/keep_me,@layout/also_used_*"/>
keep.xml 文件自身也將從最終的結果中被剝離出來。
去除某種語言文件或某個密度的圖片,是刪減資源的一種比較好的方式。一些依賴庫,例如Google Play Services,其包含了多種語言。如果你的應用只支持一兩種語言,那么在最終的APK 中,包含所有語言的文件就會浪費許多資源。這時你就可以使用resConfigs 屬性來配置你想保留的資源,將其余部分刪除。
如果你只想保留英語、丹麥語和荷蘭語的字符串,則可以這樣使用resConfigs :
android { defaultConfig { resConfigs “en", “da", “nl" } }
你也可以這樣處理密度集合:
android { defaultConfig { resConfigs “hdpi", “xhdpi", “xxhdpi", “xxxhdpi" } }
你甚至可以結合語言和密度。實際上,使用此屬性可以限制每一種類型的資源。
如果設置ProGuard 讓你感覺很困難,或者你僅僅想在應用中去除不支持的語言資源或密度,那么你可以使用resConfigs 來縮減資源。
本文選自《Gradle for Android 中文版》,點此鏈接可在博文視點官網查看。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。