缘由
gradle已出5.1.1版本,插件com.android.tools.build:gradle:3.4.1
而公司项目使用gradle版本3.3,插件com.android.tools.build:gradle:2.2.0
相比较新版本的种种好处,由于跨越版本较大,升级就像是去取经,历经九九八十一难
征途
编译篇
第一回: 道可道,非常道。
新建一个项目,复制工程里的gradle目录文件,修改工程根目录(最外层)下的build.gradle
文件
dependencies {
classpath 'com.android.tools.build:gradle:3.4.1'
}
repositories下添加google()
仓库
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.1'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
TryAgain...报错
第二回: 人法地,地法天,天法道,道法自然
替换主工程内以及所有的Library下的build.gradle
文件内的dependencies内容
compile -> implementation
testCompile -> testImplementation
androidTestCompile -> androidTestImplementation
compile project -> implementation project
compile files -> implementation files
// 由于我们接如了znds的一个库,因此以下修改属于独有的,如果你没有这个忽略就是了
zndsCompile -> zndsImplementation
执行完成后可看到类似以下结果,先不要考虑升级support库的版本
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
TryAgain...报错
第三回: 故善人者,不善人之师
如果你用到了自定义GradleTask任务,那么你会遇到第一个错误Could not find method leftShift() for arguments
task printVersion << {
println("Incrementing Version Number...")
incrementVersionNumber('VersionNumber')
println("Incrementing Version Name...")
incrementVersionName('VersionName')
}
官方描述:
Left shitf operator represent's doLast { }.
<< was deprecated in 4.x and removed in 5.0
More info here: https://discuss.gradle.org/t/could-not-find-method-leftshift-for-arguments-on-task-of-type-org-gradle-api-defaulttask/30614
原来这个<<
被废弃了,取而代之的是doLast
,听官方的,乖乖修改如下
task printVersion {
doLast {
println("Incrementing Version Number...")
incrementVersionNumber('VersionNumber')
println("Incrementing Version Name...")
incrementVersionName('VersionName')
}
}
TryAgain...报错
第四回: 以道佐人主者,不以兵强天下。
将作为Library的Module下的AndroidManifest中的这个去掉,如果一定需要限制使用sdk的版本,那么在build.gradle中实现即可
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="14" />
TryAgain...报错
第五回: 吉事尚左,凶事尚右。
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
所有的flavors都必须属于同一个风格
我是谁?我在哪?我在做什么?
继续跟着官方的脚步
创建产品风格与创建构建类型相似:只需将其添加到构建配置中的 productFlavors 代码块并加入所需的设置即可。产品风格支持与 defaultConfig 相同的属性,这是因为 defaultConfig 实际上属于 ProductFlavor 类。这意味着,您可以在 defaultConfig 代码块中提供所有风格的基本配置,每种风格均可更改任何这些默认值,例如 applicationId。所有风格必须属于指定的风格维度,即产品风格组。即使打算只使用一个维度,也必须将风格分配到特定风格维度
恶魔妈妈买面膜...差不多是说让我们改成这个样子了
defaultConfig {
applicationId "com.xxxx.xxxx"
minSdkVersion xx
targetSdkVersion xx
versionCode x
versionName "x.x.x"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//版本名后面添加一句话,意思就是flavor dimension 它的维度就是该版本号,这样维度就是都是统一的了
flavorDimensions "versionCode"
}
TryAgain...成功了?不可思议...一切不会这么简单
菜单执行: build -> rebuild
或者运行一下,熟悉的failed,又见面了
第六回: 道常无名朴。虽小,天下莫能臣。
Caused by: java.io.FileNotFoundException
at com.android.build.gradle.internal.dependency.IdentityTransform.transform
排查发现有一个已经删除的jar依赖,硬编入代码的引入未删除引起
已经不使用的依赖就不要随便添加了
使用implementation fileTree(dir: 'libs', include: ['*.jar'])
, 而不是implementation files("libs/xxxx.jar")
引入外部jar文件
运行...出错...
运行篇
第七回: 知人者智,自知者明。
运行报错error: cannot find symbol class RecyclerView
,纳尼...找不到RecyclerView
implementation
引入的依赖表示仅本Module可以使用,如果外部依赖需要使用,需要使用api
来代替
运行...出错...
第八回: 大道泛兮,其可左右。
error: package org.apache.http.entity.mime does not exist
记得一定要修改compileSdkVersion >= 23
运行...出错...
第九回: 执大象,天下往。
Didn’t find class "android.support.v4.animation.AnimatorCompatHelper"
ext {
supportVersion = "28.0.3"
}
api "com.android.support:support-annotations:${rootProject.ext.supportVersion}"
运行...出错...
降低supportVersion = "23.4.0"恢复正常...后期再适配高版本
第十回: 鱼不可脱于渊,国之利器不可以示人。
error: cannot find symbol variable MATRIX_SAVE_FLAG
代码错误...嘿嘿嘿...有戏啊, 终于不是以上来就报错了...
查看官方Canvas变动发现
Class android.graphics.Canvas
Removed Methods int save(int)
Removed Fields int CLIP_SAVE_FLAG
int CLIP_TO_LAYER_SAVE_FLAG
int FULL_COLOR_LAYER_SAVE_FLAG
int HAS_ALPHA_LAYER_SAVE_FLAG
int MATRIX_SAVE_FLAG
This method was deprecated in API level 26. Use saveLayer(float, float, float, float, Paint) instead.
public static final int ALL_SAVE_FLAG = 0x1F;
public static final int MATRIX_SAVE_FLAG = 0x01;
public static final int CLIP_SAVE_FLAG = 0x02;
public static final int HAS_ALPHA_LAYER_SAVE_FLAG = 0x04;
public static final int FULL_COLOR_LAYER_SAVE_FLAG = 0x08;
public static final int CLIP_TO_LAYER_SAVE_FLAG = 0x10;
老规矩, 按以下方式编写
public int saveLayer(float left, float top, float right, float bottom, @Nullable Paint paint) {
return saveLayer(left, top, right, bottom, paint, ALL_SAVE_FLAG);
}
运行...出错...不,不,等等...Supperise
最终篇
WARNING: The following project options are deprecated and have been removed:
android.useDeprecatedNdk
NdkCompile is no longer supported
Affected Modules: TogicBase, TogicVideo, glide
WARNING: DSL element 'DexOptions.incremental' is obsolete and will be removed at the end of 2018.
Affected Modules: TogicVideo
WARNING: The specified Android SDK Build Tools version (23.0.2) is ignored, as it is below the minimum supported version (28.0.3) for Android Gradle Plugin 3.4.1.
Android SDK Build Tools 28.0.3 will be used.
To suppress this warning, remove "buildToolsVersion '23.0.2'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools.
Remove Build Tools version and sync project
Affected Modules: TogicBase, TogicVideo, glide
- 注释/删除掉gradle.properties中的
#android.useDeprecatedNdk
- 注释/删除掉build.gradle中
dexOptions {
incremental true
}
- 修改buildToolsVersion 28.0.3
成果
没有ERROR, 没有WARNING, 万籁俱寂, 众生平等
网友评论