升级到 Android Studio 3.0 + Gradle 4.1 遇到的一些坑及解决方案

Posted 歉信君 —— 信真科技·信守真品 www.xinzhenkj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了升级到 Android Studio 3.0 + Gradle 4.1 遇到的一些坑及解决方案相关的知识,希望对你有一定的参考价值。

问题一:

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

解决方案一:

https://stackoverflow.com/questions/44239235/android-gradle-3-0-0-alpha2-plugin-cannot-set-the-value-of-read-only-property

I used this code

 applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith(‘.apk‘)) {
                        //输出apk名称为:应用名.apk
                        def fileName = "xxx.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

**Use all() instead of each() 
Use outputFileName instead of output.outputFile if you change only file name (that is your case)**

Example from the guide:

// If you use each() to iterate through the variant objects,
// you need to start using all(). That‘s because each() iterates
// through only the objects that already exist during configuration time—
// but those object don‘t exist at configuration time with the new model.
// However, all() adapts to the new model by picking up object as they are
// added during execution.

android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "xxx.apk"
                }
            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

问题二:

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
  • 1

解决方案二:

http://blog.csdn.net/syif88/article/details/75009663

大致是说,Plugin 3.0.0之后有一种自动匹配消耗库的机制,便于debug variant 自动消耗一个库,然后就是必须要所有的flavor 都属于同一个维度。 
为了避免flavor 不同产生误差的问题,应该在所有的库模块都使用同一个foo尺寸。

但是我们从中已经知道解决方案了:

在主 app 的 build.gradle 里面的

defaultConfig {
 targetSdkVersion:***
 minSdkVersion :***
 versionCode:***
 versionName :***

//版本名后面加句话,意思是flavor dimension 它的维度就是该版本号,
//这样维度就是都是统一的了

 **flavorDimensions "versionCode"**

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

问题三:

Error:Execution failed for task ‘:youyoubao:javaPreCompileCommonDebug‘.
> Annotation processors must be explicitly declared now.  The following dependencies on the compile classpath are found to contain annotation processor.  Please add them to the annotationProcessor configuration.
    - butterknife-compiler-8.6.0.jar (com.jakewharton:butterknife-compiler:8.6.0)
  Alternatively, set android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true to continue with previous behavior.  Note that this option is deprecated and will be removed in the future.
  See https://developer.android.com/r/tools/annotation-processor-error-message.html for more details.
  • 1
  • 2
  • 3
  • 4
  • 5

解决方案三:

在 app 下的 build.gradle 的 defaultConfig 中加一句话:

defaultConfig {
   ...
   javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
}


转:
https://blog.csdn.net/CHITTY1993/article/details/78667069


 

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

今天升级了AS3.0以后,在项目编译的时候发现Gradle中报错了,错误如下:
Error:(60, 0) Cannot set the value of read-only property ‘outputFile‘ for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=xiaomiRelease, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
<a href="openFile:E:StudioMyApplicationCodeBookuild.gradle">Open File</a>
经过一番折腾,网上找大牛的解读,弄明白了output.outputFile变成了只读属性,不能再往里面写东西了,以下是3.0之前的配置:
applicationVariants.all { variant ->    //批量修改Apk名字
    variant.outputs.each { output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith(‘.apk‘) && ‘release‘.equals(variant.buildType.name)) {
            def fileName = outputFile.name.replace("${variant.flavorName}", "V${defaultConfig.versionName}-${variant.flavorName}")
            fileName = fileName.replace(‘.apk‘, "-${buildTime()}.apk")
            output.outputFile = new File(outputFile.parent, fileName)
        }
    }
}
下面是经过修改之后3.0里面批量修改APK名字的配置:
applicationVariants.all { variant ->    //批量修改Apk名字
    variant.outputs.all { output ->
        if (!variant.buildType.isDebuggable()) {
            //获取签名的名字 variant.signingConfig.name
            //要被替换的源字符串
            def sourceFile = "-${variant.flavorName}-${variant.buildType.name}"
            //替换的字符串
            def replaceFile = "_V${variant.versionName}_${variant.flavorName}_${variant.buildType.name}_${buildTime()}"
            outputFileName = output.outputFile.name.replace(sourceFile, replaceFile);
            //遗留问题:如何获取当前module的name,如CodeBooke这个名字怎么获取到
        }
    }
}
问题:对于如何在gradle中获取module的name,还是没有找到相关的方法,希望有知道的大神留言交流。
这是一个对AS 3.0变化总结比较全的博客:
 








以上是关于升级到 Android Studio 3.0 + Gradle 4.1 遇到的一些坑及解决方案的主要内容,如果未能解决你的问题,请参考以下文章

升级到 Android Studio 3.0 + Gradle 4.1 遇到的一些坑及解决方案

android studio升级3.0版本,问题处理

Gradle plugin 3.0 & Android Studio 3.0

ANDROID STUDIO 3.0 升级:错误:无法解析配置“:app:xxxxxxxDebugCompileClasspath”的所有文件

Android - Android Studio 3.0去掉方法参数提示

Android - Android Studio 3.0去掉方法参数提示