Gradle升级3.2.1以后打包提示一个警告:

根据字面意思variantOutput.getPackageApplication() 这个方法废弃了, 但是项目中全局搜索这个关键词没有找到调用这个方法, 最后是因为下面这段代码:
1 | applicationVariants.all { variant -> |
这是写在 build.gradle 中用于自定义生成 apk 名的一段代码.
经过排查这个问题是由 output.outputFile 引起的,说明在调用 getOutputFile() 这个方法时,方法里调用了 getPackageApplication() 这个方法,既然是暗里调用,那只能去看源码了
首先进入 gradle-3.3.0-sources.jar ,找到了 getApplicationVariants() 方法所在
1 | public DomainObjectSet<ApplicationVariant> getApplicationVariants() { |
这样我们就知道了 applicationVariants.all { variant -> 中的 variant 是 ApplicationVariant ,但是 ApplicationVariant 是一个接口
1 | package com.android.build.gradle.api; |
继续寻找具体类,然后找到了 ApplicationVariantImpl ,路径
1 | /** |
output 是 BaseVariantOutput ,会发现 BaseVariantOutput 又是一个接口,面向接口编程的坏处就是,别人看的时候要一层层剥离,才能找到内心,最终发现具体类是 ApkVariantOutputImpl
1 |
|
终于找到问题源头了,在 getOutputFile() 方法里头调用了 getPackageApplication() 方法,但这是 gradle 的源码,我们没法修改,所有只能不要再使用 getOutputFile() 方法了
那如果要更改输出路径的时候该怎么办呢?不是建议让我们用 getPackageApplicationProvider() 方法么,我们来看看这个方法得到的是啥?
1 | /** |
一个任务提供者,实际起作用的是 PackageAndroidArtifact ,所有直接看其源码,我们只取所需:
1 | protected File outputDirectory; |
现在我要把 apk 输出到项目根目录下,就可以这样写了
1 | applicationVariants.all { variant -> |