Android的Proguard问题 – 仍然得到“java.io.IOException:无法处理类…”错误时,跳过混淆

我正在Android Studio中构build一个带有proguard的android应用程序,我的项目中有一个库jar(na.jar),我想避免混淆和预validation,因为na.jar中的一些类在构build过程中给我提供了错误。 所以在我的proguardconfiguration文件中,我有以下选项

-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.** { *; } 

不过,在构build过程中,我仍然收到以下有关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仍然读取类和jar,即使混淆跳过? 我是使用proguard来构buildandroid应用程序的新手。

更新#1

 -dontpreverify -dontoptimize -dontshrink -keep class com.na.** { *; } -keep interface com.na.** { *; } -keep class org.json.** { *; } -keep interface org.json.** { *; } 

Solutions Collecting From Web of "Android的Proguard问题 – 仍然得到“java.io.IOException:无法处理类…”错误时,跳过混淆"

我也有问题,但我发现下面的代码从git hub更有用。

Build.grade

 buildscript { repositories { mavenCentral() maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } } dependencies { classpath 'com.android.tools.build:gradle:0.9.+' classpath 'com.squareup.gradle:gradle-android-test-plugin:0.9.1-SNAPSHOT' } } apply plugin: 'android' apply plugin: 'android-test' repositories { mavenCentral() maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } } android { compileSdkVersion 19 buildToolsVersion "19.1.0" defaultConfig { minSdkVersion 9 targetSdkVersion 19 } signingConfigs { debug { storeFile file("debug.keystore") } release { storeFile file("project.keystore") storePassword "1234" keyAlias "Project" keyPassword "1234" } } buildTypes { release { debuggable false runProguard true signingConfig signingConfigs.release proguardFile getDefaultProguardFile('proguard-android-optimize.txt') } } productFlavors { defaultFlavor { proguardFile 'proguard-rules.txt' } } sourceSets { main { java.srcDirs = ['src/main/java', 'src-gen/main/java'] } instrumentTest.setRoot('src/test') } } dependencies { compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar' compile 'com.android.support:support-v4:19.1.+' compile 'de.greenrobot:greendao:1.3.7' compile 'com.google.android.gms:play-services:4.4.52' testCompile 'junit:junit:4.10' testCompile 'org.robolectric:robolectric:2.1.+' testCompile 'com.squareup:fest-android:1.0.+' instrumentTestCompile 'junit:junit:4.10' instrumentTestCompile 'org.robolectric:robolectric:2.1.+' instrumentTestCompile 'com.squareup:fest-android:1.0.+' } task wrapper(type: Wrapper) { gradleVersion = '1.8' } 

亲守卫规则

 #################################################################################################### #################################################################################################### #################################################################################################### ######################################### PROGUARD ################################################# #################################################################################################### #################################################################################################### #################################################################################################### # This is a configuration file for ProGuard. # http://proguard.sourceforge.net/index.html#manual/usage.html -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -verbose # Optimization is turned off by default. Dex does not like code run # through the ProGuard optimize and preverify steps (and performs some # of these optimizations on its own). #-dontoptimize #-dontpreverify # If you want to enable optimization, you should include the # following: -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* -optimizationpasses 5 -allowaccessmodification # # Note that you cannot just include these flags in your own # configuration file; if you are including this file, optimization # will be turned off. You'll need to either edit this file, or # duplicate the contents of this file and remove the include of this # file from your project's proguard.config path property. -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgent -keep public class * extends android.preference.Preference -keep public class * extends android.support.v4.app.Fragment -keep public class * extends android.support.v4.app.DialogFragment -keep public class * extends com.actionbarsherlock.app.SherlockListFragment -keep public class * extends com.actionbarsherlock.app.SherlockFragment -keep public class * extends com.actionbarsherlock.app.SherlockFragmentActivity -keep public class * extends android.app.Fragment -keep public class com.android.vending.licensing.ILicensingService # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames class * { native <methods>; } -keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers class **.R$* { public static <fields>; } -keep class android.support.v4.app.** { *; } -keep interface android.support.v4.app.** { *; } -keep class com.actionbarsherlock.** { *; } -keep interface com.actionbarsherlock.** { *; } # The support library contains references to newer platform versions. # Don't warn about those in case this app is linking against an older # platform version. We know about them, and they are safe. -dontwarn android.support.** -dontwarn com.google.ads.** 

尝试这个:

 -dontwarn com.na.** -keep class com.na.** { *; } -keepattributes Signature -keepattributes Exceptions