Android Studio(以下均簡(jiǎn)稱為AS)是Google在2013年5月16日的I/0大會(huì)上推出的Android開發(fā)環(huán)境。
從最初的AS 1.5(我是從這個(gè)版本開始使用) 到現(xiàn)在的AS 2.1,這款開發(fā)工具有了很大的進(jìn)步,而且更新頻率也是非常高。相較于Eclipse+ADT的開發(fā)環(huán)境;在某些方面,對(duì)開發(fā)者來(lái)說的確是方便了許多。
我待AS如初戀,AS虐我千百遍
但是,這樣一個(gè)開發(fā)環(huán)境,畢竟還很“年輕”,所以自身也會(huì)存在很多或大或小的bug,加上我們對(duì)它不是很熟悉(尤其是Gradle語(yǔ)法),給我們?nèi)粘i_發(fā)帶來(lái)了很多坑爹的問題,在此做個(gè)記錄,方便以后遇到時(shí)可以快速找到解決方法,同時(shí)分享給遇到同樣問題的同學(xué)一些解決思路。
操作環(huán)境:Windows10 + Android Studio 2.1
這里只列舉解決方有共性的問題,有時(shí)候會(huì)遇到一種AS重啟(或者電腦重啟)之后就沒有問題的問題,這里不再列出。重啟大法,真是時(shí)時(shí)刻刻都有用啊。
Gradle sync/building/refreshing 很長(zhǎng)時(shí)間##
相信大部分人和我一樣,第一次使用AS的體驗(yàn)并不是很好,一方面它很占內(nèi)存,導(dǎo)致自己電腦特別卡,尤其是在構(gòu)建過程中,另一方面,對(duì)Gradle構(gòu)建方式及其語(yǔ)法的陌生,導(dǎo)致初次用AS創(chuàng)建工程費(fèi)了很大勁,所以對(duì)他并不是很看好。
我們選擇的AS的原因無(wú)非就是幾乎所有的人都開始用了,你在Github或者是一些論壇上找到的源碼,幾乎都是AS版本的。而且有些很棒的三方庫(kù),在AS上引入也許就是一行代碼的事情,可是在Eclipse上幾乎是無(wú)法實(shí)現(xiàn)的,即便實(shí)現(xiàn)也得費(fèi)很大的功夫。
有時(shí)候,我們從github上clone了一份大神的源碼,想去解讀一下,結(jié)果導(dǎo)入AS后就一直在哪里building,也許等待很長(zhǎng)一段時(shí)間后,可以building完成,但是我們完全可以省下這部分時(shí)間。
AS長(zhǎng)時(shí)間的building,一般來(lái)說是去下載gradle文件,也許你會(huì)說,我電腦文件里有g(shù)radle啊,就在下面這個(gè)目錄。
C:\Users\username\.gradle\wrapper\dists
的確,如果我們用AS正常的構(gòu)建并編譯運(yùn)行過一個(gè)工程的話,那么這個(gè)文件夾下至少會(huì)有一個(gè)gradle-xx-all或gradle-xx-bin的文件夾,這個(gè)文件下的內(nèi)容其實(shí)就是AS用來(lái)構(gòu)建工程所用到的東西。
所以,當(dāng)我們clone到一份AS版本的源碼時(shí),不應(yīng)該急著打開,而是應(yīng)該先去預(yù)覽一下兩個(gè)文件:
build.gradle(這個(gè)是整個(gè)項(xiàng)目的gradle文件)####
這個(gè)文件里有一行很重要的配置代碼:
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
這個(gè)指定了我們整個(gè)項(xiàng)目要構(gòu)建所需的Android Plugin版本。
這個(gè)地方我的經(jīng)驗(yàn)是,如果你clone到的源碼里所使用到的版本比這里低,建議改成當(dāng)前最新的版本。當(dāng)然,如果你使用AS2.0及以上版本,它會(huì)自動(dòng)提示你將Plugin版本升級(jí)為最新的。
gradle-wrapper.properties####
這個(gè)文件,位于你所創(chuàng)建項(xiàng)目
XXApplication\gradle\wrapper
這個(gè)目錄下,我們可以看一下這個(gè)文件
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
最重要的就是最后一行配置,他決定了你整個(gè)項(xiàng)目構(gòu)建時(shí)所需要用到的gradle文件的版本,到這里你應(yīng)該明白了,當(dāng)我們使用AS打開clone到的源碼時(shí),他會(huì)按照這里的配置gradle-2.10-all.zip,去之前所說的
C:\Users\username\.gradle\wrapper\dists
這個(gè)目錄下尋找gradle文件,如果剛好找到了,那么很幸運(yùn),你的項(xiàng)目不會(huì)build很長(zhǎng)時(shí)間。如果沒有找到,那么就得去下載gradle-wrapper.properties里所配置的gradle版本了,這就解釋了我們第一次用AS創(chuàng)建Hello Wrold時(shí)為什么等待了那么長(zhǎng)時(shí)間,因?yàn)橐ハ螺d一個(gè)文件(而且得是翻墻)。
明白這些,這個(gè)問題就很好解決了。第一種辦法,很簡(jiǎn)單,提前從這里下載gradle-wrapper.properties里所指定的gradle版本文件,解壓后放在\dists\目錄下;這也是一種比較乖的方法,因?yàn)榇笊窨偸亲咴谖覀冎埃麄儺?dāng)時(shí)寫下這些源碼時(shí)候,所使用的gradle文件版本可能比較老,所以為了保持源碼不被更改,只能這樣做了。
第二種,比較討巧,你可以修改gradle-wrapper.properties的配置內(nèi)容,將最后一行g(shù)radle版本修改為.gradle\wrapper\dists這個(gè)目錄下包含的版本,或者是你可以打開你手頭正常運(yùn)行的項(xiàng)目文件,看看它的這個(gè)gradle-wrapper.properties是如何配置的,可做參考。
對(duì)于gradle-wrapper.properties里所用到的gradle文件和build.gradle中所依賴的gradle版本是否有嚴(yán)格的對(duì)于關(guān)系,尚不明確。
關(guān)于Instant Run的使用##
Instant Run 是AS 2.0之后提供的一種一邊修改代碼,一邊在模擬器或者實(shí)際設(shè)備上看到 修改代碼后的結(jié)果的高大上功能。
說白了,就是Activity可以不用重新啟動(dòng),而你代碼修改的內(nèi)容就可以直接呈現(xiàn)出來(lái),就是最近很火的熱更新。關(guān)于他的運(yùn)行原理,可以看看這篇文章,已經(jīng)做了很詳細(xì)的解釋。
其實(shí),對(duì)于這個(gè)功能來(lái)說真是又愛又恨。愛是因?yàn)椋@種Instant Run的確是可以節(jié)省一點(diǎn)時(shí)間,畢竟AS 編譯運(yùn)行速度還是有點(diǎn)長(zhǎng),即便你的電腦是8G內(nèi)存,i5處理器也是枉然。而恨,也恰恰是因?yàn)檫@種所謂的Instant Run,在剛開始使用AS 2.0的那段時(shí)間,常常有這樣一種體驗(yàn),代碼明明改了為什么不生效,TextView的顏色明明代碼里已經(jīng)改成了綠色,為什么一運(yùn)行還是黑色。甚至,有時(shí)候?qū)е挛覀冮_始懷疑自己代碼的邏輯性,所以在很長(zhǎng)一段時(shí)間里都不能適應(yīng)這個(gè)所謂的Instant Run,覺得完全就是添亂的。
但是,用的時(shí)間久了,當(dāng)你漸漸熟悉了他的規(guī)律,理解了他的原理,你還是會(huì)覺得這個(gè)功能挺好的。
你可以通過設(shè)置,開啟或者關(guān)閉這個(gè)功能
布局文件無(wú)法預(yù)覽Exception raised during rendering##
有時(shí)候,我們會(huì)遇到layout下xml 布局文件無(wú)法查看的情況,而出現(xiàn)的提示也是很簡(jiǎn)單,就是一句話Exception raised during rendering。
這種AS無(wú)法渲染出視圖,而且xml代碼沒有錯(cuò)誤,無(wú)論怎樣修改,就是繪制不出布局文件的視圖。
這個(gè)一般是由于選擇的Android SDK 版本不穩(wěn)定所導(dǎo)致的問題 ,切換成低版本即可。
Element layer-list must be declared問題##
這個(gè)問題的解決方法源自網(wǎng)絡(luò)
項(xiàng)目從Eclipse轉(zhuǎn)到Android Studio。項(xiàng)目中使用了環(huán)信demo中的一些xml資源,轉(zhuǎn)換后發(fā)現(xiàn)color資源文件夾下諸如layer-list或者shape等標(biāo)簽報(bào)Element xxx must be declared錯(cuò)誤,大意就是layer-list或者shape這些標(biāo)簽沒有定義。
layer-list或者shape等這些標(biāo)簽是常用的標(biāo)簽,Android Studio居然報(bào)沒有定義錯(cuò)誤,在Eclipse中卻沒有這個(gè)問題。網(wǎng)上不少人說這是Android Studio的一個(gè)bug,事實(shí)正相反,這是Android Studio的優(yōu)點(diǎn)。
對(duì)于這個(gè)問題,首先要了解layer-list、shape等這些標(biāo)簽是什么東西。每一種標(biāo)簽都有對(duì)應(yīng)的資源類,layer-list、shape等等標(biāo)簽代表的其實(shí)是個(gè)drawable資源。layer-list最終會(huì)解析為L(zhǎng)ayerDrawable,shape會(huì)解析為ShapeDrawable,其它的標(biāo)簽類似。由此可以看出layer-list或者shape等資源是drawable資源,應(yīng)該放到drawable資源文件夾下。color資源不包括drawable資源,當(dāng)然沒有定義drawable類型的標(biāo)簽。
Eclipse不像Android Studio,對(duì)資源類型的檢查沒有那么嚴(yán)格,所以沒有報(bào)錯(cuò)誤。我覺得這倒是Android Studio的優(yōu)點(diǎn),是什么資源就應(yīng)該放到什么位置,不容易讓人產(chǎn)生疑惑。
所以在Android Studio下的解決方法就是把這些資源文件移動(dòng)到drawable資源文件夾下
Duplicate file copy in apk##
出現(xiàn)這個(gè)問題,一般是由于引用了重復(fù)的jar包,而且會(huì)在報(bào)錯(cuò)日志中提示兩個(gè)重復(fù)類的路徑。這種情況在引用了外部工程(在Android Studio中就是新建了Module),或者是導(dǎo)入的第三方(如友盟)的SDK時(shí)很容易出現(xiàn),因?yàn)橥獠恳玫墓こ蹋话闶荊ithub 上大神們寫的一些庫(kù),方便我們使用。不同的外部工程中,使用了相同的jar包,這個(gè)情況時(shí)很有肯能發(fā)生的,列如support-v4的jar包,這個(gè)jar包幾乎成了應(yīng)用的標(biāo)配,這個(gè)時(shí)候我們只需刪掉其中的一個(gè)工程中的jar包即可。
Error:failed to find Build Tools revision xx.x.x##
我們從網(wǎng)絡(luò)上clone一份源碼,Sync時(shí)會(huì)提示這種問題。這個(gè)問題,其實(shí)很簡(jiǎn)單就是app的
build.gradle 所聲明的編譯項(xiàng)目的SDK 版本我們沒有通過SDK Manager 下載,這個(gè)時(shí)候,你當(dāng)然可以按照他給出的提示
Install Build Tools xx.x. and sync project 安裝所需的SDK版本,進(jìn)行下載安裝,但這樣一般都會(huì)耗時(shí),所以最簡(jiǎn)單的方法就是修改app的build.gradle 中的buildToolsVersion 的內(nèi)容,改成我們已經(jīng)安裝過的SDK版本,如果不知道怎么寫具體的版本號(hào),完全可以參考電腦里可以正常運(yùn)行項(xiàng)目的這個(gè)配置信息。
或者是如圖所示,在Project Structure 菜單中選擇可用的SDK.
2016年7月27日更新
SSL peer shut down incorrectly##
這個(gè)問題的原因也很簡(jiǎn)單,和之前提到的第一種情況是一樣的,就是下載gradle.xxx.zip文件失敗了,這個(gè)時(shí)候,如果條件允許的話,就直接翻墻下載,如果條件不允許,可以考慮之前的辦法,從這里手動(dòng)下載gradle-wrapper.properties里所指定的gradle版本文件,解壓后放在\dists\目錄下,或者是直接修改gradle-wrapper.properties的內(nèi)容。