我有一个带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>
答案 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