注意:文中提及所有針對 AndroidStudio 的性能優化建議均實踐于 Windows 平臺,Mac 和 Linux 用戶僅供參考(下面 AndroidStudio 簡稱 AS,手打英文很累的>︿<)!
首先,關于 AS 以及 AS 使用的基礎知識就此略過不表。下面略過前戲直接開始正文~
1.AS 內存優化(針對 AS 卡頓)
首先打開 AS 的安裝目錄,如果忘了 AS 安裝在哪個目錄,直接在桌面上右鍵 AS 快捷方式,然后打開文件所在位置,下面是作者的 AS 安裝目錄,供參考:
上圖用紅框圈出的兩個就是需要我們手動修改的 AS 配置文件,保持這兩個文件里的內容一致就行。這里以 studio64.exe.vmoptions 為例,打開后內容大致如下(注意后面的注釋是我手動加的):
-server
-Xms256m#JVM初始分配的堆內存,這里分配的值太小了
-Xmx1280m#JVM最大允許分配的堆內存,這里分配的值太小了
-XX:PermSize=64M#JVM初始分配的非堆內存,這里分配的值太小了
-XX:MaxPermSize=350m#JVM最大允許分配的非堆內存,這里分配的值太小了
-XX:ReservedCodeCacheSize=240m#預留代碼緩存大小,這里分配的值太小了
-XX:+UseConcMarkSweepGC#設置年老代為并發收集
-XX:SoftRefLRUPolicyMSPerMB=50
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djna.nosys=true
-Djna.boot.library.path=
-da
AS 卡頓的最主要原因就是這個配置文件里某些值分配的太小了,請參照下面修改(注意作者的電腦內存為16G,具體值依照自己電腦內存大小修改(8G的請折半)?。?/p>
-server
-Xms2048m
-Xmx4096m
-XX:PermSize=2048M
-XX:MaxPermSize=4096m
-XX:ReservedCodeCacheSize=2048m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djna.nosys=true
-Djna.boot.library.path=
-da
修改好保存,重啟下 AS 試試( ̄▽ ̄)"
分析:-xmx 參數是 Java 虛擬機啟動時的參數,用于限制最大堆內存。AS 啟動時設置了這個參數,并且默認值很小。 一旦你的工程變大,IDE 運行時間稍長,內存就開始吃緊,頻繁觸發 GC,自然會卡。
問題來了,上面修改的五個值,設的越大越好嗎?并不是的!JVM 運行其實用不了太多內存!注意這里設置的值大小一定要根據電腦的實際物理內存量力而行,如果不考慮實際物理內存而把這幾個值隨意設大可能會起到反作用!畢竟除了 JVM,別的需要內存的地方也要照顧到不是!還有,如果把上面五個值改的太大,啟動 AS 時會見到類似下面的錯誤:
總結:這里所謂的內存優化并不是直覺上的優化(減少) AS 的內存占用,恰恰相反,我們的目的是想辦法提高 AS 的內存占用,以盡最大可能給 AS 一個能相對流暢運行的硬件環境
2.優化 Gradle 編譯速度
打開C:\Users\用戶名\.gradle,找到文件 gradle.properties(沒有就新建,在單個項目的 gradle.properties 文件中加入以下配置對單個項目能起到同樣的效果,作者本人遇到過把這些腳本添加到單個項目里才起作用) 確保文件里有下面幾行內容:
org.gradle.daemon=true#開啟 daemon
org.gradle.parallel=true #并行執行 Gradle 的 tasks
#為Gradle分配足夠大的內存
org.gradle.jvmargs=-Xmx5120m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
./gradlew assembleChinaFastDebug --configure-on-demand#多modules工程優化
更多 gradle 相關優化請參考 這篇文章 以及 這篇文章
額我再多說一句,有時候我們項目里需要聯網下載的依賴都已經下載好了,在沒有添加新依賴的前提下,你如果想避免下次打開項目時因為 Gradle 要檢查依賴更新而等半天可以這樣操作:
讓 Gradle 離線工作?。ㄉ饔茫∪绻乱蕾図椧欢ㄒ獧z查好別勾選這個選項?。?/p>
3.JCenter下載優化
用 gradle 構建項目下載依賴網速有時會慢得跟那啥似的…
原因你懂的,還是因為墻的存在!
解決方法,修改 maven 倉庫地址為國內鏡像即可,新建文件 init.gradle,將以下內容復制進文件:
allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
remove repo
}
}
}
maven {
url REPOSITORY_URL
}
}
}
注意上面第三行指定的 maven 倉庫鏡像URL
將此文件放在 C:\Users\用戶名\.gradle
如果你不想用鏡像的方式還可以直接改走 https 為 http,在項目根目錄的 build.gradle 文件里做如下修改:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter(){ url 'http://jcenter.bintray.com/'}//1
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.4'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter(){ url 'http://jcenter.bintray.com/'}//2
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
注意上面代碼的1、2處
4.Android SDK 下載/更新 優化
還是因為墻的存在,有時候下載或更新 Android SDK 時,emmm…
解決方法,為 AS 設置 HTTP代理即可:
一些可用 Android SDK 國內鏡像
這里注意,如果你為 AS 設置好 http代理后發現 Android SDK 相關組件都不能正常下載、更新或依賴了,把這里的設置狀態改回 No proxy 狀態就沒事了。
5.AS 導入項目在 Building gradle project info 一直卡住
這個我就不貼圖了,AS 在這地方卡住的原因大家應該能猜到(墻的原因),gradle官網雖然可以訪問,但是從 AS 里下載的速度emmm…
解決方法也很簡單,就是手動下載gradle離線包~
首先,從項目根目錄里打開這個文件:
打開后里面的內容類似這樣:
#Wed Feb 14 10:21:32 CST 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
注意上面最后一行指定的 gradle 版本,就是本項目使用的 gradle 版本,當本地還沒下載好這里指定版本的 gradle 時,AS 去 gradle 官網下載,因為你懂的的原因,就卡在這兒了…
打開C:\Users\用戶名\.gradle\wrapper\dists\gradle-x.xx-all\xxxxxxxxxxxx,如果里面的gradle-xx-all.zip不完整(如0KB),則說明下載不成功:
下載成功后的完整樣子是這樣的:
解決方法,去 gradle官網 下載需要的指定版本的 gradle zip包,把下載好的 gradle zip包放到上面的文件目錄(C:\Users\用戶名.gradle\wrapper\dists\gradle-x.xx-all\xxxxxxxxxxxx)中,就 OK 啦,運行 AS 之后會自動解壓( ?? ω ?? )?
這時再打開 AS 導入項目,就不會卡在奇怪的地方了~
你或許想到了,除了這種解決方法,我們還可以手動修改 gradle-wrapper.properties 文件里的 gradle 版本為我們本地已經下載好的 gradle 的版本~
作者本人才疏學淺,文中難免有錯誤或遺漏的地方,還望各位賞光的同行不吝賜教,
留言評論區與作者探討。
完!
本文已于 2019.08.28 更新~