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. VariantScope
由ApplicationVariant.getVariantData().getScope()
ApplicationVariant
是com.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 } }