Android Studio 3.0启动图
序言
总看别人的文章,今天尝试着自己来写一篇。在逛论坛时候,无意间发现Android Studio 3.0正式版本推送更新了,早听说AS 3.0添加了许多新功能,然后手贱迫不及待地想先睹为快,结果正中下怀。下载和更新Gradle,半天无响应,只好结束进程强制关闭AS,手动离线下载安装。本以为不会有太大问题,谁知太高估了,进来各种的报错,各种的配置问题,填坑之路就此开始。
版本更新
更新内容如下表所示:
更新时间 | 更新版本 | 更新内容 |
---|---|---|
2017.10.31 | v1.3.171031 | ① Gradle关键字依赖变化;② AAPT2编译报错;③ 相关下载地址。 |
2017.11.11 | v2.2.171111 | ① 图片错误;② 输入法中文状态下无法选词。 |
2017.12.31 | v3.2.171231 | ① 完善中文输入问题;② AS 3.0.1资源问题。 |
2018.04.16 | v4.3.180416 | ① AS 3.1.1配置问题;② 完善相关问题;③ AS更新升级问题。 |
2018.10.09 | v5.3.181009 | ① AS 3.2注意事项;② AndroidX的迁移。 |
2019.02.15 | v6.2.190215 | ① 自定义apk名称完善;② AS 3.3.0警告问题。 |
2019.04.22 | v7.2.190422 | ① 更新内容整理;② Gradle版本升级。 |
... | ... | ... |
正文
AS升级到 Android Studio 3.x(Stable 3.0.0 ~ 3.4.0)之后,会遇到一些版本升级变更的问题。
下表列出了 AS Gradle版本对应所需的 Gradle插件版本。为了获得最佳的性能,尽可能使用最新版本的Gradle和插件。
Gradle插件版本 | Gradle版本 |
---|---|
1.0.0 - 1.1.3 | 2.2.1 - 2.3 |
1.2.0 - 1.3.1 | 2.2.1 - 2.9 |
1.5.0 | 2.2.1 - 2.13 |
2.0.0 - 2.1.2 | 2.10 - 2.13 |
2.1.3 - 2.2.3 | 2.14.1 |
2.3.0 | 3.3 |
3.0.0 | 4.1 |
3.1.0 | 4.4 |
3.2.0 - 3.2.1 | 4.6 |
3.3.0 - 3.3.2 | 4.10.1 |
3.4.0 - 3.4.1 | 5.1.1 |
3.5.0 - 3.5.3 | 5.4.1 |
3.6.0 - 3.6.3 | 5.6.4 |
... | ... |
1. Gradle版本不匹配
修改项目下 gradle/wrapper/gradle-wrapper.propertie 文件中的distributionUrl
地址:
AS 3.0.0 ~ 3.0.1改为:
distributionUrl=https://services.gradle.org/distributions/gradle-4.1-all.zip
AS 3.6.0 ~ 3.6.3 改为:
distributionUrl=https://services.gradle.org/distributions/gradle-5.6.4-all.zip
2. Gradle插件不匹配
1)项目根目录下的 build.gradle 文件中两个repositories
节点都添加google()
;
- E.G
buildscript{
repositories {
google() //新增
}
dependencies {
classpath'com.android.tools.build:gradle:3.0'//与AS版本一致
//classpath'com.android.tools.build:gradle:3.6.3'
}
}
allprojects {
repositories{
google() //新增
}
}
2)项目 app下 build.gradle 文件中,修改相关支持库版本;
AS 3.0 ~ 3.0.1:SDK Build Tools 26.0.2 or higher.
android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
...
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:design:26.1.0'
testImplementation 'junit:junit:4.12'
...
}
AS 3.1.1 ~ 3.1.4:SDK Build Tools 27.0.3 or higher.
android {
compileSdkVersion 27
buildToolsVersion "27.0.3"
...
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:design:27.1.1'
testImplementation 'junit:junit:4.12'
...
}
AS 3.2 ~ 3.6.x:SDK Build Tools 28.0.3 or higher.
android {
compileSdkVersion 28
buildToolsVersion "28.0.3"
...
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
testImplementation 'junit:junit:4.12'
...
}
3. Gradle编译报 flaovr配置错误
- Error
Error:A problem occurred configuring project ':app'.> All flavors must now belong to a named flavor dimension.
- Solution
AS 3.0后 gradle添加了
flavorDimensions
属性,用来控制多个版本的代码和资源,缺失就会报错。在项目 app下 build.gradle文件中,添加flavorDimensions
:
android {
...
flavorDimensions "tier","minApi"
productFlavors{
fees{
dimension"tier"
...
}
minApi23{
dimension"minApi"
...
}
}
}
如果不需要多版本控制只需添加:flavorDimensions "code"
(随意定义)
android {
...
defaultConfig {
...
flavorDimensions "code"
}
...
}
4. Gradle自定义apk名称报错
- E.G AS 3.0之前自定义apk名称:
applicationVariants.all { variant ->
variant.outputs.each { output ->
def fileName = "${variant.versionName}_release.apk"
def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith('.apk')) {
output.outputFile =newFile(outFile.parent, fileName)
}
}
AS 3.0之后,同样代码自定义apk名称却会报错:
- Error
Error:(56, 0) Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
- Solution
outputFile
变为只读,不能修改输出的名称所以报错。修改为:
applicationVariants.all { variant ->
variant.outputs.all { output -> // each 改为 all
def fileName = "${variant.versionName}_release.apk"
def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith('.apk')) {
outputFileName = fileName // output.outputFile 改为 outputFileName
}
}
把each
修改为all
,然后通过outputFileName
修改生成apk的名称。此外,AS 3.0后打包完,除了apk包文件,还会多一个 output.json 参数文件。更多自定义打包请移驾 Android Studio自定义多渠道打包
5. AS 3.0后关键字依赖变化
- E.G
AS 3.0之前依赖关键字:
compile
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:26.1.0'
compile files('libs/gson-2.3.1.jar')
compile project(':mylibrary')
...
}
AS 3.0之后依赖关键字:implementation
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation files('libs/gson-2.3.1.jar')
implementation project(':mylibrary')
...
}
AS 3.0后Gradle关键字依赖发生变化:
compile(implementation/api)
,provided(compileOnly)
,apk(runtimeOnly)
AS 3.0后,在使用新依赖配置项时,引用本地库使用
implementation
指令时,若出现找不到导包或资源问题报错,可以更换依赖指令为api
重新编译。关于implementation
和api
的区别,请移驾 Android Studio Gradle依赖项配置
6. AAPT2编译报错
- Error
Error: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
- Solution
在项目根目录下 gradle.properties 文件中关闭APPT2编译:
代码语言:javascript复制...
android.enableAapt2 = false
7. PNG 图片错误,AAPT err(Facade for):Unable to open PNG file
- Error
AAPT err(Facade for):……Unable to open PNG file
- Solution 项目 app下 build.gradle文件中添加下面属性:
android{
...
aaptOptions{
cruncherEnabled = false
useNewCruncher = false
}
...
}
用来关闭AS图片PNG合法性检查的,直接不让它检查。
- Note 如果还是有错误,请检查:
1 ) .9.png图片放在
res/drawable
文件夹下 2 ) .9.png图片四边都要有黑线,确保图片是标准的.9.png
图片
8. 输入法中文状态下无法选词
- Question AS 3.0后在输入中文时候会出现键盘不显示,无法筛选词输入中文
- Solution 首先要说不是你的输入法问题,而是AS 3.0后的一个BUG,下面提供几种解决方案:
1 ) 如果你还在2.3.x的环境下开发,为了避免输入法问题,建议你暂时不要升级到3.x; 2 ) 如果你想2.3.x升级使用3.x,那么不建议你使用2.x的jre替换3.x的jre方式去处理输入法问题,虽然暂时可以解决输入问题,但是后面升级的时候你还得把2.x 的jre换回3.x的jre,否则升级后将无法正常使用AS; 3 ) 最简单最有效的解决办法就是在使用 AS的时候,切换到 windows自带的中文输入法就可以正常输入中文筛选词语了,相对而言,这样方便很多。虽然没有第三方输入法用起来那么顺手,但是可以有效解决输入法问题和避免以后升级的问题; 4 ) 终极方案:升级到 AS 3.1.1及以上版本即可解决,AS 3.1.1已经修复了输入法中文状态下无法选词的BUG。
9. 移除无用资源问题
- Error
Error: Removing unused resources requires unused code shrinking to be turned on.
- Solution
android {
...
buildTypes {
debug {
signingConfig signingConfigs.release
debuggable true
zipAlignEnabled true
minifyEnabled true //是否混淆
shrinkResources true //是否去除无效的资源文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
signingConfig signingConfigs.release
zipAlignEnabled true
debuggable true
minifyEnabled true //是否混淆
shrinkResources true //是否去除无效的资源文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
...
}
AS 3.0.1后,如果使用shrinkResources
来移除未引用资源,必须要先开启混淆minifyEnabled
,才能通过资源压缩器将它们移除,否则编译会报错。
10. 软件升级安装冲突
- Error AS在线升级后,安装重启软件时会出现部分文件安装冲突。如下图所示:
更新问题图
- Solution No.1: 1)找到 AS 安装目录下的 uninstall.exe 卸载文件,运行卸载当前旧版本AS(卸载前记得备份代码和配置文件); 2)下载最新版本的AS安装包,运行安装并导入配置文件和项目。 No.2: 1)点击 Cancel 取消安装并关闭AS; 2)找到 AS 安装目录下的 studio64.exe 启动文件,右键 —— 以管理员身份运行 打开AS(提高AS的权限); 3)点击 Help —— Checkout for Updates —— Update and Restart 重新更新下载安装。
11. AS 3.2注意事项
AS升级到 3.2 时应该注意:
1)compileSdkVersion 版本升级到28
及以上;
2)buildToolsVersion 版本改为28.0.3
及以上;
3)Gradle 插件版本改为4.6
及以上;
4)新的 Android扩展库(AndroidX
)取代旧 Android支持库,新的命名空间为 androidx.*
,包括所有的支持库和架构组件。
依赖库对比:
代码语言:javascript复制//旧依赖库
implementation 'com.android.support:appcompat-v7:28.0.0'
//新依赖库
implementation 'androidx.appcompat:appcompat:1.0.0'
AndroidX迁移方法,请移驾 Android AndroidX的迁移
AndroidX 目前仍被认为是处于 Alpha 阶段,有些变更会破坏兼容性。此外,还有一些已知的问题,所以暂时不建议在生产项目中使用。
12. AS 3.3.0警告问题
在 AS升级到 3.3.0,Gradle升级到 4.10.1 时,编译会一直提示警告。
- Warn
WARNING: API 'variantOutput.getPackageApplication()' is obsolete and has been replaced with 'variant.getPackageApplicationProvider()'.
It will be removed at the end of 2019.
For more information, see https://d.android.com/r/tools/task-configuration-avoidance.
To determine what is calling variantOutput.getPackageApplication(), use -Pandroid.debug.obsoleteApi=true on the command line to display a stack trace.
Affected Modules: app
警告信息说 APIvariantoutput.getPackageApplication()
已过时,并且已被替换为variant.getPackageApplicationProvider()
,将于2019年底移除。尽管如此,我们还是不知道具体哪个地方的方法过时了,根据后面提示在gradle.properties
中配置android.debug.obsoleteApi=true
来查看详细的调试信息:
WARNING: API 'variantOutput.getPackageApplication()' is obsolete and has been replaced with 'variant.getPackageApplicationProvider()'.
It will be removed at the end of 2019.
For more information, see https://d.android.com/r/tools/task-configuration-avoidance.
REASON: Called from: E:MyAppappbuild.gradle:67
WARNING: Debugging obsolete API calls can take time during configuration. It's recommended to not keep it on at all times.
Affected Modules: app
虽然乍看和之前的日志差不多,但是这次却明确告诉我们过时方法的具体位置:E:MyAppappbuild.gradle:67
。我的build.gradle:67
是自定义apk输入方法def outFile = output.outputFile
,output.outputFile
内部调用的是getPackageApplication()
这里引用了过时方法。
- Solution
No.1:回退 Gradle版本
1)修改项目根目录下
build.gradle
文件中 gradle插件版本:
repositories {
google()
}
dependencies {
classpath'com.android.tools.build:gradle:3.2.1' //回退到3.3.0以下
}
...
}
2)修改项目下gradle/wrapper/gradle-wrapper.propertie
文件中的distributionUrl
:
distributionUrl=https://services.gradle.org/distributions/gradle-4.6-all.zip //回退到4.10.1以下
No.2:删除文件类型判断 AS 3.0 ~ 3.2.1:
代码语言:javascript复制applicationVariants.all { variant ->
variant.outputs.all { output ->
def fileName = "${variant.versionName}_release.apk"
def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith('.apk')) {
outputFileName = fileName
}
}
AS 3.3.0 ~ 3.3.2:
代码语言:javascript复制applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName = "${variant.versionName}_release.apk"
}
参考
Android Studio发布说明,点击开启传送门! Android Gradle配置文档,点击开启传送门!
下载
Android Studio下载,请戳我哟! Android Gradle下载,请戳我哟!
结语
上述就是AS 2.x升级AS 3.x所遇到的问题,可能每个人情况不一样,遇到的问题也不尽相同。希望有类似经历和问题的小伙伴,可以帮助你们少走一些弯路。
初次写,如有不对和欠妥当地方,请大家帮忙指正,有疑问和补充的小伙伴请留言告知,万分感谢!文章会持续更新,待续……
支持原创,抵制抄袭。每一位辛勤的创作者都值得被尊重!!! 如需转载,请先联系。