五陵年少金市东,银鞍白马渡春风。这篇文章主要讲述升级到 Android Studio 3.0 + Gradle 4.1 遇到的一些坑及解决方案相关的知识,希望能为你提供帮助。
问题一:
Cannot set the value of read-only property ‘outputFile‘ for ApkVariantOutputImpl_Decorated{apkData=https://www.songbingjia.com/android/Main{type=MAIN, fullName=commonDebug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl. Open File
- 1
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 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
大致是说,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
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=https://www.songbingjia.com/android/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,还是没有找到相关的方法,希望有知道的大神留言交流。 gradle API:https://developer.android.google.cn/studio/build/gradle-plugin-3-0-0-migration.html#variant_api 这是一个对AS 3.0变化总结比较全的博客: https://mp.weixin.qq.com/s?__biz=MzAwNzc0NjAxMg==& mid=2653391711& idx=1& sn=821eff3f98ab52fc442c6218794b203e& chksm=80aa53ecb7dddafa522d4ebfdf67af2f473365bb0fa2d50ae6df5d00499926ae0d32a5a448d2& mpshare=1& scene=23& srcid=10308c4ICo7GCwuVc683H6eZ#rd
推荐阅读
- Android_???????????????
- Android Studio启动时出现unable to access android sdk add-on list
- Xamarin.Android RelativeLayout
- 设置Android Studio工程布局文件的默认布局
- mybatis的Mapper代理原理
- AndroidStudio 3 export jar file
- appium===浮窗无法定位的解决办法
- gulp-rev-append md5版本号
- 关于SprintMVC中RequestMapping注解value值重复问题