AndroidStudio3.0剛剛發布兩天(版本控的我~),便迫不及待的升級了,升級前也明白這次的版本跨度較大,老項目可能存在很多的問題,沒成想還是從中午折騰到了晚上十點.不過結果還不錯,成功的跑起來了項目. 列出踩過的坑,希望后面要升級的小伙伴遇到類似的問題可以做個參考;
1.升級安裝
升級方法:
1. 直接用自帶的更新工具
操作步驟: >菜單欄>Help>Check for Updates..(前提網絡要絕對的暢通,你懂的)
	
2. 手動的下載新的版本
下載地址https://developer.android.google.cn/studio/archive.html#android-studio-3-0?utm_source=androiddevtools.cn&utm_medium=website (國內可以訪問)
升級完成后,打開原有項目,在經過一段時間到indexing后
	
	如果你的項目可以運行,OK,恭喜你,接下來的內容,你可以選擇忽略,因為你的項目很nice,啥問題沒有(我不相信你啥問題都沒有~畢竟我踩了這么多的坑);
	如果項目存在配置的問題,那么便可能產生如下問題:
2.問題
1.配置了騰訊的資源文件壓縮插件導致的異常
我的項目在indexing后出現的第一個問題
	
Could not GET 'http://oss.jfrog.org/artifactory/oss-snapshot-local/com/tencent/mm/AndResGuard-gradle-plugin/1.2.1/AndResGuard-gradle-plugin-1.2.1.pom'. Received status code 409 from server: Conflict Enable Gradle 'offline mode' and sync project
看到這個異常我的第一反應就是項目中配置了騰訊的資源文件壓縮插件,果斷移除;
	移除步驟:
	1. 在項目級別的build.gradle也就是最外層的build.gradle文件中的dependencies節點中,移除
