Gradle更小、更快構建APP的奇淫技巧

本文已得到原做者受權贊成,翻譯以及轉載 原文連接:Build your Android app Faster and Smaller than ever 做者:Jirawatee 譯文連接:Gradle更小、更快構建APP的奇淫技巧 翻譯人:MrTryingandroid

上個月,我有機會在 LINE DEVELOPER DAY 2018 發表演講。對我來講是特殊的時刻,由於這是我第一次在日本演講。在成爲演講者以前,LINE 活動的工做人員必須向全球團隊提交他們的演講。面試

我提交的主題是關於如何更快構建 Android App,以及如何生成更小的 APK 的一些技巧。這些提示來自於個人經驗和 Google I/O,特別是在 Developer Build Clinic 中收集到的。Developer Build Clinic 是 Android Studio 團隊爲改進構建性能方面提供的一對一諮詢。安全

在本文中,我想與你分享這些技巧和 app,給你帶來的 app 是 LINE MAN Driver。bash

對於不知道 LINE MAN 是什麼的人來講,它是一個按需助理提供專業服務的 app,包括食物配送、便利店貨物配送、信使服務、包裹服務和出租車服務,隨時知足全部泰國用戶的需求。app

請注意,實際結果可能會有所不一樣,由於它取決於您的項目特徵和構建環境,例如項目規模、資源、依賴關係和機器性能。框架

構建更小App的技巧

APK 的大小將會影響 app 的加載速度、內存佔用以及電量消耗。我想大多數人都知道,APK 大小是用戶參與度的重要因素。讓咱們來看看當前在 LINE MAN Driver 中 app 的大小。jvm

優化 APK,快速的建議是使用 Android Studio 的APK Analyzer。打開 Android Studio ,而後選擇Profile or debug APK,瀏覽你的 APK 文件。ide

Tip 1:移除無用的資源

大多數人都是在遺留項目中開發,有不少圖片、佈局和string你歷來沒有用過,可是你不知道也不想本身刪除它,由於你懼怕會讓你的 app 崩潰,對嗎?因此,在 Android Studio 中,它提供了Remove Unused Resources的選項。佈局

它對咱們很是有幫助,由於他能自動找到無用的資源,而後你能一鍵刪除它們。性能

Tip 2:只添加須要的依賴

有些依賴內部包含了一堆庫,像play-services和FaceBook SDK。若是你沒有指定你須要的庫,那你將得到所有的庫,讓你的 app 變胖。例如,若是你想使用 Google 受權,你應該指定com.google.android.gms:play-services-auth:16.x.x代替com.google.android.gms:play-services:16.x.x。

你能夠經過下面的命令來細分項目的依賴

$ ./gradlew app:dependencies

複製代碼

你將看到在項目中用到的全部的依賴,而後確保只用你所須要的。

Tip 3:爲屏幕密度構建多個APK

默認狀況下,Android Studio 將會生成一個包含全部屏幕密度的通用 APK。在此技能中,你能專門排除或包含你想要在app/build.gradle支持的屏幕密度,Android Studio 將會爲你生成多個 APK。

