android gradle增量lint

因为我会在Android的增量Lint检查工作,我看了一些文章,我发现我可以在build.gradle中添加一个任务,然后通过重写LintGradleClient传递一些参数,应该按照文章中的描述工作,但是我按照文中所描述的,在增加了LintGradle参数的情况下,AndroidProject无法得到,我用kotlin实现了。有人可以帮我吗? 这里是文章的URL路径https://www.jianshu.com/p/4833a79e9396

我的代码获取AndroidProject作为Kotlin:

fun getAndroidProject(): AndroidProject{ var gradleConn = GradleConnector.newConnector() gradleConn.forProjectDirectory(getProject().getProjectDir()) var modelProject = gradleConn.connect().getModel(com.android.builder.model.AndroidProject::class.java) return modelProject } 

我执行任务,它告诉我这样的:

在这个版本中没有可用的“AndroidProject”types的模型。

那篇文章中的android插件的版本是旧的,从3.0.0开始,获得AndroidProject的方式已经改变了。

在阅读gradle android插件的源代码之后, com.android.build.gradle.tasks.LintBaseTask给出了一个线索:

 protected AndroidProject createAndroidProject(Project gradleProject) { String modelName = AndroidProject.class.getName(); ToolingModelBuilder modelBuilder = this.toolingRegistry.getBuilder(modelName); assert modelBuilder != null; ExtraPropertiesExtension ext = gradleProject.getExtensions().getExtraProperties(); ext.set("android.injected.build.model.only.versioned", Integer.toString(3)); ext.set("android.injected.build.model.disable.src.download", Boolean.valueOf(true)); AndroidProject var5; try { var5 = (AndroidProject)modelBuilder.buildAll(modelName, gradleProject); } finally { ext.set("android.injected.build.model.only.versioned", (Object)null); ext.set("android.injected.build.model.disable.src.download", (Object)null); } return var5; } 

保持正轨,我们可以find:
1. toolingRegistry是由GlobalScope.getToolingRegistry()
2. GlobalScope VariantScope.getGlobalScope()
3. VariantScopeApplicationVariant.getVariantData().getScope()

ApplicationVariantcom.android.application插件中applicationVariants的元素,可以遍历applicationVariants列表来获取它。

以下是app/build.gradle的示例代码:

 android { // other script... applicationVariants.all { variant -> def globalScope = variant.variantData.scope.globalScope String modelName = AndroidProject.class.getName() ToolingModelBuilder modelBuilder = globalScope.toolingRegistry.getBuilder(modelName) AndroidProject androidProject = (AndroidProject) modelBuilder.buildAll(modelName, project) // create your task to do something } }