运行lint [Flavor] [Variant]和只是lint有什么区别?

问题描述 投票:1回答:2

我有一个带gradle的Android项目。虽然gradle插件是2.x.x,但运行./gradlew lint的时间大约是4分钟。我已将项目升级为gradle plugin 3.0.1,现在时间约为24分钟。我有四种口味和两种变体(调试和发布)。有趣的是,当我尝试运行./gradlew lint[Flavor][Variant]时,8种组合中的每一种都需要大约30秒。

为什么单独为每种风味和变体运行lint需要花费合理的时间并且为所有风味和变体运行一个命令需要超过20分钟?有什么不同?为什么lint使用gradle插件2.x.x并在升级后变得迟钝?

我试着用--debug旗跑。 lint做了一些工作,然后它决定休息很长一段时间,然后再做一些工作。几乎所有的构建时间都是空闲的。

我尝试谷歌像“(gradle)lint卡住|慢”似乎人们有时候有慢速的gradle构建,可以通过启用离线模式,并行构建,运行守护进程来解决。但这不是这种情况。

对于风味和变体的每种组合,在两种情况下发现的问题的数量是相同的

java.lang.OutOfMemoryError: Java heap space
        at com.google.common.io.ByteStreams.createBuffer(ByteStreams.java:56)
        at com.google.common.io.ByteStreams.copy(ByteStreams.java:103)
        at com.google.common.io.ByteStreams.toByteArray(ByteStreams.java:166)
        at com.android.tools.lint.client.api.ClassEntry.addEntries(ClassEntry.java:195)
        at com.android.tools.lint.client.api.ClassEntry.fromClassPath(ClassEntry.java:120)
        at com.android.tools.lint.client.api.LintClient.createSuperClassMap(LintClient.kt:1001)
        at com.android.tools.lint.detector.api.Project.getSuperClassMap(Project.java:1471)
        at com.android.tools.lint.client.api.LintClient.getSuperClass(LintClient.kt:968)
        at com.android.tools.lint.client.api.LintDriver$LintClientWrapper.getSuperClass(LintDriver.kt:2186)
        at com.android.tools.lint.client.api.LintDriver.getSuperClass(LintDriver.kt:1141)
        at com.android.tools.lint.checks.InvalidPackageDetector.checkClass(InvalidPackageDetector.java:173)
        at com.android.tools.lint.client.api.AsmVisitor.runClassDetectors(AsmVisitor.java:151)
        at com.android.tools.lint.client.api.LintDriver.runClassDetectors(LintDriver.kt:1325)
        at com.android.tools.lint.client.api.LintDriver.checkClasses(LintDriver.kt:1210)
        at com.android.tools.lint.client.api.LintDriver.runFileDetectors(LintDriver.kt:1037)
        at com.android.tools.lint.client.api.LintDriver.checkProject(LintDriver.kt:882)
        at com.android.tools.lint.client.api.LintDriver.analyze(LintDriver.kt:385)
        at com.android.tools.lint.LintCliClient.run(LintCliClient.java:155)
        at com.android.build.gradle.internal.LintGradleClient.run(LintGradleClient.java:197)
        at com.android.build.gradle.tasks.LintBaseTask.runLint(LintBaseTask.java:198)
        at com.android.build.gradle.tasks.LintGlobalTask.lintAllVariants(LintGlobalTask.java:91)
        at com.android.build.gradle.tasks.LintGlobalTask.lint(LintGlobalTask.java:70)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:731)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:705)

这是在./gradlew lint完成之前打印的内容。可能它会在20分钟内进行一些递归,当内存耗尽时会产生结果,我也会看到一些分钟后会有一些眨眼,比如结果已经准备就绪,但任务会持续20分钟而异常会终止它。

android gradle lint
2个回答
0
投票

你可以看看使用dry-run的不同之处,只需使用你的gradle命令将-m作为参数

./gradlew lint[Flavor][Variant] -m

./gradlew lint -m

现在您可以比较两个命令的结果,您可以了解所有gradle任务的执行情况。

另外,为了确定大多数时间正在执行的任务,您可以使用--profile

./gradlew lint[Flavor][Variant] --profile

./gradlew lint --profile

0
投票
  • ./gradlew lintDebug将使用您的主要来源运行lint并进行调试。
  • ./gradlew lintRelease将与你的主要来源和释放运行lint。
  • ./gradlew lint将运行所有的变化。
  • ./gradlew lintFlavor1Debug将使用您的主要来源和flavor1的调试源运行lint。

这继续下去。它主要是关于选择源(Java / Kotlin文件和资源),这些源将被处理为lint以供进一步分析。

本地我通常只使用./gradlew lintDebug和CI在背景中发生我运行全套./gradlew lint

© www.soinside.com 2019 - 2024. All rights reserved.