我正在尝试将ProGuard用于使用Android Studio 0.8.14构建的Android项目,以减少apk大小。如果没有ProGuard,项目将构建并快乐地运行。项目的结构是我们有很多apk文件,每个参考至少2个aar文件,这就是我们如何在apks之间共享算法。 aars参考jar文件,其中一个是joda时间,仅供参考。
我正在尝试为其中一个apk模块启用ProGuard,我这样做:
对于build.gradle中的apk项目,我为调试版本设置了runProguard为true。
我已经指定了 -dontwarn org.joda.convert。** 摆脱一些jodatime警告,例如
警告:org.joda.time.DateMidnight:无法找到引用的类 org.joda.convert.FromString
(我使用相同的方法隐藏了其他库的其他警告。)
我还指定了-dontobfuscate,因为我的主要目标是减少apk大小,但如果我发表评论没有任何改变。
然后我跑
gradlew.bat -p {projectname} assembleDebug clean --debug --stacktrace
结果是这个堆栈跟踪(堆栈跟踪更长,我相信这是更有趣的部分,如果你想看到完整的堆栈跟踪,请告诉我)。
12:44:29.019 [ERROR] [org.gradle.BuildExceptionReporter]引起: java.io.IOException:无法读取 [C:\项目\ Marvin2 \ InCabAndroid \ incabvehicleinspection \建立\中间体\分解-AAR \ InCabAndroid \ AndroidCoreLib \未指定\库\乔达 - 时间 - 2.5.jar(;;;;;; META-INF / MANIFEST.MF )] (重复的zip条目 [乔达 - 时间 - 2.5.jar:组织/乔达/时间/碱/ AbstractDateTime.class]) 12:44:29.020 [ERROR] [org.gradle.BuildExceptionReporter] at proguard.InputReader.readInput(InputReader.java:232)12:44:29.020 [错误] [org.gradle.BuildExceptionReporter] at proguard.InputReader.readInput(InputReader.java:202)12:44:29.020 [错误] [org.gradle.BuildExceptionReporter] at proguard.OutputWriter.writeOutput(OutputWriter.java:253)12:44:29.020 [错误] [org.gradle.BuildExceptionReporter] ... 58更多12:44:29.020 [错误] [org.gradle.BuildExceptionReporter]引起: java.io.IOException:重复的zip条目 [乔达 - 时间 - 2.5.jar:组织/乔达/时间/碱/ AbstractDateTime.class] 12:44:29.020 [ERROR] [org.gradle.BuildExceptionReporter] at proguard.io.JarWriter.getOutputStream(JarWriter.java:139)12:44:29.020 [错误] [org.gradle.BuildExceptionReporter] at proguard.io.FilteredDataEntryWriter.getOutputStream(FilteredDataEntryWriter.java:105) 12:44:29.020 [ERROR] [org.gradle.BuildExceptionReporter] at proguard.io.FilteredDataEntryWriter.getOutputStream(FilteredDataEntryWriter.java:105) 12:44:29.020 [ERROR] [org.gradle.BuildExceptionReporter] at proguard.io.FilteredDataEntryWriter.getOutputStream(FilteredDataEntryWriter.java:92) 12:44:29.020 [ERROR] [org.gradle.BuildExceptionReporter] at proguard.io.ClassRewriter.read(ClassRewriter.java:68)12:44:29.020 [错误] [org.gradle.BuildExceptionReporter] at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87) 12:44:29.020 [ERROR] [org.gradle.BuildExceptionReporter] at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87) 12:44:29.021 [错误] [org.gradle.BuildExceptionReporter] at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87) 12:44:29.021 [错误] [org.gradle.BuildExceptionReporter] at proguard.io.JarReader.read(JarReader.java:65)12:44:29.021 [错误] [org.gradle.BuildExceptionReporter] at proguard.io.DirectoryPump.readFiles(DirectoryPump.java:65) 12:44:29.021 [错误] [org.gradle.BuildExceptionReporter] at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:53) 12:44:29.021 [错误] [org.gradle.BuildExceptionReporter] at proguard.InputReader.readInput(InputReader.java:228)12:44:29.021 [错误] [org.gradle.BuildExceptionReporter] ... 60多个
我有一种感觉,这个错误是通过aar模块加上apk本身引入joda时间的结果,我只是不知道如何解决这个问题。
对于重复的zip输入,ProGuard手册说
标准的Android构建过程会自动指定输入 罐子给你。可能没有一种简单的方法可以过滤它们以进行删除 这些警告。您可以手动删除重复的资源文件 来自输入和库。
对于课程,在ProGuard手册中也有类似的陈述:
标准的Android构建过程会自动指定输入 罐子给你。可能没有一种简单的方法可以过滤它们以进行删除 这些笔记。您可以从您的手动中删除重复的类 库。
所以我对下一步做什么有点失落。如果有经验的ProGuard有想法,请与我分享?谢谢。