使用AndroidStudio的過程中,對build.gradle文件配置以及導(dǎo)入支持包的問題的一些總結(jié)讳癌,在此記錄下來渠脉。有時候,頭疼的不是面對新功能無從下手,而是為了可以正常敲代碼與編譯環(huán)境作斗爭。
關(guān)于build.gradle配置
-
compileSdkVersion
SDK的版本號旦袋,也就是API Level,例如API-19铃肯、API-20、API-21等等传蹈,一般保持最新即可押逼。
-
buildeToolVersion
構(gòu)建工具的版本,其中包括了打包工具aapt惦界、dx等等挑格,這個一般與CompileSdkVersion對應(yīng)。
這個工具的目錄位于..your_sdk_path/build-tools/XX.XX.XX沾歪,這個版本號一般是API-LEVEL.0.0漂彤。
-
可以用高版本的build-tool去構(gòu)建一個低版本的sdk工程
例如build-tool的版本為20,去構(gòu)建一個sdk版本為18的
compileSdkVersion 18灾搏、buildToolsVersion "22.0.1"
這樣也是OK的显歧。 targetSdkVersion與minSdkVersion與清單文件中配置一樣,含義一樣确镊。
-
android:minSdkVersion
表示APP所兼容的最低API版本,這個一般是項目初期就定好的范删,輕易不會改動蕾域。
指明應(yīng)用程序運行所需的最小APIlevel。如果不指明的話到旦,默認是1旨巷。也就是說該應(yīng)用兼容所有的android版本。我們應(yīng)該總是聲明這個屬性添忘。如果系統(tǒng)的APIlevel低于android:minSdkVersion設(shè)定的值采呐,那么android系統(tǒng)會阻止用戶安裝這個應(yīng)用。
報錯信息為:INSTALL_FAILED_OLDER_SDK
如果指明了這個屬性搁骑,并且在項目中使用了高于這個API level的API斧吐, 那么會在編譯時報錯又固。 -
android:targetSdkVersion
表示應(yīng)用程序目標(biāo)API Level的一個整數(shù),一般設(shè)置成最高的API版本煤率。如果不設(shè)置仰冠,默認值和minSdkVersion相同。
這個屬性通知系統(tǒng)蝶糯,你已經(jīng)針對這個指定的目標(biāo)版本測試過你的程序洋只,系統(tǒng)不必再使用兼容模式來讓你的應(yīng)用程序向前兼容這個目標(biāo)版本。應(yīng)用程序仍然能在低于targetSdkVersion的系統(tǒng)上運行昼捍。
為了讓應(yīng)用程序支持每個Android版本识虚,應(yīng)當(dāng)提高targetSdkVersion的值到最新的APIlevel,然后在對應(yīng)的平臺上徹底的測試你的應(yīng)用妒茬。可知担锤,targetSdkVersion這個屬性是在程序運行時期起作用的,系統(tǒng)根據(jù)這個屬性決定要不要以兼容模式運行這個程序郊闯。一般情況下妻献,應(yīng)該將這個屬性的值設(shè)置為最新的API level 值,這樣的話可以利用新版本系統(tǒng)上的新特性团赁。
關(guān)于v4育拨、v7的導(dǎo)入
假如項目是APPModule,需要依賴另外兩個Module欢摄,A和B熬丧。但是ModuleA和ModuleB都需要導(dǎo)入V4包,各自在相應(yīng)的gradle文件中compile v4即可怀挠,不過最好版本保持一致析蝴,這樣是沒問題的。假如此時APP Module需要v4包绿淋,就不必引入v4了闷畸,因為在依賴ModuleA和ModuleB的時候,已經(jīng)也依賴了v4包吞滞。假如此時APP Module需要v7包佑菩,只需要在APP Module的gradle里面compile v7包就可以了,這樣并不會沖突裁赠。
v7里面包含了v4的所有內(nèi)容殿漠,所以如果導(dǎo)入了v7,就不用再導(dǎo)入v4佩捞。
如果原來項目中引入的v7版本是19绞幌,后來想升級到23,直接改相應(yīng)的數(shù)字就可以一忱,但是這個版本要存在莲蜘。同時谭确,要修改相應(yīng)的compileSdkVersion、buildeToolVersion菇夸、targetSdkVersion版本號琼富,保持一致,不然會出現(xiàn)
Process 'command 'd:\Program\Android\sdk\build-tools\23.0.3\aapt.exe'' finished with non-zero exit value 1
這種錯誤庄新。
錯誤類型
-
aapt.exe'' finished with non-zero exit value 1
這種錯誤一般是由compileSdkVersion鞠眉、buildeToolVersion、targetSdkVersion這種版本號與v4或v7的版本號不一致導(dǎo)致的择诈,修復(fù)的方法就是修改這些數(shù)字械蹋,使版本號一致。當(dāng)項目中存在多個Module的時候羞芍,最好將compileSdkVersion哗戈、buildeToolVersion、targetSdkVersion等配置成一樣的荷科,防止出現(xiàn)莫名其妙的問題唯咬。
-
Multiple dex files define XXXXandroid/support/v4/aXXXX
這種錯誤,一定是v4或v7包重復(fù)引用導(dǎo)致的畏浆,除了要看build.gradle文件的compile的支持包以外胆胰,還要看libs文件夾下是不是也有了這些支持包。相應(yīng)的刻获,如果報錯信息Multiple dex files define是這種開頭的蜀涨,一定是導(dǎo)包重復(fù)造成的,有可能重復(fù)導(dǎo)入了其他的第三方蝎毡,具體是哪個重復(fù)厚柳,從報錯信息里應(yīng)該能看出來。
-
Error: No resource found that matches the given name: attr XXXXXX
這種錯誤一定是compileSdkVersion沐兵、buildeToolVersion别垮、targetSdkVersion這種版本號與v4或v7的版本號不一致導(dǎo)致的,修復(fù)的方法就是修改這些數(shù)字扎谎,使版本號一致宰闰。比如原來是引用的v4的19.0.0版本,后來改成23.1.1簿透,但是targetSdkVersion卻還是原來的19,這樣編譯的時候解藻,編譯的時候使用的是v4的23.1.1版本老充,但是找資源的時候,還是找的v4的19.0.0版本的螟左,就會找不到啡浊。
-
Attribute has already been defined XXXXXXXXXXXX
這種錯誤一是重復(fù)導(dǎo)包導(dǎo)致觅够,二是自定義的屬性與系統(tǒng)中(一般是支持包中)的屬性名字重復(fù)。如果確定沒有重復(fù)導(dǎo)包巷嚣,就復(fù)制那個重復(fù)的屬性名字喘先,Android Studio中按Ctrl + H組合鍵,全局搜索廷粒,肯定可以找到自己定義的那個屬性窘拯。不要覺得自己根本沒有定義過這個屬性,因為有可能項目的其他成員定義過坝茎,或者自己忘了涤姊,都有可能發(fā)生,利用工具嗤放,相信工具思喊。一般是在attr.xml這個文件中。
-
com.android.dex.DexIndexOverflowException: Cannot merge new index XXXXXX into a non-jumbo instruction!(這個XXX數(shù)字一定大于65536)
以及com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536”錯誤原因:
這個錯誤可能在導(dǎo)入第三方的時候會出現(xiàn)次酌。
原因是同時在工程中引入了多個第三方j(luò)ar包恨课,導(dǎo)致調(diào)用的方法數(shù)超過了android設(shè)定的65536個(DEX 64K problem),進而導(dǎo)致dex無法生成岳服,也就無法生成APK文件剂公。
限制原因:早期的Dalvik VM內(nèi)部使用short類型變量來標(biāo)識方法的id,就有了 最大方法數(shù)的限制65536派阱。
解決辦法有兩種:第一種是忽略方法數(shù)限制的檢查
這樣做的缺點是apk無法再低版本的設(shè)備上面安裝诬留,會出現(xiàn)錯誤:
INSTALL_FAILED_DEXOPT
在App Module的build.gradle文件的android節(jié)點下添加如下代碼:dexOptions { jumboMode = true }
第二種是分包
通過在defaultConfig中設(shè)置multiDexEnabled可以開啟分包模式,分包之后的Dex就低于了限制數(shù)贫母,保證了正常的打包文兑。
defaultConfig {
multiDexEnabled=true
}
//這時還要
compile 'com.google.android:multidex:0.1' 0.1是版本號,用最新的就行腺劣。
-
程序包org.apache.http 绿贞、org.apache.http.client.utils等不存在
解決:在build.gradle(Module:app) 文件的android的那個括號里加上
useLibrary 'org.apache.http.legacy'
參考
總結(jié)
在項目中,對于第三方的SDK或者jar等橘原,可以在build.gradle中compile的就compile籍铁,不要導(dǎo)入Module,再compile project趾断,容易出問題拒名。
導(dǎo)入第三方的時候,一定要仔細參考官方文檔集成說明或者官方demo芋酌。
遇到這些問題的時候增显,誰都會頭大,就這些問題脐帝,折騰了我一個多星期同云,慢慢熬糖权,去google上多看看別人的相同或相似問題,看看大神們的解答炸站,最好明白其中的道理星澳,記錄下來,看多了有時候說不定就突然把問題解決了旱易。