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

时间:2018-01-11 15:10:39

标签: android gradle lint

我有一个带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分钟而异常会终止它。 / p>

2 个答案:

答案 0 :(得分:0)

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

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

./gradlew lint -m

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

另外,为了识别哪个任务占用时间最多,您可以使用 - 个人资料

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

./gradlew lint --profile

答案 1 :(得分:0)

  • ./gradlew lintDebug将使用您的主要资源运行lint并进行调试。
  • ./gradlew lintRelease将使用您的主要来源运行lint并发布。
  • ./gradlew lint将运行所有变体。
  • ./gradlew lintFlavor1Debug将使用您的主要来源和flavor1的调试源运行lint。

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

在本地我通常只使用./gradlew lintDebug和CI在后台运行我运行完整套件./gradlew lint