2013-08-28 8 views
49

Android 애플리케이션을 Gradle과 함께 출시하려고합니다.가드가 활성화 될 때 빌드가 실패했습니다

./gradlew clean build assembleRelease 명령을 포함하여 모든 것이 작동합니다.

그러나, 내가 프로 가드를 사용하려고하자마자 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가 off로 설정된 경우 ./gradlew clean build assembleRelease이 작동합니다. 그래서 100 % 프로 가드 문제입니다.

+2

실제로 proguard에 문제가 있었고 코드 스 니펫 덕분에 proguard-project.txt를 build.gradle에 추가하여 문제를 해결할 수있었습니다. 나는 안드로이드 gradle 워드 프로세서가 예제에서 가지고 있었으면 좋겠다. – withoutclass

+0

왜 빌드 파일에 mavenCentral()이 두 번 있습니까? –

+0

하나는 플러그인 용이고 하나는 종속성 용입니다. – pommedeterresautee

답변

73

저는 지난 몇 시간 동안이 문제를 다뤘습니다. 기본적으로 proguard 작업은 경고가있는 경우 실행을 중단합니다. 빌드에 -d을 추가하여 Proguard 경고 및 스택 추적을 볼 수 있습니다 (예 : gradle clean assembleRelease -d). stacktrace는 "위의 경고를 먼저 수정하십시오."라고 언급합니다.

빌드가 proguard를 통과 할 수있게하려면 proguard-project.txt 파일에 대해 불평하고있는 패키지에 대해 -dontwarn 항목을 추가해야했습니다. 의 라인을 따라 뭔가 :

-dontwarn org.apache.lang.** 

... 등

그래서 간단히 말해서

... 스택 트레이스는 당신이해야 할 지시로 않습니다. 경고를 수정하십시오! :)

나는 원래 게시물의 stacktrace가 내가 만났던 것과 상당히 다르다는 것을 알게되어 사과드립니다. 그러나 분명히 내 문제에 대한 답변을 찾으려고 여기에서 끝났기 때문에 내 대답이 도움이된다고 느낍니다.

+2

네, 정확히 똑같은 일은 ... 위의 해결책이 아니라 위의 것이어야합니다. 이것들은 proguard-project.txt 파일에 들어갈 수 있으며 릴리스 섹션의 파일에 추가하면됩니다. 내 모습은 다음과 같습니다. -dontwarn android.webkit. * -dontwarn org.apache. ** -dontwarn com.newrelic. ** – occasl

+2

Nice. :) 고마워요! 나는 "삼성 패스 SDK"를 구현하여 -dontwarn com.samsung을 추가해야만했다. ** 만약 누군가 다른 사람이 고생하고 있다면 .. –

2

흠, 나는 왜 그런지 모르겠다.하지만 두 번 같은 매개 변수 (프로 가드 ...)로 두 번 시작하면 두 번째 것이 좋다.

그러나 두 번째 매개 변수가 변경되면 작업이 실패합니다.

누군가 도움이되기를 바랍니다.

감사합니다.

-10

minifyEnabled (빌드 기준)이 "false"으로 설정되어 있는지 확인하십시오. 왜냐하면 서명 된 apk을 생성하는 동안 "true"디버거가 될 것이므로 오류가 발생합니다.

+1

서명 된 APK는 디버깅에 문제가 없다. 그러나 만약 당신이'minifyEnabled'를하지 않는다면'multiDexEnabled'가 빨리 필요합니다 - 이것은 Proguard보다 더 큰 고통입니다. – Martin

+0

Multx는 rxjava와 retrolambda, kotlin 및 기타 종속성을 사용할 때 proguard가 (단지 몇 가지 변경이 필요함) 노력할 수있는 것보다 적은 노력입니다 ... 그냥 거기에 넣으십시오. 즉, 우리는 둘 다 사용합니다. Proguard는 앱 보안에 신경 쓰고 성능상의 이유로 로그 문을 제거하려는 경우 릴리스 빌드에 중요합니다. 저는 WEEKS를 Proguard 문제를 추적하는 데 보냈습니다. 반면 multidex 로의 전환은 문자 그대로 10 분의 노력이었습니다. – ChrisPrime

관련 문제