Android studio Android Studio中不同构建类型的不同lint.xml?
我想在Android Studio中使用不同的lint.xml文件进行发布和调试构建类型。那么,如何才能做到这一点呢Android studio Android Studio中不同构建类型的不同lint.xml?,android-studio,android-gradle-plugin,lint,Android Studio,Android Gradle Plugin,Lint,我想在Android Studio中使用不同的lint.xml文件进行发布和调试构建类型。那么,如何才能做到这一点呢 当我将lint.xml放在someModule/src/debug和someModule/src/release文件夹(同样,这些文件夹只包含该lint.xml文件,仅此而已)中时,gradle会做出反应,因为没有任何lint.xml文件,如果我将单个lint.xml文件放在核心模块文件夹(someModule/)下,gradle会识别它,但是在这种情况下,我不能根据构建类型使用
当我将lint.xml放在someModule/src/debug和someModule/src/release文件夹(同样,这些文件夹只包含该lint.xml文件,仅此而已)中时,gradle会做出反应,因为没有任何lint.xml文件,如果我将单个lint.xml文件放在核心模块文件夹(someModule/)下,gradle会识别它,但是在这种情况下,我不能根据构建类型使用不同的设置…我没有尝试过,但类似的东西可能会对您有所帮助
tasks.whenTaskAdded { task ->
if (task.name == 'lintDebug') {
task.ext.lintXmlFileName = "lint-debug.xml"
} else if (task.name == 'lintDemo') {
task.ext.lintXmlFileName = "lint-demo.xml"
}
}
编辑:评论反馈:
- task.ext.xxxx是供您使用的自定义名称空间:请参阅
- “lintXmlFileName”是一个虚构的名称。你找不到医生李>
- 在android{…lintpoptions{…lintConfig文件(“lint.xml”)}中,您需要使用“.ext.get”(“lintXmlFileName”)”读取“lintXmlFileName”,并将其设置为“lintConfig文件()
- 我没有测试它,但我假设“whenTaskAdded”超出了应用程序build.gradle中“android”的范围
任务
。如果项目具有不同的构建变量,则会有不同的lint任务。您可以从android studio所有任务列表
,或从命令行/gradlew tasks
获取这些任务。下面的示例显示了两种构建风格demo
和full
lint - Runs lint on all variants.
lintDemoDebug - Runs lint on the DemoDebug build
lintDemoRelease - Runs lint on the DemoRelease build
lintFullDebug - Runs lint on the FullDebug build
lintFullRelease - Runs lint on the FullRelease build
这些lint任务依赖于其他任务,比如说preBuild
在运行lint任务之前,它将首先运行任务preBuild
。任务preBuild
是一个已经存在的任务,但是我们可以操作这个预定义的任务并向这个任务添加更多的操作。androidlintOptions
属性将根据不同的构建变量动态添加和修改,如下代码在文件app/build.gradle
中所示
preBuild.doFirst {
android.applicationVariants.each { variant ->
if (variant.name == 'demoDebug') {
println variant.name
android.lintOptions.quiet = true
android.lintOptions.lintConfig = new File('app/lint_demo_debug.xml')
// you can add more properties
} else if (variant.name == 'fullDebug') {
println variant.name
android.lintOptions.quiet = false
android.lintOptions.lintConfig = new File('app/lint_full_debug.xml')
// you can add more properties
} // more variants...
}
为了成功运行上述代码,相应的lint配置文件必须存在于app目录下。以下是对我有效的方法:
tasks.whenTaskAdded { task ->
if (task.name.startsWith("lint")) {
if (task.name.toLowerCase().endsWith("release")) {
task.doFirst {
android.lintOptions.abortOnError = true
}
} else {
task.doFirst {
android.lintOptions.abortOnError = false
}
}
}
}
在我的例子中,我需要为发布版本打开abortOnError
,这样我可以自由开发,但可以快速捕获CI上的lint错误(如果它们滑落)。使用kotlin构建脚本(build.gradle.kts
):
tasks.withType().configureEach{
//doFirst是必需的,否则我们将在lintOption上获得空指针异常
首先{
//这将覆盖android扩展中的选项
lintOptions.run{
if(name.toLowerCase().contains(“debug”)){
//在这里进行配置
//isAbortOnError=true
//baselineFile=file(“baseline.xml”)
//IsWarningAsErrors=真
//ischeckdependences=true
//忽略(“遗漏翻译”)
//setLintConfig(文件(“lint.xml”))
}
}
}
}
如果您编写一个函数,动态重命名不需要的lint.xml
文件,只留下您想要的文件,那该怎么办?我愿意接受任何类型的解决方案。包括文件系统操作。您最终找到了解决方案吗?@DataGraham抱歉,没有。请尝试使用Loda的答案。谢谢,我看到了此文档。但这如何帮助我们在每种构建类型中拥有不同的lint.xml文件呢?我认为这不管用。它迭代所有变量,每次设置全局配置,因此无论最后出现哪一个变量,这些选项都将全局设置。没错,这只会保留最后一个变量的值,请参阅我的答案,了解我是如何做到这一点的。我尝试了此解决方案,但无法使其正常工作。此脚本应该放在build.gradle文件中的什么位置?在顶级还是“安卓”内部?这就是它的全部,还是你也需要在android{lintOptions{}}下放一些特别的东西?我找不到“lintXmlFileName”属性的任何文档。
tasks.whenTaskAdded { task ->
if (task.name.startsWith("lint")) {
if (task.name.toLowerCase().endsWith("release")) {
task.doFirst {
android.lintOptions.abortOnError = true
}
} else {
task.doFirst {
android.lintOptions.abortOnError = false
}
}
}
}
tasks.withType<LintBaseTask>().configureEach {
// doFirst is required else we get a Null Pointer Exception on lintOption
doFirst {
// This will override the lintOptions from the android extension
lintOptions.run {
if (name.toLowerCase().contains("debug")) {
// Do your configuration here
// isAbortOnError = true
// baselineFile = file("baseline.xml")
// isWarningsAsErrors = true
// isCheckDependencies = true
// ignore("MissingTranslation")
// setLintConfig(file("lint.xml"))
}
}
}
}