//資源文件混淆壓縮classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.1'
2. 在應用級別的build.gradle的頂部移除
apply plugin: 'AndResGuard'//資源文件混淆壓縮
3. 第二條中提到build.gradle文件中相關的資源壓縮配置需要一并的移除;
andResGuard {//mappingFile = file("./resource_mapping.txt")mappingFile = null// 當你使用v2簽名的時候,7zip壓縮是無法生效的。use7zip = trueuseSign = true// 打開這個開關,會keep住所有資源的原始路徑,只混淆資源的名字keepRoot = truewhiteList = [// for your icon"R.drawable.icon",// for fabric"R.string.com.crashlytics.*",// for umeng update"R.string.umeng*","R.string.UM*","R.string.tb_*","R.layout.umeng*","R.layout.tb_*",//=========↓↓美洽↓↓========="R.layout.mq_*","R.drawable.mq_*","R.style.mq_*","R.string.mq_*","R.color.mq_*",//=========↑↑美洽↑↑=========//=========↓↓ping++↓↓========="R.layout.*pingpp*","R.drawable.pingpp*","R.drawable.tips_bg.9.png","R.style.*pingpp*","R.string.*pingpp*","R.id.pingpp*","R.color.*pingpp*",//=========↑↑ping++↑↑========="R.drawable.umeng*","R.drawable.tb_*","R.anim.umeng*","R.color.umeng*","R.color.tb_*","R.style.*UM*","R.style.umeng*","R.id.umeng*",// umeng share for sina"R.drawable.sina*",// for google-services.json"R.string.google_app_id","R.string.gcm_defaultSenderId","R.string.default_web_client_id","R.string.ga_trackingId","R.string.firebase_database_url","R.string.google_api_key","R.string.google_crash_reporting_api_key",// umeng share for facebook"R.layout.*facebook*","R.id.*facebook*",// umeng share for messager"R.layout.*messager*","R.id.*messager*",// umeng share commond"R.id.progress_bar_parent","R.id.webView"]compressFilePattern = ["*.png","*.jpg","*.jpeg","*.gif","resources.arsc"]sevenzip {artifact = 'com.tencent.mm:SevenZip:1.2.1'//path = "/usr/local/bin/7za"}}
上述操作完后,同步代碼,該問題KO;
2.一直卡在Refreshing項目
	第一條中的問題解決后,我出現了
	
這種提示,在正常的流程中,如果不出現第一個問題,會首先出現這個提示,意思是升級現在項目的編譯插件,相信之前升級過AS版本的同學在第一次運行新版本的時候見過這個提示,直接點擊update按鈕就行了.如果不想接著踩坑那么點擊Dont't reminmd me againg for this project按鈕就可以了,它代表你還是用之前版本的插件來運行當前項目,也就不會出現后面一大串的問題;
	這里直接點擊update按鈕;
	點擊之后如果你網絡不暢通的話就會一直的
	
	之所以會這樣,是因為
	點擊該按鈕后實際上做了兩件事情
在主項目的build.gradle文件中的dependencies節點中更改了
//原先的插件版本 classpath 'com.android.tools.build:gradle:2.3.3' //更改后的插件版本 classpath 'com.android.tools.build:gradle:3.0.0'
在項目目錄中的gradle > gradle-wrapper.properties文件中的distributionUrl字段更改了
//原先的插件版本 distributionUrl=https://services.gradle.org/distributions/gradle-3.3-all.zip //更改后的插件版本 distributionUrl=https://services.gradle.org/distributions/gradle-4.1-all.zip
這兩個文件修改后AS就會去下載https://services.gradle.org/distributions/gradle-4.1-all.zip這個文件,不用點什么奇技淫巧,就等AS下載完吧(基本完不了)
	這里給出兩種解決方案:
	兩種解決方案的前提條件是先把該文件下載下來,AS下載的奇慢,那么把https://services.gradle.org/distributions/gradle-4.1-all.zip扔到迅雷中,分分鐘下載完成(迅雷功能不止于此~);
把文件放到本地的Tomcat服務器,或者IIS服務器中,或者免費的七牛云服務中,獲取這個文件的下載地址,修改 gradle-wrapper.properties文件中distributionUrl的值為你的下載地址,關閉AS,重新打開(親測可行);
	找到.gradle文件夾路徑:windows一般在 C:/Users/<當前登錄用戶名>.gradle,
	mac是在:用戶/(當前用戶目錄)/.gradle,解壓下載好的文件到該目錄中,關閉AS,重新打開(未親測);
3.修改輸出apk的文件名導致的異常
第二條問題解決后,出現了
	
Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=tiger8shopDebug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl. Open File
點擊Open File定位到應用級別的build.gradle文件中的這個位置
static def releaseTime() {return new Date().format("yyyy-MM-dd-HH-mm", TimeZone.getDefault())//包含時分秒}static def debugTime() {// return new Date().format("yyyy-MM-dd", TimeZone.getDefault())return new Date().format("yyyy", TimeZone.getDefault())}//=============================上面的代碼定義在android節點外,AS3.0版本如果需要輸出apk文件名帶上時間,上面代碼你可以參考下===================================//文件輸出名增加版本號和時間applicationVariants.all { variant ->variant.outputs.each { output ->def outputFile = output.outputFileif (outputFile != null && outputFile.name.endsWith('.apk')) {def fileNameif (outputFile.name.contains("debug")) {//debug版本,使用自己的文件名,方便記憶fileName = "$applicationId _v${defaultConfig.versionName}_${debugTime()}_code${defaultConfig.versionCode}_debug.apk"output.outputFile = new File(outputFile.parent, fileName)//Open File后定位到這個位置,這個配置,識別不出outputFile是啥了} else {fileName = "$applicationId _v${defaultConfig.versionName}_code${defaultConfig.versionCode}_${releaseTime()}_${variant.productFlavors[0].name}_release.apk"output.outputFile = new File(outputFile.parent, fileName)}}}}
這個是自己之前配置的可以控制AS輸出的apk文件的名稱,新版本不能這樣配置了,看官方的引導可以改成
//AS3.0版本android.applicationVariants.all { variant ->variant.outputs.all {if (variant.name.endsWith("Debug")) {//debug包outputFileName = "$applicationId _v${defaultConfig.versionName}_${debugTime()}_code${defaultConfig.versionCode}_debug.apk"} else {//release包outputFileName = "$applicationId _v${defaultConfig.versionName}_code${defaultConfig.versionCode}_${releaseTime()}_release.apk"}}}
效果和之前差不多,直接更改,問題KO
4.之前項目中配置了第三方APT插件導致的異常
	
如上圖這個異常是我折騰最長時間的問題,各種百度,Google最終得知和新版本AS3.0中自帶了APT處理插件有關,因為自己之前配置的第三方的APT插件,所有它們沖突了~,那么移除則異常KO;
	移除步驟
	1. 在項目級別的build.gradle也就是最外層的build.gradle文件中的dependencies節點中,移除
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
2. 在應用級別的build.gradle的頂部移除
apply plugin: 'android-apt'
3. 在應用級別的build.gradle的dependencies節點中,替換所有用apt開頭的引依賴為annotationProcessor例如
//替換之前apt "com.jakewharton:butterknife-compiler:$rootProject.ext.globalButterKnifeAptVersion"//替換之后annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.ext.globalButterKnifeAptVersion"
上面三步操作完成后,同步項目,問題解決
5.BuildTool最低版本異常
	
這個異常出現就顯而易見了,AS3.0最低支持的BuildTools插件是26.0.2版本,別問我BuildTools是啥,我也不知道(顧名思義,AS的編譯工具);BuildTools的版本改到26.0.2版本,同步代碼就好了,如果你的SDK中沒有下載BuildTools26.0.2版本,AS會自動的提示你去下載,下載完同步代碼,即可;
6.BuildTool庫項目版本不統一問題
	
	AS3.0對于庫項目的build.gradle的配置也進行了干預,官方說可以加快編譯速度,想想也是,庫項目都用不同版本的BuildTool,編譯起來肯定慢;所以這里點擊Open File之后,定位到的build.gradle文件,修改里面的buildToolsVersion節點為26.0.2即可
如果項目中的庫項目較多,建議將buildToolsVersion版本配置到gradle.properties文件中,然后項目中的庫項目都引用該配置,改一處,則整個項目的buildToolsVersion配置都改了,別問我咋配置的,因為這會跑題,自行百度
7.multidex版本異常
	
這個問題說的是AS3.0解析multidex1.0.2版本失敗,為什么失敗?
	因為現在google自家的依賴,全部都收回到了自家的CDN服務器了,之前在項目級的build.gradle文件中的repositories節點中配置jenter(),就可以獲取大部分的依賴(雖然慢了點),但是現在Google官方需要我們在repositories節點中配置上google(),作用就是獲取自家的依賴,而原先的jcenter()不需要動;而multidex是Google的依賴所以只用之前的jcenter(),肯定是解析不到它了.
	配置例如
repositories {  google()//新增的  jcenter()}
項目級的build.gradle文件中的有兩個repositories節點,都配置上google()
同步項目,問題KO
8.Lambda插件沖突
	
Warning:One of the plugins you are using supports Java 8 language features. To try the support built into the Android plugin, remove the following from your build.gradle:apply plugin: 'me.tatarka.retrolambda'To learn more, go to https://d.android.com/r/tools/java-8-support-message.html
這個不用多說相信大家在準備升級AS3.0都知道,它的一大特性是支持了JAVA8,而項目之前為了能用Lambda,而用了第三方的插件,這里移除即可;
	移除步驟
	1. 在項目級別的build.gradle也就是最外層的build.gradle文件中的dependencies節點中,移除
classpath 'me.tatarka:gradle-retrolambda:3.2.0'//lambda表達式
2. 在應用級別的build.gradle的頂部移除
apply plugin: 'me.tatarka.retrolambda'//lambda表達式
上面兩步操作完成后,同步項目,問題解決
9.flavor配置異常
	
Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html
	這個可以參考官方給出的文檔地址(網絡要絕對的通暢~)
	問題出現在之前的flavor配置不能用了,別問我flavor是啥,你自己配置的你不知道~(主要作用,多渠道打包
//之前的配置productFlavors {_360 {}baidu {}xiaomi {}meizu {}tencent {}}productFlavors.all { flavor ->flavor.manifestPlaceholders = [CLICK_CHANNEL_VALUE: name]}// ==============================分割線=================================== //改成如下配置,問題解決flavorDimensions "tier"//新增的,值是數組productFlavors {_360 { dimension "tier"}baidu { dimension "tier"}xiaomi { dimension "tier"}meizu { dimension "tier"}tencent { dimension "tier"}}productFlavors.all { flavor ->flavor.manifestPlaceholders = [CLICK_CHANNEL_VALUE: name]}
想知道為什么這樣配置,可以看看官方文檔
至此上述配置更改后,我的項目同步代碼不報錯了~,但是坑遠遠沒有填完,繼續
10.AAPT2編譯異常
	
這一大串的異常在編譯的時候報出,我在第一次導入項目的時候遇到了,第二次導入其它項目的時候,竟然沒有遇到,對比之下得出問題是出在配置了高版本的support包的問題,當你把項目所有support包的版本配置到25.2.0的時候什么問題都沒有,但是配置成26.0.0或者27.0.0版本的時候就會出現這個問題(親測);
解決方案
1. 使用低版本的support包,把項目所有support包的版本配置到25.2.0或者其它較低的版本
2. 配置gradle.properties中關閉AAPT2編譯,說人話就是在其中增加android.enableAapt2=false配置,再次編譯問題解決(推薦),例如
android.enableAapt2=false
同步代碼,問題KO;
11.方法找不到異常/或者有點莫名其妙的異常
	
	
這兩個異常產生的的原因是因為第九條如果你升級了support包的版本的時候compileSdkVersion的版本沒有更改,親測如果你的support包更改到了26.0.0或以上的話,需要更改項目中所有的compileSdkVersion為26或以上
compileSdkVersion = 26
更改好,同步代碼,問題解決
到這我的項目可以運行,可以調試了,以為終于KO了所有問題了,但是但是編譯輸入release包的時候內存溢出了,WTF
12.生成release包異常
	
看到這個異常我是一臉的蒙蔽,各種百度,google都沒有說這個問題,咋滴,不讓用啦,手動打包啊~,但是到夜里的時候忽然靈光一現,WTF,會不會是又是啥第三方依賴的問題,畢竟很多問題都是因為第三方的依賴,于是乎,連忙的注釋了,一大堆的項目級別的build.gradle文件中的一些依賴,經過測試,定位到了美團的熱更新,然后移除了,相關的配置,然后一些正常~~
	移除步驟
	1. 在項目級別的build.gradle也就是最外層的build.gradle文件中的dependencies節點中,移除
2. 在應用級別的build.gradle的頂部移除
apply plugin: 'robust'//美團熱更新框架
3. 在應用級別的build.gradle的dependencies節點中的
//美團熱更新框架 compile "com.meituan.robust:robust:${ROBUST_VERSION}"
依賴可以不移除(不移除也是可以正常生成apk文件的,只是熱更新無法使用),這個依賴如果移除了,那么你代碼中相關的熱更新代碼也需要移除,否則就是找不到相關的類了;
	** 最后的最后,AS3.0算是徹底的用上了,編譯速度相比之前有沒有增快,新特性好不好用,有待后續的使用了.
	希望大家在升級AS3.0的時候如果遇到和我相同的問題,可以做一個參考 **
下面我們在來看一篇經常遇到的坑的經典問題:
最近 Android Studio 3.0 版本正式推出,趁著項目剛發完版本,趕緊更新試試水,結果發現項目完全跑不起來,折騰了幾個小時才搞好。記錄一下填坑過程,希望能幫助其他同學。
1. gradle 和 buildToolsVersion 版本
Android Studio 3.0 要求 gradle 版本為 4.1 ,對應的 buildToolsVersion 為 26.0.2 ,然后記得在項目最外層的 build.gradle 添加 google() ,如果不添加將會導致某些官方依賴下載不了。
buildscript {repositories {...google()}}2. module 依賴方式變更
	原先依賴 module 使用的是 compile ,現在需要替換為 api 或 implementation。
	api : module 編譯時可用,module 的使用者編譯和運行時可用,這個和過時的 compile 一樣的。
	implementation : module 編譯時可用,module 的使用者運行時可用,對于大量使用 library 的項目,可以顯著提高編譯時間,因為它可以減少構建系統重新編譯一些 module 。
	那么什么時候用 api ,什么時候用 implementation 呢?由于公司項目采用的是組件化開發,有個 common module 需要被各個組件依賴,一開始采用的是 implementation ,結果發現會導致別的組件無法引用 common 中的庫( common -> A module ,A module 無法引用 common 依賴的庫 )。
	試驗過后得出結論,當這個 module 會被多次引用應該使用 api,不會被別的 module 引用使用 implementation 。
	發一下我現在使用的方式
dependencies {api fileTree(include: ['*.jar'], dir: 'libs')api 'com.squareup.okhttp3:okhttp:3.4.2'...debugApi 'com.squareup.leakcanary:leakcanary-android:1.5.1'releaseApi 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'}compileOnly 替換了 provided,runtimeOnly 替換了 apk。
3. apt 插件更換
apt 插件已被廢棄,需更換為 annotationProcessor 。
//apply plugin: 'android-apt'dependencies {...annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'}4.第三方庫不兼容問題
	· retrolambda
	Android Studio 3.0 已經支持 Java 8 了,不需要第三方庫來支持,因此需要去掉 retrolambda 庫。
	項目最外層的 build.gradle
buildscript {...dependencies {...//classpath 'me.tatarka:gradle-retrolambda:3.2.5'}}module 中的 build.gradle
2. 在應用級別的build.gradle的頂部移除
apply plugin: 'robust'//美團熱更新框架
3. 在應用級別的build.gradle的dependencies節點中的
//美團熱更新框架compile "com.meituan.robust:robust:${ROBUST_VERSION}"依賴可以不移除(不移除也是可以正常生成apk文件的,只是熱更新無法使用),這個依賴如果移除了,那么你代碼中相關的熱更新代碼也需要移除,否則就是找不到相關的類了;
新聞熱點
疑難解答