中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

通過Gradle為APK瘦身

發布時間:2020-09-05 05:47:52 來源:網絡 閱讀:481 作者:博文視點 欄目:移動開發

引言:在過去幾年中,APK 文件的大小曾急劇增長態勢。一般來說,其原因如下:Android開發者獲取了更多的依賴庫,添加了更多的密度,Apps 增加了更多的功能。但實際上我們應該讓APKs 盡可能的小,更小的APK 意味著用戶可以更快地下載和安裝應用,并使它占用更小的內存。 
本文選自《Gradle for Android 中文版》,將研究如何設置Gradle 構建配置文件中的幾個屬性,以縮小APK 文件。

ProGuard

  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 中文版》,點此鏈接可在博文視點官網查看。 
                   通過Gradle為APK瘦身


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

古田县| 呼玛县| 阿拉善盟| 连平县| 花莲县| 陆丰市| 姜堰市| 禹州市| 思茅市| 石台县| 清涧县| 明光市| 萨迦县| 栾城县| 宝清县| 江永县| 通城县| 松潘县| 马关县| 墨脱县| 施甸县| 曲松县| 三亚市| 油尖旺区| 赞皇县| 昭通市| 新泰市| 泗水县| 龙游县| 兰西县| 开远市| 平阳县| 道真| 象山县| 盈江县| 嘉善县| 广汉市| 高碑店市| 日喀则市| 福州市| 长葛市|