溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

通過(guò)Gradle為APK瘦身

發(fā)布時(shí)間:2020-09-05 05:47:52 來(lái)源:網(wǎng)絡(luò) 閱讀:475 作者:博文視點(diǎn) 欄目:移動(dòng)開發(fā)

引言:在過(guò)去幾年中,APK 文件的大小曾急劇增長(zhǎng)態(tài)勢(shì)。一般來(lái)說(shuō),其原因如下:Android開發(fā)者獲取了更多的依賴庫(kù),添加了更多的密度,Apps 增加了更多的功能。但實(shí)際上我們應(yīng)該讓APKs 盡可能的小,更小的APK 意味著用戶可以更快地下載和安裝應(yīng)用,并使它占用更小的內(nèi)存。 
本文選自《Gradle for Android 中文版》,將研究如何設(shè)置Gradle 構(gòu)建配置文件中的幾個(gè)屬性,以縮小APK 文件。

ProGuard

  ProGuard 是一個(gè)Java 工具,其不僅可以縮減APK 文件大小,還可以在編譯期優(yōu)化、混淆和預(yù)校驗(yàn)?zāi)愕拇a。其通過(guò)你應(yīng)用的所有代碼路徑,來(lái)找到未被使用的代碼,并將其刪除。 
  ProGuard 還會(huì)重命名你的類和字段。這一過(guò)程將保留應(yīng)用的蹤跡,讓反編譯工程師更加難以讀懂代碼。 
  在Gradle 的Android 插件中,其構(gòu)建類型下面有一個(gè)叫作minifyEnabled 的布爾類型屬性,你需要將它設(shè)置為true 來(lái)激活ProGuard :

android {
  buildTypes {
        release {
             minifyEnabled true
             proguardFiles getDefaultProguardFile
             ('proguard-android.txt'), 'proguard-rules.pro'
             }
        }
   }

  當(dāng)minifyEnabled 被設(shè)置為true 后,在構(gòu)建過(guò)程中,proguardRelease task 會(huì)被執(zhí)行,并調(diào)用ProGuard。 
  在激活ProGuard 之后,應(yīng)重新測(cè)試整個(gè)應(yīng)用,因?yàn)镻roGuard 可能會(huì)移除一些你仍需要使用的代碼。這也是很多開發(fā)者不喜歡ProGuard 的原因。為了解決這個(gè)問(wèn)題,你可以定義ProGuard 規(guī)則,排除那些被刪除或混淆的類。我們可以使用proguardFiles 屬性來(lái)定義包含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ī)則的信息,則可以通過(guò)http://developer.android.com/tools/help/proguard.html. 來(lái)查閱AndroidProGuard 的官方文檔。除了縮減Java 代碼外,還可以縮減使用過(guò)的資源。

縮減資源

  當(dāng)給App 打包時(shí),Gradle 和Gradle 的Android 插件可以在構(gòu)建期間刪除所有未使用的資源。如果你有舊的資源忘記刪除,那么這個(gè)功能可能非常有用。另外一個(gè)使用案例是當(dāng)你導(dǎo)入一個(gè)擁有很多資源的依賴庫(kù),而你只使用了其中的一小部分時(shí),你可以通過(guò)激活縮減資源來(lái)解決這個(gè)問(wèn)題??s減資源的方式有兩種:自動(dòng)和手動(dòng)。

自動(dòng)縮減

  最簡(jiǎn)單的方式是在你的構(gòu)建中設(shè)置shrinkResources 屬性。如果設(shè)置該屬性為true,則Android 構(gòu)建工具將自動(dòng)判定哪些資源沒(méi)有被使用,并將它們排除在APK 外。使用此功能有一個(gè)要求,即必須同時(shí)啟動(dòng)ProGuard。這是因?yàn)榭s減資源的工作方式是,直到代碼引用這些資源被刪除之前,Android 構(gòu)建工具不能指出哪些資源沒(méi)有被用到。 
  下面的代碼片段展示了在某個(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%

  你可以通過(guò)在構(gòu)建命令中添加 –info 標(biāo)志,來(lái)獲得APK 縮減資源的概覽:

$ gradlew clean assembleRelease –nfo

  當(dāng)你使用該標(biāo)志時(shí),Gradle 會(huì)打印出許多關(guān)于構(gòu)建過(guò)程的額外信息,包括最終構(gòu)建不會(huì)輸出的每個(gè)資源。 
  自動(dòng)資源縮減有一個(gè)問(wèn)題,即它可能移除了過(guò)多的資源,特別是那些被動(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é)果中被剝離出來(lái)。

手動(dòng)縮減

  去除某種語(yǔ)言文件或某個(gè)密度的圖片,是刪減資源的一種比較好的方式。一些依賴庫(kù),例如Google Play Services,其包含了多種語(yǔ)言。如果你的應(yīng)用只支持一兩種語(yǔ)言,那么在最終的APK 中,包含所有語(yǔ)言的文件就會(huì)浪費(fèi)許多資源。這時(shí)你就可以使用resConfigs 屬性來(lái)配置你想保留的資源,將其余部分刪除。 
  如果你只想保留英語(yǔ)、丹麥語(yǔ)和荷蘭語(yǔ)的字符串,則可以這樣使用resConfigs :

android {
    defaultConfig {
          resConfigs “en", “da", “nl"
    }
}

  你也可以這樣處理密度集合:

android {
    defaultConfig {
          resConfigs “hdpi", “xhdpi", “xxhdpi", “xxxhdpi"
    }
}

  你甚至可以結(jié)合語(yǔ)言和密度。實(shí)際上,使用此屬性可以限制每一種類型的資源。 
  如果設(shè)置ProGuard 讓你感覺(jué)很困難,或者你僅僅想在應(yīng)用中去除不支持的語(yǔ)言資源或密度,那么你可以使用resConfigs 來(lái)縮減資源。 
  本文選自《Gradle for Android 中文版》,點(diǎn)此鏈接可在博文視點(diǎn)官網(wǎng)查看。 
                   通過(guò)Gradle為APK瘦身


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI