【问题标题】:Gradle failed to build when proguard is activated激活 proguard 时 Gradle 构建失败
【发布时间】:2013-08-31 03:55:43
【问题描述】:

我正在尝试使用 Gradle 发布我的 Android 应用程序。

一切正常,包括./gradlew clean build assembleRelease 命令。

但是,一旦我尝试使用 proguard,Gradle 就无法构建发布版本。

这是我得到的错误(堆栈跟踪已激活):

...
:OSkin:validateDebugSigning
:OSkin:packageDebug
:OSkin:assembleDebug
:OSkin:prepareReleaseDependencies
:OSkin:compileReleaseAidl
:OSkin:generateReleaseBuildConfig
:OSkin:mergeReleaseAssets
:OSkin:compileReleaseRenderscript
:OSkin:mergeReleaseResources
:OSkin:processReleaseManifest
:OSkin:processReleaseResources
:OSkin:compileRelease UP-TO-DATE
:OSkin:proguardRelease
ProGuard, version 4.9
Reading input...
Reading program directory [/home/geantvert/workspace/OSkinProject/OSkin/build/classes/release]
:OSkin:proguardRelease FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':OSkin:proguardRelease'.
> Can't read [/home/geantvert/workspace/OSkinProject/OSkin/build/classes/release] (No such file or directory)

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':OSkin:proguardRelease'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:286)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:80)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTaskWithCacheLock(AbstractTaskPlanExecutor.java:58)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:47)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$1.run(DefaultTaskPlanExecutor.java:33)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:214)
    at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:276)
    at org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunningOperation(DefaultPersistentDirectoryStore.java:142)
    at org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.longRunningOperation(DefaultTaskArtifactStateCacheAccess.java:78)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:31)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:89)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
    at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:54)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:166)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:113)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:81)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:64)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
    at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:50)
    at org.gradle.api.internal.Actions$RunnableActionAdapter.execute(Actions.java:171)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:201)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:174)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:170)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:139)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
    at org.gradle.launcher.Main.doAction(Main.java:48)
    at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
    at org.gradle.launcher.Main.main(Main.java:39)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:50)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:32)
    at org.gradle.launcher.GradleMain.main(GradleMain.java:26)
    at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:33)
    at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:130)
    at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
Caused by: java.io.IOException: Can't read [/home/geantvert/workspace/OSkinProject/OSkin/build/classes/release] (No such file or directory)
    at proguard.InputReader.readInput(InputReader.java:230)
    at proguard.InputReader.readInput(InputReader.java:200)
    at proguard.InputReader.readInput(InputReader.java:178)
    at proguard.InputReader.execute(InputReader.java:78)
    at proguard.ProGuard.readInput(ProGuard.java:197)
    at proguard.ProGuard.execute(ProGuard.java:79)
    at proguard.gradle.ProGuardTask.proguard(ProGuardTask.java:958)
    at org.gradle.api.internal.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:248)
    at org.gradle.api.internal.BeanDynamicObject.invokeMethod(BeanDynamicObject.java:136)
    at org.gradle.api.internal.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:147)
    at proguard.gradle.ProGuardTask_Decorated.invokeMethod(Unknown Source)
    at org.gradle.api.internal.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:248)
    at org.gradle.api.internal.BeanDynamicObject.invokeMethod(BeanDynamicObject.java:136)
    at org.gradle.api.internal.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:147)
    at proguard.gradle.ProGuardTask_Decorated.invokeMethod(Unknown Source)
    at org.gradle.util.ReflectionUtil.invoke(ReflectionUtil.groovy:23)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:220)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:213)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:202)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:530)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:513)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
    ... 53 more
Caused by: java.io.IOException: No such file or directory
    at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:50)
    at proguard.InputReader.readInput(InputReader.java:226)
    ... 75 more


BUILD FAILED

Total time: 42.363 secs

这是我的 gradle 文件:

