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



由于我们达到了可怕的方法计数限制,我们被迫在开发过程中使用Proguard来用gradle编译和索引我们的代码。尽管Proguard的工作做得很好,现在部署应用程序也能正常工作,但代码更改似乎不再被注意到。

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

我找不到任何关于这个问题的信息,所以也许这里有人可以帮助我们。

EDIT:奇怪的是,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任务没有执行,并且由于proguardDebug任务产生的优化代码从缓存中获取,因此最终阻止了dexDebug任务的运行。但是为什么proguardDebug任务已经是最新的呢?

好的,通过确保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任务应用于所有构建类型,如这里所解释的。

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

第2版:正如承诺的那样,此错误已在Android Gradle插件0.10.0中修复。因此,此插件版本的解决方法已过时。

相关内容

  • 没有找到相关文章

最新更新