原文:https://www.jianshu.com/p/9b25087a5d7dphp
總看別人的文章,今天嘗試着本身來寫一篇。在逛論壇時候,無心間發現Android Studio 3.0正式版本推送更新了,早據說AS 3.0添加了許多新功能,而後手賤火燒眉毛地想先睹爲快,結果正中下懷。下載和更新Gradle,半天無響應,只好結束進程強制關閉AS,手動離線下載安裝。本覺得不會有太大問題,誰知過高估了,進來各類的報錯,各類的配置問題,填坑之路就此開始。html
Ver:v1.3.171031java
Ver:v2.2.171111android
Ver:v3.2.171231json
Ver:v4.3.180416windows
下面就來看看升級到 Android Studio 3.x(Stable 3.0 ~ 3.1.3)以後,遇到的一些問題:api
修改項目下 gradle/wrapper/gradle-wrapper.propertie 文件中的distributionUrl
AS 3.0 ~ 3.0.1改成:distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
AS 3.1.1 ~3.1.3 改成:distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
ruby
1)項目根目錄下的 build.gradle文件中兩個repositories
節點都添加google()
bash
buildscript{
repositories {
google() //新增 } dependencies { classpath'com.android.tools.build:gradle:3.0'//與AS版本一致 //classpath'com.android.tools.build:gradle:3.1.1' } } allprojects { repositories{ google() //新增 } }
2)項目app下 build.gradle文件中,修改相關支持庫版本app
AS 3.0 ~ 3.0.1:
android {
compileSdkVersion 26 buildToolsVersion "26.0.2" ... } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support:design:26.1.0' testImplementation 'junit:junit:4.12' ... }
AS 3.1.1 ~ 3.1.3:
android {
compileSdkVersion 27 buildToolsVersion "27.0.3" ... } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:design:27.1.1' testImplementation 'junit:junit:4.12' ... }
Error:A problem occurred configuring project ':app'.> All flavors must now belong to a named flavor dimension.
flavorDimensions
屬性,用來控制多個版本的代碼和資源,缺失就會報錯。在項目app下build.gradle文件中,添加flavorDimensions
:android {
...
flavorDimensions "tier","minApi" productFlavors{ fees{ dimension"tier" ... } minApi23{ dimension"minApi" ... } } }
若是不須要多版本控制只需添加:flavorDimensions "code"
(隨意定義)
android {
...
defaultConfig {
...
flavorDimensions "code" } ... }
applicationVariants.all { variant ->
variant.outputs.each { output ->
def fileName = "${variant.versionName}_release.apk" def outFile = output.outputFile if (outFile != null && outFile.name.endsWith('.apk')) { output.outputFile =newFile(outFile.parent, fileName) } }
AS 3.0以後,一樣代碼自定義apk名稱卻會報錯:
Error:(56, 0) Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
outputFile
變爲只讀,不能修改輸出的名稱因此報錯。修改成:applicationVariants.all { variant ->
variant.outputs.all { output -> // each 改成 all def fileName = "${variant.versionName}_release.apk" def outFile = output.outputFile if (outFile != null && outFile.name.endsWith('.apk')) { outputFileName = fileName // output.outputFile 改成 outputFileName } }
把each
修改成all
,而後經過outputFileName
修改生成apk的名稱。此外,AS 3.0後打包完,除了apk包文件,還會多一個 output.json 參數文件。
compile
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:26.1.0' compile files('libs/gson-2.3.1.jar') compile project(':mylibrary') ... }
AS 3.0以後依賴關鍵字:implementation
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:26.1.0' implementation files('libs/gson-2.3.1.jar') implementation project(':mylibrary') ... }
AS 3.0後Gradle關鍵字依賴發生變化:compile(implementation/api)
,provided(compileOnly)
,apk(runtimeOnly)
AS 3.0後,在使用新依賴配置項時,引用本地庫使用
implementation
指令時,若出現找不到導包或資源問題報錯,能夠更換依賴指令爲api
從新編譯。關於implementation
和api
的區別,請移駕:AS Gradle依賴項配置
Error: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
在項目根目錄下gradle.properties文件中關閉APPT2編譯:
...
android.enableAapt2 = false
AAPT err(Facade for):……Unable to open PNG file
android{
...
aaptOptions{
cruncherEnabled = false useNewCruncher = false } ... }
用來關閉AS圖片PNG合法性檢查的,直接不讓它檢查。
1 ) .9.png圖片放在
res/drawable
文件夾下
2 ) .9.png圖片四邊都要有黑線,確保圖片是標準的.9.png
圖片
1 ) 若是你還在2.3.x的環境下開發,爲了不輸入法問題,建議你暫時不要升級到3.x;
2 ) 若是你想2.3.x升級使用3.x,那麼不建議你使用2.x的jre替換3.x的jre方式去處理輸入法問題,雖然暫時能夠解決輸入問題,可是後面升級的時候你還得把2.x 的jre換回3.x的jre,不然升級後將沒法正常使用AS;
3 ) 最簡單最有效的解決辦法就是在使用 AS的時候,切換到 windows自帶的中文輸入法就能夠正常輸入中文篩選詞語了,相對而言,這樣方便不少。雖然沒有第三方輸入法用起來那麼順手,可是能夠有效解決輸入法問題和避免之後升級的問題;
4 ) 終極方案:升級到 AS 3.1.1便可解決,AS 3.1.1已經修復了輸入法中文狀態下沒法選詞的BUG。
Error: Removing unused resources requires unused code shrinking to be turned on.
android {
...
buildTypes {
debug {
signingConfig signingConfigs.release
debuggable true zipAlignEnabled true minifyEnabled true //是否混淆 shrinkResources true //是否去除無效的資源文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { signingConfig signingConfigs.release zipAlignEnabled true debuggable true minifyEnabled true //是否混淆 shrinkResources true //是否去除無效的資源文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } ... }
AS 3.0.1後,若是使用shrinkResources
來移除未引用資源,必需要先開啓混淆minifyEnabled
,才能經過資源壓縮器將它們移除,不然編譯會報錯。
Error
AS在線升級後,安裝重啓軟件時會出現部分文件安裝衝突。以下圖所示:
Solution
方法一:
1)找到 AS 安裝目錄下的 uninstall.exe 卸載文件,運行卸載當前舊版本AS(卸載前記得備份代碼和配置文件);
2)下載最新版本的AS安裝包,運行安裝並導入配置文件和項目。
方法二:
1)點擊 Cancel 取消安裝並關閉AS;
2)找到 AS 安裝目錄下的 studio64.exe 啓動文件,右鍵 —— 以管理員身份運行 打開AS(提升AS的權限);
3)點擊 Help —— Checkout for Updates —— Update and Restart 從新更新下載安裝。
Google官方文檔
https://developer.android.google.cn/studio/build/gradle-plugin-3-0-0-migration
https://developer.android.com/studio/releases/
Android Studio下載
https://developer.android.google.cn/studio/archive.html
Android Gradle下載
http://services.gradle.org/distributions
上述就是AS 2.x升級AS 3.x所遇到的問題,可能每一個人狀況不同,遇到的問題也不盡相同。但願有相似經歷和問題的小夥伴,能夠幫助大家少走一些彎路。
初次寫,若有不對和欠穩當地方,請你們幫忙指正,有疑問和補充的小夥伴請留言告知,萬分感謝!文章會持續更新。