运行Proguard进行调试构建会忽略更改

时间:2014-04-23 16:42:54

标签: android gradle proguard

当我们遇到可怕的方法计数限制时,我们不得不在开发期间使用Proguard来编译和使用gradle来解释我们的代码。尽管Proguard的工作做得很好并且现在部署应用程序,但代码更改似乎不再适用。

首次启用Proguard后,它始终构建并部署第一个版本。唯一的解决方法是在构建之前进行清理(即执行gradle clean任务)。然后拾取所有更改。然而,清洁和完整构建大约需要5分钟,所以这不是真正的替代方案。 Andriod Gradle插件版本为0.9.2。

我无法找到有关此问题的任何内容,所以也许有人可以帮助我们。

编辑:奇怪的是,在检测到更改后,compileDebugJava任务 实际执行了,但它们不知何故不会落在生成的APK中:

Executing task ':MyApp:compileDebugJava' (up-to-date check took 0.03 secs) due to:
Input file /Users/ubuntudroid/projects/git/myapp/code/MyApp/build/exploded-aar/code/CoreLib/unspecified/classes.jar has changed.
Compiling with JDK Java compiler API.
:MyApp:compileDebugJava (Thread[Daemon,5,main]) completed. Took 0.529 secs.
:MyApp:proguardDebug (Thread[Daemon,5,main]) started.
:MyApp:proguardDebug
Skipping task ':MyApp:proguardDebug' as it is up-to-date (took 0.011 secs).
:MyApp:proguardDebug UP-TO-DATE
:MyApp:proguardDebug (Thread[Daemon,5,main]) completed. Took 0.013 secs.
:MyApp:dexDebug (Thread[Daemon,5,main]) started.
:MyApp:dexDebug
Skipping task ':MyApp:dexDebug' as it is up-to-date (took 0.0010 secs).
:MyApp:dexDebug UP-TO-DATE
:MyApp:dexDebug (Thread[Daemon,5,main]) completed. Took 0.0030 secs.

我认为这是由于proguardDebug任务执行而不是并最终导致dexDebug任务无法作为{{1}生成的优化代码运行任务是从缓存中获取的。但为什么proguardDebug任务已经是最新的?

1 个答案:

答案 0 :(得分:1)

好的,确保在组装之前始终清除Proguard生成的文件。这是必要的,因为Proguard Gradle插件提供的-forceprocessing标志不幸没有任何效果。

android.buildTypes.all{ buildType ->
    task "${buildType.name}CleanProguardCache" (type: Delete)
    "${buildType.name}CleanProguardCache" {
        description = 'Cleans the Proguard cache...'
        delete 'build/classes-proguard', 'build/proguard'
    }

    tasks.getByPath(":${project.name}:assemble${buildType.name.capitalize()}").dependsOn "${buildType.name}CleanProguardCache"
}

clean任务适用于所有构建类型,如解释here

编辑:正如Xavier Ducrohet指出here,Proguard任务设置中似乎存在导致所述问题的错误。该修复程序将成为下一个Android Gradle插件版本的一部分。

编辑2:正如所承诺的,此错误已在Android Gradle Plugin 0.10.0中得到修复。因此,此插件版本的解决方法已过时。