引言:在過去幾年中,APK 文件的大小曾急劇增長(zhǎng)態(tài)勢(shì)。一般來說,其原因如下:Android開發(fā)者獲取了更多的依賴庫(kù),添加了更多的密度,Apps 增加了更多的功能。但實(shí)際上我們應(yīng)該讓APKs 盡可能的小,更小的APK 意味著用戶可以更快地下載和安裝應(yīng)用,并使它占用更小的內(nèi)存。
本文選自《Gradle for Android 中文版》,將研究如何設(shè)置Gradle 構(gòu)建配置文件中的幾個(gè)屬性,以縮小APK 文件。網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了大埔免費(fèi)建站歡迎大家使用!
ProGuard 是一個(gè)Java 工具,其不僅可以縮減APK 文件大小,還可以在編譯期優(yōu)化、混淆和預(yù)校驗(yàn)?zāi)愕拇a。其通過你應(yīng)用的所有代碼路徑,來找到未被使用的代碼,并將其刪除。
ProGuard 還會(huì)重命名你的類和字段。這一過程將保留應(yīng)用的蹤跡,讓反編譯工程師更加難以讀懂代碼。
在Gradle 的Android 插件中,其構(gòu)建類型下面有一個(gè)叫作minifyEnabled 的布爾類型屬性,你需要將它設(shè)置為true 來激活ProGuard :
android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' } } }
當(dāng)minifyEnabled 被設(shè)置為true 后,在構(gòu)建過程中,proguardRelease task 會(huì)被執(zhí)行,并調(diào)用ProGuard。
在激活ProGuard 之后,應(yīng)重新測(cè)試整個(gè)應(yīng)用,因?yàn)镻roGuard 可能會(huì)移除一些你仍需要使用的代碼。這也是很多開發(fā)者不喜歡ProGuard 的原因。為了解決這個(gè)問題,你可以定義ProGuard 規(guī)則,排除那些被刪除或混淆的類。我們可以使用proguardFiles 屬性來定義包含ProGuard 規(guī)則的文件。例如,為了保留一個(gè)類,你可以像下面這樣添加一條簡(jiǎn)單的規(guī)則:
-keep public class <MyClass>
getDefaultProguardFile(‘proguard-android.txt’) 方法從Android SDK 的tools/proguard 文件夾下的proguard-android.txt 文件中獲取默認(rèn)的ProGuard 設(shè)置。
在Android Studio 中,proguard-rules.pro 文件被默認(rèn)添加到新的Android 模塊,所以你可以在該文件中簡(jiǎn)單地添加一些針對(duì)該模塊的規(guī)則。
提示:你構(gòu)建的每個(gè)應(yīng)用或依賴庫(kù)都有不同的ProGuard 規(guī)則,所以在本書中,我們不會(huì)考慮更多的細(xì)節(jié)。如果你想了解更多關(guān)于ProGuard和ProGuard規(guī)則的信息,則可以通過http://developer.android.com/tools/help/proguard.html. 來查閱AndroidProGuard 的官方文檔。除了縮減Java 代碼外,還可以縮減使用過的資源。
當(dāng)給App 打包時(shí),Gradle 和Gradle 的Android 插件可以在構(gòu)建期間刪除所有未使用的資源。如果你有舊的資源忘記刪除,那么這個(gè)功能可能非常有用。另外一個(gè)使用案例是當(dāng)你導(dǎo)入一個(gè)擁有很多資源的依賴庫(kù),而你只使用了其中的一小部分時(shí),你可以通過激活縮減資源來解決這個(gè)問題。縮減資源的方式有兩種:自動(dòng)和手動(dòng)。
最簡(jiǎn)單的方式是在你的構(gòu)建中設(shè)置shrinkResources 屬性。如果設(shè)置該屬性為true,則Android 構(gòu)建工具將自動(dòng)判定哪些資源沒有被使用,并將它們排除在APK 外。使用此功能有一個(gè)要求,即必須同時(shí)啟動(dòng)ProGuard。這是因?yàn)榭s減資源的工作方式是,直到代碼引用這些資源被刪除之前,Android 構(gòu)建工具不能指出哪些資源沒有被用到。
下面的代碼片段展示了在某個(gè)構(gòu)建類型中,如何配置自動(dòng)化資源縮減:
android { buildTypes { release { minifyEnabled = true shrinkResources = true } } }
如果你想看看在激活了自動(dòng)化資源縮減之后,APK 縮減了多少,則可以運(yùn)行shrink-ReleaseResources 任務(wù)。該任務(wù)會(huì)打印出包的大小縮小了多少:
:app:shrinkReleaseResourcesRemoved unused resources: Binary resource data reduced from 433KB to 354KB: Removed 18%
你可以通過在構(gòu)建命令中添加 –info 標(biāo)志,來獲得APK 縮減資源的概覽:
$ gradlew clean assembleRelease –nfo
當(dāng)你使用該標(biāo)志時(shí),Gradle 會(huì)打印出許多關(guān)于構(gòu)建過程的額外信息,包括最終構(gòu)建不會(huì)輸出的每個(gè)資源。
自動(dòng)資源縮減有一個(gè)問題,即它可能移除了過多的資源,特別是那些被動(dòng)態(tài)使用的資源可能被意外刪除。為了防止這種情況的發(fā)生,你可以在res/raw/ 下的一個(gè)叫作keep.xml的文件中定義這些例外。一個(gè)簡(jiǎn)單的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 文件自身也將從最終的結(jié)果中被剝離出來。
去除某種語(yǔ)言文件或某個(gè)密度的圖片,是刪減資源的一種比較好的方式。一些依賴庫(kù),例如Google Play Services,其包含了多種語(yǔ)言。如果你的應(yīng)用只支持一兩種語(yǔ)言,那么在最終的APK 中,包含所有語(yǔ)言的文件就會(huì)浪費(fèi)許多資源。這時(shí)你就可以使用resConfigs 屬性來配置你想保留的資源,將其余部分刪除。
如果你只想保留英語(yǔ)、丹麥語(yǔ)和荷蘭語(yǔ)的字符串,則可以這樣使用resConfigs :
android { defaultConfig { resConfigs “en", “da", “nl" } }
你也可以這樣處理密度集合:
android { defaultConfig { resConfigs “hdpi", “xhdpi", “xxhdpi", “xxxhdpi" } }
你甚至可以結(jié)合語(yǔ)言和密度。實(shí)際上,使用此屬性可以限制每一種類型的資源。
如果設(shè)置ProGuard 讓你感覺很困難,或者你僅僅想在應(yīng)用中去除不支持的語(yǔ)言資源或密度,那么你可以使用resConfigs 來縮減資源。
本文選自《Gradle for Android 中文版》,點(diǎn)此鏈接可在博文視點(diǎn)官網(wǎng)查看。
文章名稱:通過Gradle為APK瘦身
本文來源:http://jinyejixie.com/article42/pggohc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、小程序開發(fā)、響應(yīng)式網(wǎng)站、虛擬主機(jī)、網(wǎng)頁(yè)設(shè)計(jì)公司、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)