使用gradle減少apk大小

使用gradle減少apk大小

一. proguard

ProGuard是一個Java工具,不僅可以減少APK文件大小,還可以在編譯期間優化、混淆和預校驗代碼。通過應用的所有的代碼路徑,找到未被使用到的代碼,并將其刪除。ProGuard還會重命名類和方法。

android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}
當minifyEnabled被設置為true,在構建過程中,proguardRelease Task會被執行,調用ProguardggetDefaultProguardFile('proguard-android.txt')方法從Android SDK的tools/proguard文件夾下的proguard-android.txt中獲取默認的Proguard設置, 也可以在當前module中的proguard-rules.pro指定一些針對當前module的規則。

二. 縮減資源

當給app打包時,Gradle和Gradle的Android插件可以在構建期間刪除所有未使用的資源。如果有舊的資源忘記刪除,那么這個功能可能非常有用。另一個使用案例就是當導入一個擁有很多資源的依賴庫,但實際上只使用了其中的一小部分,可以通過激活縮減資源來解決這個問題。縮減資源有兩種方式:自動和手動。

1. 自動縮減shrinkResources

最簡單的方式是在構建中設置shrinkResources屬性,如果設置該屬性為true,則Android構建工具將自動判斷哪些資源沒有被使用,并將它們排除在APK外。使用該功能時,必須開啟ProGuard。這是因為縮減資源的工作方式是:直到代碼引用這些資源被刪除之前,Android構建工具不能指出哪些資源沒有被用到。

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

如果想看看在激活自動縮減資源后,APK縮減了多少,可以運行shrinkReleaseResources任務,這個任務會打印出包的大小縮減了多少。也可以通過在構建命令后添加-info標志,來獲取APK縮減資源的概覽:

gradlew clean assembleRelease -info
自動縮減資源有一個問題:它可能移除了過多的資源,特別是那些動態使用的資源肯能被意外刪除。為了防止這種情況,可以在res/raw/下的一個叫keep.xml的文件中定義這些例外,一個簡單的keep.xml的文件如下: xml<?xml version="1.0" encoding="utf-8"?><resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@layout/keep_me,@layout/main_*"/>

keep.xml文件本身也將從最終的結果中被剝離出來。

2. 手動縮減resConfigs去除某種語言文件或某個密度的圖片,是刪減資源的一種比較好的方式,可以通過resConfigs熟悉配置想要保留的資源,其余部分將被刪除。

Case 1. 只保留指定語言的字符串

android{ defaultConfigs{ resConfigs "en","da","nl" }}

case2. 只保留指定密度的圖片

android{ defaultConfigs{ resConfigs "hdpi","xhdpi","xxhdpi","xxxhdpi" }}

三. APK分割

可以通過在android配置代碼中定義一個splits代碼塊來配置分割,目前支持density分割和ABI分割。splits中支持以下屬性:

  • enable:boolean型,表示打開或關閉APK分割功能
  • reset():復位,若要使用include功能,則使用前需調用reset()
  • include:創建白名單,僅構建出白名單中指定的格式
  • exclude:黑名單,不會構建出黑名單中指定的格式>* compatibleScreens(僅限density):未知
  • universalApk(僅限ABI):默認為true,即除了指定的格式外,還會構建出一個通用的APK

1. density splits

android{} splits { density { enable true exclude 'ldpi','mdpi' compatibleScreens 'normal', 'large', 'xlarge' } }} 僅構建release,輸出為:

  • app-hdpi-release.apk
  • app-universal-release.apk
  • app-xhdpi-release.apk
  • app-xxhdpi-release.apk
  • app-xxxhdpi-release.apk

    2. ABI splits

    android{ splits { abi { enable true reset() include 'x86', 'armeabi-v7a', 'mips' universalApk false } }}
    僅構建debug,輸出為:
  • app-armeabi-v7a-debug.apk
  • app-mips-debug.apk
  • app-x86-debug.apk

 

來自:http://www.jianshu.com/p/f8f6ba13f4f8

 

 本文由用戶 ConcettaDPC 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!