【发布时间】:2016-04-07 16:32:40
【问题描述】:
我正在 Android Studio 中使用 proguard 构建一个 android 应用程序,我的项目有一个库 jar (na.jar),我想跳过混淆和预验证,因为 na.jar 中的某些类在构建过程中给我错误.所以在我的 proguard 配置文件中,我有以下选项
-dontpreverify
# com.na, org.json are packages in na.jar, don't obfuscate the code in these packages
-keep class com.na.** { *; }
-keep interface com.na.** { *; }
-keep class org.json.** { *; }
-keep interface org.json.** { *; }
但是,在构建过程中,我仍然收到与 na.jar 中的错误类相关的以下错误。
Caused by: java.io.IOException: Can't read [C:\StudioProjects\PBActivity\pBActivity\libs\na.jar(;;;;;;!META-INF/MANIFEST.MF)] (Can't process class [com/na/util/BinConverter.class] (256))
at proguard.InputReader.readInput(InputReader.java:188)
at proguard.InputReader.readInput(InputReader.java:158)
at proguard.InputReader.readInput(InputReader.java:136)
at proguard.InputReader.execute(InputReader.java:66)
at proguard.ProGuard.readInput(ProGuard.java:207)
at proguard.ProGuard.execute(ProGuard.java:81)
at proguard.gradle.ProGuardTask.proguard(ProGuardTask.java:1074)
at com.android.build.gradle.tasks.AndroidProGuardTask.proguard(AndroidProGuardTask.java:87)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
... 62 more
Caused by: java.io.IOException: Can't process class [com/na/util/BinConverter.class] (256)
at proguard.io.ClassReader.read(ClassReader.java:112)
at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
at proguard.io.JarReader.read(JarReader.java:65)
at proguard.io.DirectoryPump.readFiles(DirectoryPump.java:65)
at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:53)
at proguard.InputReader.readInput(InputReader.java:184)
... 70 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 256
at proguard.classfile.ProgramClass.getString(ProgramClass.java:116)
at proguard.classfile.io.ProgramClassReader.createAttribute(ProgramClassReader.java:990)
at proguard.classfile.io.ProgramClassReader.visitProgramMethod(ProgramClassReader.java:206)
at proguard.classfile.io.ProgramClassReader.visitProgramClass(ProgramClassReader.java:149)
at proguard.classfile.ProgramClass.accept(ProgramClass.java:358)
at proguard.io.ClassReader.read(ClassReader.java:91)
... 77 more
那么即使跳过了混淆,proguard 仍然会读取类和罐子吗?我是使用 proguard 构建 android 应用程序的新手。
更新 #1
-dontpreverify
-dontoptimize
-dontshrink
-keep class com.na.** { *; }
-keep interface com.na.** { *; }
-keep class org.json.** { *; }
-keep interface org.json.** { *; }
【问题讨论】:
-
是的,混淆只是 ProGuard 所做工作的一部分——它将继续对库执行其余部分,例如删除未使用的代码等。
-
Proguard 是否可以跳过读取/处理库 jar (na.jar)?
-
您可以通过使用以下方法添加过滤器来禁用优化:-optimizations(指定正则表达式前面有一个 ! 表示不应优化这些类型/包)。我猜这个列表会和你的“保留”列表一样。
-
我只需要混淆我的代码,除了库 jar (na.jar)。所以我在我的配置文件中添加了 -dontoptimize 和 -dontshrink 。但是,上述错误在构建过程中仍然存在。
标签: java android indexoutofboundsexception ioexception android-proguard