通過Gradle和Android Studio構建和運行應用程序比通過Eclipse慢
android-studio build.gradle (18)
Android Studio 2.3之後更新
所有的答案都很好,我鼓勵使用這些方法來提高構建速度。
在2016年9月發布Android 2.2之後,Android發布了實驗性構建緩存功能,以加速gradle
構建性能,現在該功能已在Android Studio 2.3 Canary中正式發布。 (官方發布說明)
它引入了一個默認啟用的新構建緩存功能,可以通過存儲和重用在以前的相同或不同Android版本中創建的文件/目錄,加快構建時間(包括完整構建,增量構建和即時運行)項目。
如何使用:
在你的gradle.properties
文件中添加以下行
android.enableBuildCache = true
# Set to true or false to enable or disable the build cache. If this parameter is not set, the build cache is enable by default.
清理緩存:
有一個叫做
cleanBuildCache
的新Gradle任務cleanBuildCache
讓您更輕鬆地清理構建緩存。 您可以在終端中輸入以下內容來使用它:./gradlew cleanBuildCache
或者您可以通過刪除所有存儲在位置的文件清理Android Studio 2.2的緩存
C:\Users\<username>\.android\build-cache
我有一個多項目(〜10個模塊),其中每次大約需要20-30秒。 當我按下Android Studio中的Run時,我必須等待每一次重建應用程序,這是非常緩慢的。
是否有可能在Android Studio中自動完成構建過程? 或者你有關於如何使這個過程更快的建議?
在Eclipse中,感謝自動構建,在模擬器上運行相同的項目大約需要3-5秒。
這是我的build.gradle文件(app模塊):
buildscript {
repositories {
maven { url 'http://repo1.maven.org/maven2' }
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
}
apply plugin: 'android'
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile project(':libraries:SharedLibs')
compile project(':libraries:actionbarsherlock')
compile project(':libraries:FacebookSDK')
compile project(':libraries:GooglePlayServices')
compile project(':libraries:HorizontalGridView')
compile project(':libraries:ImageViewTouch')
compile project(':libraries:SlidingMenu')
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 8
targetSdkVersion 16
}
}
硬件
我很抱歉,但是將開發站升級到固態硬盤和大量內存的影響可能比下面幾個點的影響更大。
工具版本
確保您使用最新的Gradle和Android Gradle插件 ,提高構建性能是開發團隊的主要優先事項。
配置文件
在適用的任何目錄中創建一個名為gradle.properties
的文件:
-
/home/<username>/.gradle/
) -
/Users/<username>/.gradle/
) -
C:\Users\<username>\.gradle
(Windows)
附加:
# IDE (e.g. Android Studio) users:
# Settings specified in this file will override any Gradle settings
# configured through the IDE.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# The Gradle daemon aims to improve the startup and execution time of Gradle.
# When set to true the Gradle daemon is to run the build.
# TODO: disable daemon on CI, since builds should be clean and reliable on servers
org.gradle.daemon=true
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# https://medium.com/google-developers/faster-android-studio-builds-with-dex-in-process-5988ed8aa37e#.krd1mm27v
org.gradle.jvmargs=-Xmx5120m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
org.gradle.parallel=true
# Enables new incubating mode that makes Gradle selective when configuring projects.
# Only relevant projects are configured which results in faster builds for large multi-projects.
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand
org.gradle.configureondemand=true
# Set to true or false to enable or disable the build cache.
# If this parameter is not set, the build cache is disabled by default.
# http://tools.android.com/tech-docs/build-cache
android.enableBuildCache=true
如果將它們放置在projectRoot\gradle.properties
並且將它們放在user_home\.gradle\gradle.properties
,則它們是user_home\.gradle\gradle.properties
。 如果您從控制台或直接從主意運行gradle任務,則應用該屬性:
IDE設置
可以從IDE設置GUI調整Gradle-IntelliJ集成。 啟用“離線工作”(檢查下面的yava答案)將禁用每個“同步gradle文件”上的真實網絡請求。
本機多功能dex
apk構建的最慢步驟之一是將java字節碼轉換為單個dex文件。 啟用本地multidex(minSdk 21僅適用於調試版本)將有助於工具減少工作量(請查看下面的Aksel Willgert的答案)。
依賴
比庫子項目更喜歡@aar
依賴關係。
在mavenCentral , jCenter上搜索aar包,或者使用jitpack.io從github構建任何庫。 如果您不編輯依賴庫的源代碼,則不應每次使用項目源編譯它。
殺毒軟件
考慮從防病毒掃描中排除項目和緩存文件。 這顯然是安全的權衡(不要在家裡試試!)。 但是,如果您在許多分支之間切換,那麼防病毒軟件會在允許gradle進程使用它之前重新掃描文件,這會減慢構建時間(特別是AndroidStudio與Gradle文件和索引任務同步項目)。 測量構建時間並在啟用和未啟用防病毒功能的情況下處理CPU,以查看它是否相關。
分析構建
Gradle內置了對分析項目的支持。 不同的項目正在使用插件和自定義腳本的不同組合。 使用--profile
將有助於找到瓶頸。
在低配置機器上運行Android環境。
- 關閉瀏覽器中的常規web標籤
- 對於防病毒用戶,排除自動生成的生成文件夾
Android Studio擁有1.2 Gb的默認堆可減少到512 MB幫助>編輯自定義VM選項studio.vmoptions -Xmx512m佈局性能將加快
對於Gradle,Android studio Mkae的核心組件之一肯定就像現在3.0beta是最新的一個
以下提示會影響代碼質量,請謹慎使用:
Studio打開時包含電源安全模式,它將關閉皮棉,編碼補碼等後台操作。
您可以在需要時手動運行lintcheck ./gradlew lint
大多數使用Android模擬器的平均消耗2 GB RAM,所以如果可能的話使用實際的Android設備,這些將減少您的計算機上的資源負載。 或者,您可以減少模擬器的RAM,它會自動減少計算機上的虛擬內存消耗。 你可以在虛擬設備配置和高級設置中找到它。
Gradle脫機模式是帶寬受限用戶禁用構建依賴項下載的功能。 它將減少後台操作,這將有助於提高Android studio的性能。
Android studio提供了並行編譯多個模塊的優化。 在低RAM機器上,此功能可能會對性能產生負面影響。 您可以在編譯器設置對話框中禁用它。
一個微不足道的變化(恢復xml)仍然需要10分鐘 。 正如@rivare在他的回答中所說的那樣,命令行構建速度更快(將其降低到15 秒 )。
下面是一些步驟,至少可以從Windows的命令行快速構建一個簡單的構建。
轉到您的項目根目錄(gradlew.bat所在的位置):
cd c:\ android \ MaskActivity
執行構建 :
gradlew assembleDebug
直接從手機上卸載 apk(拖動它卸載)。
構建完成後,使用Windows任務管理器終止BIG java進程。
或者如果你的Windows機器上有unix工具:
ps
顯示“pid”:
kill -9 <pid>
現在安裝你的apk:
adb -d安裝C:\ Android \ MaskActivity \ app \ build \ outputs \ apk \ app-debug.apk
使用此sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get install libncurses5:i386 libstdc ++ 6:i386 zlib1g:i386
先試試這個。 這是我個人的經歷。
我有同樣的問題。 我所做的只是永久禁用防病毒軟件(Mine是Avast Security 2015)。 剛剛禁用防病毒後,事情進展順利。 Gradle成功完成。 從現在開始,幾秒鐘內完成Gradle(僅需5-10秒)。
只是另一個表現imporvement提示:
Android Studio 3.0包含名為D8的新DEX編譯器。
“dex編譯器大多在日常應用程序開發的底層工作,但它直接影響您的應用程序的構建時間,.dex文件大小和運行時性能。”
“當將新的D8編譯器與當前的DX編譯器進行比較時,D8編譯速度更快,輸出更小的.dex文件,同時具有相同或更好的應用運行時性能。”
D8是可選的 - 使用它我們必須把項目的gradle.properties
android.enableD8=true
更多信息: https://android-developers.googleblog.com/2017/08/next-generation-dex-compiler-now-in.html : https://android-developers.googleblog.com/2017/08/next-generation-dex-compiler-now-in.html
PS。 它讓我的編譯時間減少了大約30%。
只需在以下目錄中創建一個名為gradle.properties的文件:
/home/<username>/.gradle/ (Linux)
/Users/<username>/.gradle/ (Mac)
C:\Users\<username>\.gradle (Windows)
將此行添加到文件中:
org.gradle.daemon=true
對我來說,速度現在等於Eclipse。
來源: https://www.timroes.de/2013/09/12/speed-up-gradle/ : https://www.timroes.de/2013/09/12/speed-up-gradle/
在我們的具體情況中,問題是由於使用了retrolambda插件,即使沒有代碼在我們的核心模塊中被改變,每次我們嘗試啟動我們的應用程序時都會強制所有項目和子項目重新編譯。
去除retrolamba為我們固定它。 希望它能幫助別人。
如果使用谷歌播放服務,根據您需要的庫而不是整個blob可以使事情變得更快。
如果您唯一需要的是地圖,請使用:
compile 'com.google.android.gms:play-services-maps:6.5.+'
代替:
compile 'com.google.android.gms:play-services:6.5.+'
後者將20k個方法(參見博客)帶入類路徑,這可能會使總方法數超過64k。
即使對於調試版本,也會強制使用proguard或multidex 。 對於我的一個項目,我有以下編譯時間
- multidex構建(支持庫)〜40秒
- proguard構建〜20秒
- 當方法限制<64k〜5sec時建立
如果在sdk 21+上開發,可以按照android文檔中的說明優化multidex構建
android {
productFlavors {
// Define separate dev and prod product flavors.
dev {
// dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
// to pre-dex each module and produce an APK that can be tested on
// Android Lollipop without time consuming dex merging processes.
minSdkVersion 21
}
prod {
// The actual minSdkVersion for the application.
minSdkVersion 14
}
}
...
}
您可以嘗試打開studio右側的gradle菜單,並僅組裝已更改的模塊,然後運行install命令。 當你按下run時,它會組裝所有的東西,不管你對它正在裝配的代碼做出什麼改變
我遠不是Gradle的專家,但我的環境在.gradle / init.gradle中有以下行
gradle.projectsLoaded {
rootProject.allprojects {
repositories {
mavenRepo name: 'libs-repo', url: 'http://guest-vm/artifactory/repo'
}
}
}
然而我不知道為什麼那條線在那裡,但我試著改變
gradle.projectsLoaded {
rootProject.allprojects {
repositories {
mavenCentral()
}
}
}
現在我終於可以不用指責Android Studio&Gradle buildind方案了。
接受的答案是舊版本的android studio,其中大部分現在仍在工作。 更新android studio使它更快一點。 不要打擾指定堆大小,因為隨著Xms和Xmx的增加它會自動增加。 這是VMoptions的一些修改
在bin文件夾中有一個studio.vmoptions文件來設置環境配置。 在我的情況下,這是studio64.vmoptions如果它們尚未添加並保存該文件,請添加以下行。 在我的情況下,我有8GB內存。
-Xms4096m -Xmx4096m -XX:MaxPermSize=2048m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=utf-8`
啟動android studio。 轉至文件 - >設置 - >構建,執行,部署 - >編譯器
- 並行檢查編譯獨立模塊
- 在命令行選項中寫入:--offline
- 選中自動創建項目
- 按需檢查配置
在使用mac的情況下,起初我找不到vmoptions。 無論如何,這裡有一篇關於如何在MAC OSX中更改vmoptions的好文章 。 在這裡引用這篇文章。
打開你的終端並把這個命令打開MAC OSX中的vmoptions:
open -e /Applications/Android\ Studio.app/Contents/bin/studio.vmoptions
根據android文檔 ,將其添加到app模塊的gradle文件中。
android {
...
dexOptions {
preDexLibraries true
maxProcessCount 8
}
}
解決了礦難
File -> Settings -> Build, Execution, Deployment -> Build Tools ->
Gradle -> Offline work
Gradle版本從8分鐘變為3秒。
這個設置對我來說非常快(大約2秒)
的build.gradle
android {
dexOptions {
incremental true
preDexLibraries = false
jumboMode = false
maxProcessCount 4
javaMaxHeapSize "6g"
}
}
gradle.properties
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx8192M
我的電腦:
- CPU Intel(R)Pentium(R)CPU G2030 @ 3.00GHz,3000 Mhz,2個procesadores principales,2個procesadoreslógicos
- 64位
- 微軟Windows 7專業版
- (RAM)16.0 GB
項目文件
- 所有位於當地的高清
這是開始Android程序員(幾年前的專業程序員)加速Android Studio 2.2的原因。 我知道這是一個重複,但只是在一個地方總結 。
初始構建仍然可能非常慢,但重新啟動運行的應用程序現在通常是非常容忍的。 我使用的是次優PC:AMD四核A8-7410 CPU,8MB RAM,非SSD高清,Win 10.(並且,這是我的第一個帖子....;)
IN SETTINGS - > GRADLE:
是的“離線工作”(這也許是最重要的設置)。
IN SETTINGS - >編譯器:
是的“並行編譯獨立模塊”(不確定這實際上是否有助於使用多核CPU)。
在GRADLE SCRIPTS中 ,“build.gradle(Module:app)”:
defaultConfig {
...
// keep min high so that restarted apps can be hotswapped...obviously, this is hugely faster.
minSdkVersion 14
...
// enabling multidex support...does make big difference for me.
multiDexEnabled true
同樣在GRADLE SCRIPTS中 ,“gradle.properties(Project Properties)”:
org.gradle.jvmargs = -Xmx3048m -XX:MaxPermSize = 512m -XX:+ HeapDumpOnOutOfMemoryError -Dfile.encoding = UTF-8
org.gradle.parallel = true org.gradle.daemon = true
另外 ,在物理設備而不是仿真器上進行測試對我來說效果很好; 一個站起來的小平板很方便。