浅谈Android Studio 3.0 的一些小变化
作者:珠穆朗玛小王子 发布时间:2022-12-23 10:27:56
前言
一大早还在北京拥挤的地铁里,我的CTO闫哥在微信里给我发了一条信息:Android Studio 3.0发布了。
为什么会这么关注Android Studio 3.0 的版本发布呢?主要是因为公司即将开发的新app准备使用Kotlin语言,而Android Studio 3.0 已经把Kotlin的语言支持内置进去了,这样就省去了很多的麻烦,如果你还没接触过Kotlin语言,可以去百度一下 他们的官网,如果你现在使用的Java语言,那么你真是太幸运了,因为Kotlin对于你来说,将会非常简单,例如像我这样的,两三天就可以几乎应付大部分的开发了。
这里就不对Kotlin语言做过多的描述了,今天的重点,是我升级到Android Studio 3.0 以后的故事。
正文
来到公司打开电脑,升级Android Studio到3.0版本,编译目前的工程。哎呀呀我擦擦,为什么报了好多的错?别着急,我们慢慢解决这些问题。
Android Studio的自带Gradle版本是4.1,插件版本是3.0.0,所以如果你使用的是老版本,就会出现一些小的兼容问题,我们看看报了哪些错误呢:
问题1
Error:(72, 0) Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=appDebug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
outputFile是只读属性,不可以对他进行修改
看一下我的gradle里面的代码:
// 定义生成的apk的名称
def apkName;
buildTypes {
release {
...
// 定义release版本生成的apk的名字
apkName = "xxx" + VERSION_NAME + "_release.apk";
}
debug {
...
// 定义debug版本生成的apk的名字
apkName = "ugirls_" + VERSION_NAME + "_debug.apk";
}
}
// 修改apk build的名字
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
//这里使用之前定义apk文件名称
output.outputFile = new File(outputFile.parent, apkName)
}
}
}
这段代码的功能是修改Build命令生成的apk的名称,因为outputFile变成只读属性,所以报错。
修改后:
// 之前代码保持不变
// 修改apk build的名字
android.applicationVariants.all { variant ->
variant.outputs.all {
if (outputFileName.endsWith('.apk')) {
//这里使用之前定义apk文件名称
outputFileName = apkName
}
}
}
把each修改为all,然后通过outputFileName修改生成的apk的名称。
如果你提示没有找到all方法或者是未找到outputFileName,你可以先把这个功能注释掉,等其他问题都解决了,再打开就可以解决这个问题了。
问题2
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
所有的flavor属性应当属于同一个命名空间
看着问题似乎有点深奥,其实就是需要我们为flavors设置一个版本,统一使用相同版本的flavors。
defaultConfig {
targetSdkVersion:***
minSdkVersion :***
versionCode:***
versionName :***
//为flavor设置一个版本,命名是随意的
flavorDimensions "versionCode"
}
问题3
有些库不能被正常引用,例如我使用的multidex,在上面的截图中已经提示我们如何解决这个问题
buildscript {
repositories {
...
// 添加google库的依赖
google()
}
dependencies {
...
}
}
问题4
Error:(2638) error: style attribute '@android:attr/windowEnterAnimation' not found.
提示我们找不到@android:attr/windowEnterAnimation,因为已经不支持@开头使用android自带的属性,我们只要把@符号删掉就可以了。
修改前:
<style name="ToastStyle" parent="android:Animation">
<item name="@android:windowEnterAnimation">@anim/push_fade_in</item>
<item name="@android:windowExitAnimation">@anim/push_fade_out</item>
</style>
修改后:
<style name="ToastStyle" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/push_fade_in</item>
<item name="android:windowExitAnimation">@anim/push_fade_out</item>
</style>
问题5
Error:Execution failed for task ':app:javaPreCompileAppDebug'.
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-6.1.0.jar (com.jakewharton:butterknife:6.1.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.
好多的错误日志啊,其实最关键的只有前两行:
使用注解编译库,需要显示的声明,而我正在使用的butterknife是含有注解编译功能的,但是并没有声明。
解决办法:
android {
defaultConfig {
// 声明需要使用注解功能
javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
...
}
}
其他的变化
通过刚才的修改,我的工程已经运行起来了,但是发现了Android Studio 3.0 的几个小变化。
变化1
Warning:One of the plugins you are using supports Java 8 language features. To try the support built into the Android plugin, remove the following from your build.gradle:
apply plugin: 'me.tatarka.retrolambda'
从警告上看,希望我移除这个插件,于是我到官网上查看了一下信息:
If Android Studio detects that your project is using Jack, Retrolambda, or DexGuard, the IDE uses Java 8 support provided by those tools instead.
如果Android Studio发现你的工程中使用Jack ,Retrolambda 或DexGuard,编辑器会使用Java8支持,替换这个工具。
因为我使用me.tatarka.retrolambda第三方框架,所以就出现了这个,我们只要删除相关的配置就可以了。
变化2
提示有更高版本你的第三方框架:
上面的截图显示,gson有更高的版本2.8.3,提示我升级gson。这就省去了我们去github上查看是否版本更新的时间,非常的方便。
总结
这就是我今天遇到的问题及解决方案,如果之前有更多问题再补充。
来源:http://www.jianshu.com/p/47bf8941c0ac?utm_source=tuicool&utm_medium=referral
猜你喜欢
- 说明:实现功能:(1)屏幕右半部分上滑,声音变大,下滑,声音变小 屏幕左半部分上滑,亮度变大,下滑,亮度变小(2)如果亮度>1或者小于
- 概念CAS的全称是Compare-And-Swap,它是cpu并发原语它的功能是判断内存某个位置的值是否为预期值。如果是则更改为新的值,这个
- 最近碰到这么个恶心的问题问题:有个arr文件被放到Module A中引用,现在Module B又依赖了Module A,则在编译过程中会发生
- Swagger2配置(解决404报错)在spring boot项目中配置Swagger2,配置好了但是访问确实404,SwaggerConf
- 本文实例讲述了C#序列化与反序列化的方法。分享给大家供大家参考。具体分析如下:把“对象”转换为“字节序列”的过程称为对象的序列化。 
- 本文实例讲述了winform用datagridview制作课程表的方法。分享给大家供大家参考。具体分析如下:课程表的最终效果如下图所示:具体
- 一、单独使用MyBatis(1)在mybatis.xml配置文件中添加如下配置<setting name="logImpl&
- Random类 (java.util) Ran
- 若要在 C++ 中实现异常处理,你可以使用 try、throw 和 catch 表达式。首先,使用 try 块将可能引发异常的一个或多个语句
- 前言在SpringIOC中,我们熟知的BeanScope有单例(singleton)、原型(prototype), Bean的Scope影响
- 1.元组(Tuple)元组(Tuple)在4.0 的时候就有了,但元组也有些缺点,如: 1)Tuple 会影响代码的
- 利用 Spring 工厂加载机制,实例化 ApplicationListener 实现类,并排序对象集合创建应用事件 * 创建类实现接口Ap
- 在系统的管理员有着实际的应用,对于一个数据库管理系统来说,数据库安全还是挺重要的,所以在存入到数据库的密码通常都是加密的。即使有着hack攻
- 前言我们很多小伙伴平时都是做JAVA开发的,那么作为一名合格的工程师,你是否有仔细的思考过JVM的运行原理呢。如果懂得了JVM的运行原理和内
- 我们主要介绍一下:java中如何通过最简单的方式实现链式创建json对象,解决创建json代码臃肿的问题。1、假设我们要创建一个json对象
- springboot对kafka的client很好的实现了集成,使用非常方便,本文也实现了一个在springboot中实现操作kafka的d
- 这一篇我们说说Java线程Thread的interrupt中断机制。中断线程线程的thread.interrupt()方法是中断线程,将会设
- 前言J.U.C是java包java.util.concurrent的简写,中文简称并发包,是jdk1.5新增用来编写并发相关的基础api。j
- 前言最近有个网友问了我一个问题:系统中大事务问题要如何处理?正好前段时间我在公司处理过这个问题,我们当时由于项目初期时间比较紧张,为了快速完
- xml中: <ImageView &nb