摘要:本文已獲得原作者授權同意,翻譯以及轉載原文鏈接作者譯文鏈接更小更快構建的奇淫技巧翻譯人上個月,我有機會在發表演講。禁用更新構建下一個技能是在中禁用更新構建。它將使每小時檢查庫的新版本,并增加構建時間。
本文已獲得原作者授權同意,翻譯以及轉載
原文鏈接:Build your Android app Faster and Smaller than ever
作者:Jirawatee
譯文鏈接:Gradle更小、更快構建APP的奇淫技巧
翻譯人:MrTrying
上個月,我有機會在 LINE DEVELOPER DAY 2018 發表演講。對我來說是特殊的時刻,因為這是我第一次在日本演講。在成為演講者之前,LINE 活動的工作人員必須向全球團隊提交他們的演講。
我提交的主題是關于如何更快構建 Android App,以及如何生成更小的 APK 的一些技巧。這些提示來自于我的經驗和 Google I/O,特別是在 Developer Build Clinic 中收集到的。Developer Build Clinic 是 Android Studio 團隊為改進構建性能方面提供的一對一咨詢。
在本文中,我想與你分享這些技巧和 app,給你帶來的 app 是 LINE MAN Driver。
對于不知道 LINE MAN 是什么的人來說,它是一個按需助理提供專業服務的 app,包括食物配送、便利店貨物配送、信使服務、包裹服務和出租車服務,隨時滿足所有泰國用戶的需求。
請注意,實際結果可能會有所不同,因為它取決于您的項目特征和構建環境,例如項目規模、資源、依賴關系和機器性能。構建更小App的技巧
APK 的大小將會影響 app 的加載速度、內存占用以及電量消耗。我想大多數人都知道,APK 大小是用戶參與度的重要因素。讓我們來看看當前在 LINE MAN Driver 中 app 的大小。
優化 APK,快速的建議是使用 Android Studio 的APK Analyzer。打開 Android Studio ,然后選擇Profile or debug APK,瀏覽你的 APK 文件。
大多數人都是在遺留項目中開發,有很多圖片、布局和string你從來沒有用過,但是你不知道也不想自己刪除它,因為你害怕會讓你的 app 崩潰,對嗎?所以,在 Android Studio 中,它提供了Remove Unused Resources的選項。
它對我們非常有幫助,因為他能自動找到無用的資源,然后你能一鍵刪除它們。
有些依賴內部包含了一堆庫,像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
你將看到在項目中用到的所有的依賴,然后確保只用你所需要的。
默認情況下,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。
這個技巧和前一個技巧相似,但是此技巧是用于支持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。
這個技巧不同于多個 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的情況中在某些設備上發現了崩潰。
有時,你創建一個本地的 app,你只想支持一些特殊的語言。但是,有一些依賴包含全世界的很多語言,你不需要所有的這些。因此,你可以使用resConfigs屬性指定你想要的語言,你的 app 將更小。
android { defaultConfig { resConfigs "en", "th" ... } }
默認情況下,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。
有時候,我看到開發者使用Bitmap的漸變背景或者圓角圖。實際上,bitmap圖比 Android Studio 提供的Shape Drawable更大,因為在Shape Drawable中,你可以以xml的格式繪制矩形、橢圓、圓、圓角和其他。
相同質量下 Webp 更小,最多30%。唯一需要注意的是操作系統的要求。如果你使用不透明的背景,Webp 的 API 等級是API 15及以上支持。但是如果你想在 Webp 中支持透明背景,你需要支持API 18或者更高,Android Studio 還為您提供了一種將圖像轉換為 WebP 格式的簡便方法。你可以右擊你想要的圖片,選擇Convert to WebP,然后你會看到下圖。
因此,讓我們看一個示例結果,圖像尺寸減小到原始尺寸的15%,質量為90%。
從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分鐘。
第一個技術,確保你的 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" } ... }
第二個技術是避免 Legacy Multidex。如你所知,如果你的 app 超過64k方法限制,你需要使用 Multidex。如果你的的minSdkVersion是21或更低,你也是用 Multidex,那么你將使用 Legacy Multidex,這會使你在構建時變慢。
要避免 Legacy Multidex,你可以定義新的flavor,并在app/build.gradle中指定minSdkVersion為21或更高。
productFlavors { development { minSdkVersion 21 ... } }
第三個技術,你應該在開發構建環境禁用多個 APK 生成,因為打包和創建這些 APK 需要時間。所以,你能在app/build.gradle的 debug 代碼塊中添加以下兩行代碼禁用它。
buildTypes { ... debug { splits.abi.enable = false splits.density.enable = false } }
在你開發構建中最小化打包的資源。默認情況下,構建系統包含 app 和庫使用的所有語言和屏幕密度。開發期間你不需要用到所有的這些資源,你能通過添加resConfigs來使用這些資源中的一組,并指定開發構建所需的語言和屏幕密度。
productFlavors { dev { resConfigs("en", "xhdpi") ... } }
默認情況AAPT將會縮進PNG來減小它們的大小,對于你發布 APK 是一件好事,但是它對于你開發構建并不重要。要避免PNG縮緊,你可以使用下面的屬性并將其設置為false。
buildTypes { ... debug { aaptOptions.cruncherEnabled = false ... } }
默認情況下,當你點擊 RUN按鈕時,系統將會嘗試冷切換,app 需要重啟,但是當你點擊 Apply Changes按鈕時,系統將先嘗試熱交換,這會將更改直接推送到實時進程。
下一個技能是在 Firebase Crashlytyics 中禁用更新構建ID。我想很多人使用 Crashlytics,每次構建 Crashlytics 將默認生成一個唯一的構建ID。你可能不知道他們為你提供了一個關閉它的方式,如下
buildTypes { debug { ext.alwaysUpdateBuildId = false ... } }
你需要注意,只在 debug 塊中設置為false。
Gradle 通過在依賴行末尾添加+,提供一種非常方便獲取每個依賴的最新版本。它將使 Gradle 每24小時檢查庫的新版本,并增加構建時間。
android { dependencies { implementation "com.android.support:appcompat-v7:+" ... } }
這里的代碼是我從 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
因此,我鼓勵你嘗試這些配置,我保證你將節省大量的建設時間。
下一步是什么?在即將推出的 Android Studio 3.3 中可以使用R8的下一代代碼shrinker。它將減少無用的代碼和資源,并縮小您的源代碼。因此 Android Studio 聲稱構建時間和 APK 大小會更小。
讓我們看看,在使用這些技巧之后新的完整建筑速度。現在我花了大約1分鐘完成建設。所以這次累積改進,完整版本現在快3倍。
你想象一下,如果你的舊項目比 LINE MAN Driver 程序應用程序更大,你可以減少多少大小以及可以節省多少時間。
以下是我在 LINE DEVELOPER DAY 2018 的演講中的幻燈片和視頻
Slide
Youtube
所以我希望這些技巧和技巧可以幫助你提高生產力。
Enjoy coding,Thank you!
閱讀更多在Java中如何優雅地判空
我為什么主張反對使用Android Fragment
NDK項目實戰—高仿360手機助手之卸載監聽
(Android)面試題級答案(精選版)
又擼一年的代碼!盡管我禿頭還白發,我還是堅持了
相信自己,沒有做不到的,只有想不到的在這里獲得的不僅僅是技術!如果您覺得不錯,歡迎關注和交流!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72817.html
摘要:本文已獲得原作者授權同意,翻譯以及轉載原文鏈接作者譯文鏈接更小更快構建的奇淫技巧翻譯人上個月,我有機會在發表演講。禁用更新構建下一個技能是在中禁用更新構建。它將使每小時檢查庫的新版本,并增加構建時間。 本文已獲得原作者授權同意,翻譯以及轉載原文鏈接:Build your Android app Faster and Smaller than ever作者:Jirawatee譯文鏈接:...
摘要:在上一篇文章里的奇淫技巧字符串截斷中我們介紹過了使用來進行截斷字符串的用法這次我們來了解下的邏輯用法什么是邏輯用法呢就程序中的關系就叫做邏輯了支持的與或者與嗎答案是當你嘗試這樣配置重載時會報出錯誤那么我們應該怎樣來實現和的邏輯關系呢 在上一篇文章:《NGINX里的奇淫技巧 —— 1. 字符串截斷》中, 我們介紹過了使用if來進行截斷字符串的用法, 這次我們來了解下if的邏輯用法: 什...
摘要:接上文的奇淫技巧實現數學比較功能竟然不支持這樣的寫法隨機從取隨機從取如果正則匹配如果正則不匹配求大牛來實現 接上文 《NGINX的奇淫技巧 —— 6. IF實現數學比較功能 (1)》 NGINX竟然不支持這樣的寫法.... location = /test/ { default_type html; set_random $a 0 9; #$a 隨機 從0-...
摘要:駝峰名轉下劃線獲取參數貸款買房,也意味著你能給自己的資產加杠桿,能夠撬動更多的錢,來孳生更多的財務性收入。特殊字符轉義格式化數量方法一方法二方法三測試質數如何優雅的實現金錢格式化代碼來自于收集,方便學習 駝峰名轉下劃線: componentMapModelRegistry.match(/^[a-z][a-z0-9]+|[A-Z][a-z0-9]*/g).join(_).toLowerC...
閱讀 2420·2021-11-18 10:02
閱讀 687·2021-10-08 10:04
閱讀 2250·2021-09-03 10:51
閱讀 3540·2019-08-30 15:44
閱讀 2799·2019-08-29 14:09
閱讀 2464·2019-08-29 12:21
閱讀 2064·2019-08-26 13:45
閱讀 1800·2019-08-26 13:25