Gradle版本從2.3升到3.3.2問題集錦

一、Gradle版本升級步驟

1、在gradle-wrapper.properties文件中修改distributionUrl的版本,

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip

2、在工程裏的build.gradle文件中的dependencies項裏修改gradle版本,之後點 Try Again,

buildscript {
    repositories {
        jcenter()
        mavenCentral()
        maven { url 'https://maven.fabric.io/repo' }
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
        ...
    }
}

二、錯誤集錦

1、Cannot set the value of read-only property ‘outputFile’ for ApkVariantOutputImpl_Decorated

錯誤原因:outputFile變成了可讀字段
修改方案:
1、將variant.outputs.each中的each改成all
2、output.outputFile = new File(outputFile.parent, fileName)改爲 outputFileName =fileName

原代碼:

applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                def fileName = ""
                if (checkQuDao()) {
                    fileName = "release_${defaultConfig.versionName}${variant.productFlavors[0].name}.apk"
                } else {
                    fileName = "debug.apk"
                }
                output.outputFile = new File(outputFile.parent, fileName)
            }
        }
    }

修改後的代碼:

    applicationVariants.all { variant ->
        variant.outputs.**all** { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {

                def fileName = ""
                if (checkQuDao()) {
                    fileName = "release_${defaultConfig.versionName}${variant.productFlavors[0].name}.apk"
                } else {
                    fileName = "debug.apk"
                }
                outputFileName  =fileName
            }
        }
    }

2、修改了錯誤1後再編譯報如下錯誤:All flavors must now belong to a named flavor dimension

錯誤原因:gradle版本3.0之後添加了flavorDimensions管理
修改方案:在defaultConfig裏面加入flavorDimensions,並在多渠道打包裏的每一項里加上dimension。
修改後代碼:

 defaultConfig {
        applicationId globalConfiguration.applicationId
        minSdkVersion globalConfiguration.AndridMinSdkVersion
        targetSdkVersion globalConfiguration.AndroidTargetSdkVersion
		...
        flavorDimensions "product"
    }
 productFlavors {

        xiaomi{
            dimension "product"
            ...
        }

        huawei{
            dimension "product"
            ...
        }

        oppo{
            dimension "product"
            ...
        }

    }

參考文章https://blog.csdn.net/chen_xi_hao/article/details/80526049

3、ERROR: The SourceSet ‘instrumentTest’ is not recognized by the Android Gradle Plugin. Perhaps you misspelled something?

錯誤原因:gradle版本3.0之後已廢棄instrumentTest
解決方案:將instrumentTest替換爲androidTest
原代碼:

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
        instrumentTest.setRoot('tests')

修改後代碼:

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
        androidTest.setRoot('tests')

4、ERROR: The Android Gradle plugin supports only Kotlin Gradle plugin version 1.3.0 and higher.

錯誤原因:gradle只支持1.3.0及以上的Kotlin Gradle plugin版本
修改方案:修改kotlin版本,修改工程下的build.gradle文件中的dependencies項裏的kotlin版本

5、 compile錯誤

報了三個錯誤:
1、WARNING: Configuration ‘compile’ is obsolete and has been replaced with ‘implementation’ and ‘api’.
2、WARNING: Configuration ‘testCompile’ is obsolete and has been replaced with ‘testImplementation’.
3、WARNING: Configuration ‘androidTestCompile’ is obsolete and has been replaced with ‘androidTestImplementation’.
錯誤原因:compile已過時
解決方案:使用implementation和api兩個字段替換compile
implementation和api區別:
api 指令
完全等同於compile指令,沒區別,你將所有的compile改成api,完全沒有錯。
implement指令
這個指令的特點就是,對於使用了該命令編譯的依賴,對該項目有依賴的項目將無法訪問到使用該命令編譯的依賴中的任何程序,也就是將該依賴隱藏在內部,而不對外部公開,這樣避免了不同module引用了不同版本的支持包報錯的問題。
參考文章https://www.jianshu.com/p/f34c179bc9d0

6、WARNING: API’variantOutput.getPackageApplication()‘isobsolete and has been replaced with’variant.getPackageApplicationProvider()’.

原代碼:


    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {

                def fileName = ""
                if (checkQuDao()) {
                    fileName = "release_${defaultConfig.versionName}${variant.productFlavors[0].name}.apk"
                } else {
                    fileName = "debug.apk"
                }
                outputFileName = fileName
            }
        }
    }

修改後的代碼:


    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            
                if (checkQuDao()) {
                    outputFileName = "release_${variant.versionName}${variant.productFlavors[0].name}.apk"
                } else {
                    outputFileName = "debug.apk"
                }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章