android {
  splits {
    density {
      enable true
      // Specify a list of screen densities which Gradle won't create multiple APKs for exclude 'ldpi', 'mdpi' // Specify a list of compatible screen size for the manifest compatibleScreens 'small', 'normal', 'large', 'xlarge' } } } 複製代碼

因此,你須要將他們全部都上傳到 Google Play,最終你的用戶將會下載與他們屏幕密度匹配的 APK。

Tip 4:爲ABI構建多個APK

這個技巧和前一個技巧類似,可是此技巧是用於支持Application Binary Interfaces(ABIs)。今天,我認爲 Android 市場中有7個 CPU 框架,其中3個很難找到(mips,mips64,armeabi),以此你能夠在app/build.gradle指定你想要支持的 ABI,Android Studio 將會爲你生成多個 APK。

android {
  splits {
    abi {
      enable true
      reset()
      // Specify a list of ABIs that Gradle should create APKs for
      include 'x86', 'x86_64', 'arm64-v8a', 'armeabi-v7a'
      // If you don’t want to generate a universal APK that includes all ABIs.
      universalApk false
    }
  }
}

複製代碼

而後,你須要將他們全部都上傳到 Google Play,最後你的用戶將會下載與他們 CPU 匹配的 APK。

Tip 5:使用特定的ABI構建APK

這個技巧不一樣於多個 APK。你能指定你想要支持的 CPU 框架,Android Studio 將只生成一個 APK。

android {
  defaultConfig {
    ...
    ndk {
      abiFilters 'x86', 'x86_64', 'arm64-v8a', 'armeabi-v7a'
      // armeabi, mips and mips64 has removed since NDK r17
    }
  }
}

複製代碼

根據個人經驗,我更喜歡這個技巧,由於我曾經在多個APK的狀況中在某些設備上發現了崩潰。

Tip 6:刪除未使用替代資源

有時,你建立一個本地的 app,你只想支持一些特殊的語言。可是,有一些依賴包含全世界的不少語言,你不須要全部的這些。所以,你可使用resConfigs屬性指定你想要的語言,你的 app 將更小。

android {
  defaultConfig {
    resConfigs 'en', 'th'
    ...
  }
}

複製代碼
Tip 7:壓縮無用代碼和資源

默認狀況下,Android Studio 的 minifyEnabled爲false,但我認爲不少人爲了更小和安全因素把它設置爲true來縮小和混淆你的代碼。我建議你在app/build.gradle中添加shrinkResources,在壓縮(minify)進程以後刪除無用的資源。由於在壓縮中,gradle將移除無用的代碼,這些代碼可能會引用一些資源。

最後,我想大多數人都不知道-optimize。你能在proguard-android以後添加-optimize,它將爲你構建 app 作更多的優化,你的 app 將會更小。

android {
  buildTypes {
    release {
      minifyEnabled true

      shrinkResources true
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
  }
}

複製代碼

請注意,此過程將花不少時間,因此你應該只在發佈快中使用-optimize

Tip 8:使用Shape Drawable

有時候,我看到開發者使用Bitmap的漸變背景或者圓角圖。實際上,bitmap圖比 Android Studio 提供的Shape Drawable更大,由於在Shape Drawable中,你能夠以xml的格式繪製矩形、橢圓、圓、圓角和其餘。

Tip 9:使用Webp

相同質量下 Webp 更小,最多30%。惟一須要注意的是操做系統的要求。若是你使用不透明的背景,Webp 的 API 等級是API 15及以上支持。可是若是你想在 Webp 中支持透明背景,你須要支持API 18或者更高,Android Studio 還爲您提供了一種將圖像轉換爲 WebP 格式的簡便方法。你能夠右擊你想要的圖片,選擇Convert to WebP,而後你會看到下圖。

所以,讓咱們看一個示例結果,圖像尺寸減少到原始尺寸的15%,質量爲90%。

Tip 10:使用VectorDrawable

從API 21起,確保vector比bitmap更小,你能使用vector代替bitmap圖片。由於VectorDrawable能以相同質量的圖,下降大小到不一樣屏幕密度。

若是你正在支持minSdkVersion 20或者更低。別擔憂,你能夠用它。由於 Android 團隊提供了一個庫。所以你只須要使用23.2及其以上支持庫。

累積改進

這是在應用這些技巧後所累積的改進

還有一件事

從 Android Studeio 3.2 開始,Android App Bundle是一種新的 app 發佈格式,可讓你的 app 小的更輕鬆。你不須要添加一行代碼,只須要使用新方法導出便可。所以,當你下載你的 app 時,Google Play 動態傳輸指定設備須要的代碼和資源。

經過這種方式你不須要本身構建多個 APK 了。

請注意,文件擴展名師.aab,你須要花更多的時間來構建,但這是值得的。

更快構建app的技術

和 Android 開發者想要改進的同樣,構建速度對工做效率相當重要。從這個問題我有10個技術能夠更快的構建 LINE MAN Driver app。

優化以前,我想讓你看看 LINE MAN Driver app 如今在 Android Studio 3.2.1 的完整構建速度。

如今構建 LINE MAN Driver 的時間是3分鐘。

Technique 1:使用最新的Android plugin

第一個技術,確保你的 Android Gradle plugin 是最新的。由於有不少錯誤修復和性能問題被修復。

buildscript {
  repositories {
    jcenter()
    google()
  }
  dependencies {
    -  classpath 'com.android.tools.build:gradle:3.0.0'
    + classpath 'com.android.tools.build:gradle:3.2.1'
  }
  ...
}

複製代碼
Technique 2:避免Legacy Multidex

第二個技術是避免 Legacy Multidex。如你所知,若是你的 app 超過64k方法限制,你須要使用 Multidex。若是你的的minSdkVersion是21或更低,你也是用 Multidex,那麼你將使用 Legacy Multidex,這會使你在構建時變慢。

要避免 Legacy Multidex,你能夠定義新的flavor,並在app/build.gradle中指定minSdkVersion爲21或更高。

productFlavors {
  development {
    minSdkVersion 21
    ...
  }
}

複製代碼
Technique 3:禁用Multi APK

第三個技術,你應該在開發構建環境禁用多個 APK 生成,由於打包和建立這些 APK 須要時間。因此,你能在app/build.gradle的 debug 代碼塊中添加如下兩行代碼禁用它。

buildTypes {
  ...
  debug {
    splits.abi.enable = false
    splits.density.enable = false
  }
}

複製代碼
Technique 4:包含最少的資源

在你開發構建中最小化打包的資源。默認狀況下,構建系統包含 app 和庫使用的全部語言和屏幕密度。開發期間你不須要用到全部的這些資源,你能經過添加resConfigs來使用這些資源中的一組,並指定開發構建所需的語言和屏幕密度。

productFlavors {
  dev {
    resConfigs('en', 'xhdpi')
    ...
  }
}

複製代碼
Technique 5:禁用PNG縮緊

默認狀況AAPT將會縮進PNG來減少它們的大小,對於你發佈 APK 是一件好事,可是它對於你開發構建並不重要。要避免PNG縮緊,你可使用下面的屬性並將其設置爲false。

buildTypes {
  ...
  debug {
    aaptOptions.cruncherEnabled = false
    ...
  }
}

複製代碼
Technipue 6:使用Instant Run

默認狀況下,當你點擊 RUN按鈕時,系統將會嘗試冷切換,app 須要重啓,可是當你點擊 Apply Changes按鈕時,系統將先嚐試熱交換,這會將更改直接推送到實時進程。

Technipue 7:禁用更新構建ID

下一個技能是在 Firebase Crashlytyics 中禁用更新構建ID。我想不少人使用 Crashlytics,每次構建 Crashlytics 將默認生成一個惟一的構建ID。你可能不知道他們爲你提供了一個關閉它的方式,以下

buildTypes {
  debug {
    ext.alwaysUpdateBuildId = false
    ...
  }
}

複製代碼

你須要注意,只在 debug 塊中設置爲false。

Technipue 8:不要使用動態版本

Gradle 經過在依賴行末尾添加+,提供一種很是方便獲取每一個依賴的最新版本。它將使 Gradle 每24小時檢查庫的新版本,並增長構建時間。

android {
  dependencies {
    implementation 'com.android.support:appcompat-v7:+'
    ...
  }
}

複製代碼
Technipue 9:配置gradle.properties

這裏的代碼是我從 Android 開發經驗中收集的配置。對我而言,它們就像一種魔法,能夠幫助你更快地構建 app。

例如,默認狀況下,Android Studio 會爲你提供1.5GB的內存,這多是好事或壞事,由於它實際上取決於你項目的特徵。

org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

org.gradle.daemon=true

org.gradle.parallel=true

org.gradle.configureondemand=true

org.gradle.caching=true

android.enableBuildScriptClasspathCheck=false

複製代碼

所以,我鼓勵你嘗試這些配置,我保證你將節省大量的建設時間。

Technipue 10:使用R8新代碼shrinker

下一步是什麼?在即將推出的 Android Studio 3.3 中可使用R8的下一代代碼shrinker。它將減小無用的代碼和資源,並縮小您的源代碼。所以 Android Studio 聲稱構建時間和 APK 大小會更小。

image

累積改進

讓咱們看看,在使用這些技巧以後新的完整建築速度。如今我花了大約1分鐘完成建設。因此此次累積改進,完整版本如今快3倍。

image

總結

你想象一下,若是你的舊項目比 LINE MAN Driver 程序應用程序更大,你能夠減小多少大小以及能夠節省多少時間。

如下是我在 LINE DEVELOPER DAY 2018 的演講中的幻燈片和視頻

因此我但願這些技巧和技巧能夠幫助你提升生產力。

Enjoy coding,Thank you!

閱讀更多

在Java中如何優雅地判空

我爲何主張反對使用Android Fragment

NDK項目實戰—高仿360手機助手之卸載監聽

(Android)面試題級答案(精選版)

又擼一年的代碼!儘管我禿頭還白髮,我仍是堅持了

相信本身,沒有作不到的,只有想不到的

在這裏得到的不只僅是技術!若是您以爲不錯,歡迎關注和交流!

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息