Android 打包编译报错:Execution failed for task ‘:mobile:transformClassesAndResourcesWithProguardForRelease’.
我在开发过程中从没有报这个错,但是当我要发布应用的时候突然打包失败,日志并没有指出实在什么地方,只是说找不到类,下面是具体的日志:
Execution failed for task ':mobile:transformClassesAndResourcesWithProguardForRelease'.
...
Caused by: java.lang.RuntimeException: Job failed, see logs for details
at com.android.build.gradle.internal.transforms.ProGuardTransform.transform(ProGuardTransform.java:209)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:239)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:235)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:230)
...
Caused by: java.io.IOException: Can't write [D:\lijing\sgreen\mobile\build\intermediates\transforms\proguard\release\0.jar]
(Can't read [D:\lijing\sgreen\mobile\build\intermediates\javac\release\compileReleaseJavaWithJavac\classes(;;;;;;;**.class)]
(Can't read [com] (Can't read [xh] (Can't read [sgreen] (Can't read [BuildConfig.class] (Duplicate jar entry [com/xh/sgreen/a.class]))))))
at proguard.OutputWriter.writeOutput(OutputWriter.java:202)
...
Caused by: java.io.IOException: Duplicate jar entry [com/xh/sgreen/a.class]
at proguard.io.ZipOutput.createOutputStream(ZipOutput.java:155)
at proguard.io.ZipOutput.createOutputStream(ZipOutput.java:120)
at proguard.io.JarWriter.createOutputStream(JarWriter.java:137)
...
一点办法都没有,怎么突然就Can’t read呢?仔细阅读log,发现一只可疑单词Duplicate,提示说 Duplicate jar entry [com/xx/xxxx/a.class],意思就是有多个com/xx/xxxx/a.class,于是项目重头到尾检查一下项目,发现我依赖的一个module的包名和项目的包名一致,抱着试一试的想法,把这个module的包名改成别的,咦!解决了,一头雾水,怎么就可以了,我还不知道为啥?
必须要找到原因,不然咋睡也睡不着。
这是在Stack overflow上找的答案,
Ok, I got the solution.
The Why-
I compared the build steps in gradle console at API22(build OK) and API16(build fails). At API22, the console said-
+Instant Run: Proguard is not compatible with instant run. It has been disabled for debug
+Instant Run: Resource shrinker automatically disabled for debug
…and the build was successful. When i disabled InstantRun, it failed on API22 also.
The Reason-
The problem was in proguard configuration. The BuildConfig.class of coolLib.jar was defined to be kept in proguard-project.txt , so it was keeping all the .class files in that package but BuildConfig.class must be modified at build time according to the Main Project.
The Solution-
I removed that -keep statement and it works like a charm.