buildscript {
    repositories {
        mavenCentral()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
    maven {
        url 'http://www.bugsense.com/gradle/'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')

    compile 'com.google.guava:guava:14.+'
    compile 'com.google.code.gson:gson:2.+'
    compile 'org.zeroturnaround:zt-zip:1.+'
    compile 'com.github.japgolly.android:svg-android:2.+'
    compile('de.keyboardsurfer.android.widget:crouton:1.8.1') {
        exclude module: 'support-v4'
        compile 'com.android.support:support-v4:18.+'
    }
    compile 'com.squareup:otto:1.3.4'
    compile 'com.squareup.okhttp:okhttp:1.2.+'
    compile 'com.squareup.picasso:picasso:1+'
    compile 'com.bugsense.trace:bugsense:3.5'

    //Google Drive SDK
    compile 'com.google.android.gms:play-services:3.+'
    compile 'com.google.apis:google-api-services-drive:v2+'

    compile('com.google.api-client:google-api-client:1.+') {
        exclude(group: 'xpp3', module: 'xpp3')
        exclude(group: 'org.apache.httpcomponents', module: 'httpclient')
        exclude(group: 'junit', module: 'junit')
        exclude(group: 'com.google.android', module: 'android')
    }
    compile('com.google.api-client:google-api-client-android:1.+') {
        exclude group: 'xpp3'
        exclude group: 'com.google.android.google-play-services'
    }
    compile('com.google.http-client:google-http-client-jackson:1.+') {
        exclude group: 'xpp3'
    }
    compile('com.google.http-client:google-http-client-gson:1.+') {
        exclude group: 'xpp3'
    }

    compile 'com.google.apis:google-api-services-plus:v1+'

    compile 'com.netflix.rxjava:rxjava-android:+'

    compile('com.github.frankiesardo:icepick:2+') {
        exclude module: 'support-v4'
        compile 'com.android.support:support-v4:18.+'
    }

//    compile (group: 'com.google.apis', name: 'google-api-services-youtube', version: 'v3-rev56-1.15.0-rc')
}

android {
    compileSdkVersion 18
    buildToolsVersion "18.0.1"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 18
    }
    signingConfigs {
        release {
                    storeFile file('path_to_file')
                    storePassword '***'
                    keyAlias '***'
                    keyPassword '***'
                }
    }

    buildTypes
            {
                release {
                    runProguard true
                    proguardFile getDefaultProguardFile('proguard-android.txt')
                    proguardFile 'proguard-project.txt'
                    signingConfig signingConfigs.release 
               }
            }
}

有人知道问题出在哪里吗?

问候

编辑:./gradlew clean assembleDebug 完美运行!如果 runProguard 设置为关闭,./gradlew clean build assembleRelease 可以工作。所以这是一个 100% 的 proGuard 问题。

【问题讨论】:

  • 我实际上遇到了 proguard 的问题,感谢您的代码 sn-p 它导致我将 proguard-project.txt 添加到我的 build.gradle 并解决了我的问题。我希望 android gradle 文档在示例中有它。
  • 为什么你的构建文件中有两次 mavenCentral()?
  • 一个是插件的,一个是依赖的。
  • 对于其他有同样问题的人:确保复制上述版本 buildType - 特别是关于 proguardFile 并确保在模块目录中有 proguard-project.txt 并包含来自在里面回答。我在那个领域犯了一个错误,想知道为什么 -dontwarn 语句没有做任何事情......

标签: android gradle proguard


【解决方案1】:

过去几个小时我一直在与这个问题作斗争。基本上,如果有任何警告,proguard 任务将停止执行。您可以通过将-d 添加到构建中来查看Proguard 警告和堆栈跟踪(如:gradle clean assembleRelease -d)。请注意,堆栈跟踪提到“请先更正上述警告”。

为了使构建能够通过 proguard,我必须将它抱怨的包的 -dontwarn 条目添加到我的 proguard-project.txt 文件中。大致如下:

-dontwarn org.apache.lang.**

...等

所以简单地说...按照堆栈跟踪的指示去做。修复警告! :)

顺便说一句,我很抱歉,因为我现在认识到原始帖子中的堆栈跟踪与我遇到的不太一样。不过,我确实觉得我的回答很有帮助,因为很明显我最终来到这里试图寻找我的问题的答案。

【讨论】:

  • 是的,对我来说同样的事情......这应该是解决方案,而不是上面的那个。这些可以放在您的 proguard-project.txt 文件中,然后将其添加到您的发布部分。我的看起来像:-dontwarn android.webkit.* -dontwarn org.apache.** -dontwarn com.newrelic.**
  • 不错。 :) 多谢!我已经实现了“Samsung Pass SDK”,所以我必须添加 -dontwarn com.samsung.** 以防万一其他人在那里挣扎..
  • 我认为这是我需要的解决方案,有什么例子可以实现 -dontwarn org.apache.lang?它在 proguard-project.txt 之后的 gradle 上吗?
【解决方案2】:

嗯,我不明白为什么,但如果我用相同的参数(proguard...)启动两次相同的任务,第二次似乎是好的。

但是如果第二个参数改变了,任务就会失败。

希望对某人有所帮助。

问候

【讨论】:

    【解决方案3】:

    您可以在 proguard-project.txt 中使用 -ignorewarnings,这样您就不需要指定每个包。

    【讨论】:

      【解决方案4】:

      检查您在构建 gradle 中的 minifyEnabled 是否设置为“false”。因为当它是“true”时,调试器在生成签名 apk 时会报错。

      【讨论】:

      • 签名的 APK 调试没有问题。但如果你不使用minifyEnabled,那么你很快就需要multiDexEnabled——这比Proguard 更痛苦。
      • Multidex 在使用 rxjava、retrolambda 和 kotlin 以及其他依赖项时比 proguard 的工作量要少得多(只需进行一些更改)......只需将其放在那里。话虽如此,我们两者都使用。如果您完全关心应用程序的安全性并且出于性能原因想要删除日志语句,Proguard 对于发布版本非常重要。我花了数周时间来解决 Proguard 的问题,而切换到 multidex 只需要 10 分钟。
      • 如果您正在修改一些帖子 - 做一些有用的事情。 “请帮忙”将被拒绝
      • 这可以防止混淆。不是解决方案。
      猜你喜欢
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 2014-03-30
      • 1970-01-01
      相关资源
      最近更新 更多