Android Studio 項目 Gradle 升級經驗總結

想必各位小夥伴早就都有收到各大應用市場下發的關於《軟件高 API 公告》吧!
應用寶公告

升級我們項目的 API 版本等級已經是必須提上日程了,同時 AS 版本等級、Gradle 版本也是我們升級繞不開的一環,總不能 API 等級提高了,項目還基於低版本的 Gradle 吧。下文我們將簡單講講,在升級 Gradle 版本時需要注意的一些問題,以及出現相關問題時的解決方法,願各位小夥伴都愉快的升級。

環境爲: MacOS + AS 3.1.3 + Gradle 4.4 + Gradle Plugin 3.1.3

1、修改 Gradle 版本

首先我們修改項目根目錄下的 build.gradle 文件中 Gradle Plugin 的版本爲 3.1.3:

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'
        ...
    }
}

修改根目錄 gradle\wrapper 文件夾下 gradle-wrapper.properties 文件中

distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zipg

一般會出現如下提示:
無法找到 gradle 插件

Could not find com.android.tools.build:gradle:3.1.3.
Searched in the following locations:
    https://jcenter.bintray.com/com/android/tools/build/gradle/3.1.3/gradle-3.1.3.pom
    https://jcenter.bintray.com/com/android/tools/build/gradle/3.1.3/gradle-3.1.3.jar
Required by:
    project :
Add Google Maven repository and sync project
Open File
Enable embedded Maven repository and sync project

按照提示操作,添加 Google 倉庫依賴即可。

2、修改因 Gradle 版本升級導致的異常

1. 修改輸出apk文件名:

Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=uerblybUerb, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
Open File

該問題是因爲我們在模塊級的 build.gradle 文件中設置了對打包輸出文件的文件名進行修改,我們只要將原來的代碼改寫成如下形式即可:

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android {
            // 自定義文件名輸出配置
             applicationVariants.all { variant ->
                 variant.outputs.all { output ->
                     //要被替換的源字符串
                     def sourceFile = "app-${variant.flavorName}-${variant.buildType.name}"
                     //替換的字符串
                     def replaceFile = "XXX_V${variant.versionName}_c${variant.versionCode}_${variant.flavorName}_${variant.buildType.name}_${releaseTime()}"
                     outputFileName = output.outputFile.name.replace(sourceFile, replaceFile)
                 }
             }
}

2. 因 apt 插件帶來的問題:

Cannot choose between the following configurations of project :mainnavigatetabbar:
  - debugApiElements
  - debugRuntimeElements
  - releaseApiElements
  - releaseRuntimeElements
All of them match the consumer attributes:
  - Configuration 'debugApiElements':
      - Found com.android.build.api.attributes.BuildTypeAttr 'debug' but wasn't required.
      - Found com.android.build.api.attributes.VariantAttr 'debug' but wasn't required.
      - Found com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' but wasn't required.
      - Found org.gradle.usage 'java-api' but wasn't required.
  - Configuration 'debugRuntimeElements':
      - Found com.android.build.api.attributes.BuildTypeAttr 'debug' but wasn't required.
      - Found com.android.build.api.attributes.VariantAttr 'debug' but wasn't required.
      - Found com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' but wasn't required.
      - Found org.gradle.usage 'java-runtime' but wasn't required.
  - Configuration 'releaseApiElements':
      - Found com.android.build.api.attributes.BuildTypeAttr 'release' but wasn't required.
      - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
      - Found com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' but wasn't required.
      - Found org.gradle.usage 'java-api' but wasn't required.
  - Configuration 'releaseRuntimeElements':
      - Found com.android.build.api.attributes.BuildTypeAttr 'release' but wasn't required.
      - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
      - Found com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' but wasn't required.
      - Found org.gradle.usage 'java-runtime' but wasn't required.

解決辦法:
project 的 build.gradle 文件中刪除
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

module 的 build.gradle 文件中刪除
apply plugin: 'com.neenbedankt.android-apt'

module 的build.gradle 文件中替換

implementation'com.jakewharton:butterknife:9.0.0-rc1'
annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'  

3. Android SDK Build Tools版本過低:

The specified Android SDK Build Tools version (23.0.3) is ignored, as it is below the minimum supported version (27.0.3) for Android Gradle Plugin 3.1.3.
Android SDK Build Tools 27.0.3 will be used.
To suppress this warning, remove "buildToolsVersion '23.0.3'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools.
Update Build Tools version and sync project
Open File

解決: 修改模塊下 build.gradle 文件中的 compileSdkVersion 28 、修改buildToolsVersion '28.0.3' 、修改 targetSdkVersion 28
如果項目中,以模塊形式依賴了其他的項目,也需要一併修改。

4. 項目中存在 Flavor:

All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

解決方法:

android {
    ...
    defaultConfig {
        ...
        flavorDimensions "versionCode"
    }
}

4. 修改各個模塊的 BuildType
注意:如果你的項目包含了數個 Flavor,並且自定義了數個 buildType,同時又以模塊的形式依賴了別的項目,那麼你需要將每個模塊的 buildTypes 修改成同 app 模塊一致。
否則會出現如下錯誤:

Unable to resolve dependency for ':app@xxxxXXXX(flavor + buildtype)/compileClasspath': Could not resolve project :xxxxxx(依賴的模塊).
Open File
Show Details

5. AAPT2 檢查錯誤:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:mergeUerblUerbResources'.
> Error: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details

解決方法:在項目根目錄下的 gradle.properties 文件中增加:
android.enableAapt2=false 禁用 AAPT2。

** 其他錯誤: **
其他的錯誤多出現在重複依賴,這裏就不多贅述了,還有升級 API 等級也不多贅述了,這些都有大量文章可供參考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章