Android 使用ProGuard会导致ClassNotFoundException

Android 使用ProGuard会导致ClassNotFoundException,android,proguard,classnotfoundexception,Android,Proguard,Classnotfoundexception,我已使用ProGuand进行版本构建。启动时,我收到以下错误: Class not found when unmarshalling: [myPackage.A] java.lang.ClassNotFoundException: [myPackage.A] at java.lang.Class.classForName(Nati

我已使用ProGuand进行版本构建。启动时,我收到以下错误:

Class not found when unmarshalling: [myPackage.A]
                                        java.lang.ClassNotFoundException: [myPackage.A]
                                            at java.lang.Class.classForName(Native Method)
                                            at java.lang.Class.forName(Class.java:308)
                                            at java.lang.Class.forName(Class.java:272)
                                            at android.os.Parcel.readParcelableCreator(Parcel.java:2275)
                                            at android.os.Parcel.readParcelable(Parcel.java:2239)
                                            at android.os.Parcel.readValue(Parcel.java:2146)
                                            at android.os.Parcel.readArrayMapInternal(Parcel.java:2479)
                                            at android.os.BaseBundle.unparcel(BaseBundle.java:221)
                                            at android.os.BaseBundle.getString(BaseBundle.java:918)
                                            at android.content.Intent.getStringExtra(Intent.java:5386)
                                            at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1780)
                                            at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1334)
                                            at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4801)
                                            at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4638)
                                            at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:142)
                                            at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3138)
                                            at android.os.Binder.execTransact(Binder.java:446)
                                         Caused by: java.lang.ClassNotFoundException: Didn't find class "[myPackage.A]" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
                                            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
                                            at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
                                            at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
                                            at java.lang.Class.classForName(Native Method) 
                                            at java.lang.Class.forName(Class.java:308) 
                                            at java.lang.Class.forName(Class.java:272) 
                                            at android.os.Parcel.readParcelableCreator(Parcel.java:2275) 
                                            at android.os.Parcel.readParcelable(Parcel.java:2239) 
                                            at android.os.Parcel.readValue(Parcel.java:2146) 
                                            at android.os.Parcel.readArrayMapInternal(Parcel.java:2479) 
                                            at android.os.BaseBundle.unparcel(BaseBundle.java:221) 
                                            at android.os.BaseBundle.getString(BaseBundle.java:918) 
                                            at android.content.Intent.getStringExtra(Intent.java:5386) 
                                            at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1780) 
                                            at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1334) 
                                            at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4801) 
                                            at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4638) 
                                            at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:142) 
                                            at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3138) 
                                            at android.os.Binder.execTransact(Binder.java:446) 
                                            Suppressed: java.lang.ClassNotFoundException: [myPackage.A]
                                            at java.lang.Class.classForName(Native Method)
                                            at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
                                            at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
                                            at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
                                                    ... 18 more
                                         Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
该类是可分包的,因为它在某一点上是使用AndroidAnnotations注入的。它看起来是这样的(有两个内部类也可分包):

公共A类实现可包裹{
公共静态最终包裹。创建者。。。。
静态类B实现了Parcelable{
公共静态最终包裹。创建者。。。。
}
静态类C实现了可打包的{
公共静态最终包裹。创建者。。。。
}
}
Pro Guard规则如下所示:

 -optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keepattributes **

-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# - reuqired to keep JS methods active
-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}
-keep class * implements android.os.Parcelable {
   public static final android.os.Parcelable$Creator *;
}
#keep libraries
-keep class com.viewpagerindicator.**  { *; }
-keep class android.support.** {*;}
-keep class com.facebook.** {*;}


# Don't warn
-dontwarn android.support.**
-dontwarn com.actionbarsherlock.internal.**
-dontwarn com.viewpagerindicator.**
-dontwarn com.androidannotations.**
-dontwarn com.fasterxml.jackson.**
-dontwarn com.google.android.gms.**
-dontwarn com.facebook.**
-dontwarn com.j256.ormlite.**
-dontwarn org.w3c.**
-dontwarn it.sephiroth.android.library.imagezoom.**
-dontwarn org.androidannotations.**
-dontwarn com.google.zxing.**


# assumenosideffects
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** i(...);
    public static *** w(...);
    public static *** e(...);
    public static *** wtf(...);
}
-优化过程5
-dontusemixedcaseclassnames
-DontskipnonPublicLibraryClass
-不要翻转
-冗长的
-优化!代码/简化/算术,!字段/*,!类/合并/*
-记述**
-保持公共类com.google.vending.licensing.ILicensingService
-保持公共类com.android.vending.licensing.ILicensingService
#-reuqired保持JS方法的活动状态
-keepclassmembers类*{
@android.webkit.JavascriptInterface;
}
-KeepClassSwithMemberNames类*{
本地人;
}
-keepclassmembers公共类*扩展了android.view.view{
无效集*(***);
***得到*();
}
-keepclassmembers类*扩展了android.app.Activity{
public void*(android.view.view);
}
-keepclassmembers枚举*{
公共静态**[]值();
公共静态**valueOf(java.lang.String);
}
-keepclassmembers类*实现android.os.Parcelable{
公开静态最终android.os.Parcelable$Creator;
}
-keep class*实现android.os.Parcelable{
公开静态最终android.os.Parcelable$Creator*;
}
#保留图书馆
-保留类com.viewpagerindicator.*{*;}
-保留类android.support.*{*;}
-保持类com.facebook.*{*;}
#不要警告
-dontwarn android.support**
-dontwarn com.actionbarsherlock.internal**
-dontwarn com.viewpagerindicator**
-dontwarn com.android注释**
-dontwarn com.fasterxml.jackson**
-dontwarn com.google.android.gms**
-dontwarn com.facebook**
-dontwarn com.j256.ormlite**
-dontwarn org.w3c**
-dontwarn it.sephiroth.android.library.imagezoom**
-dontwarn org.android注释**
-dontwarn com.google.zxing**
#假设缺陷
-assumenosideeffects类android.util.Log{
公共静态***d(…);
公共静态***v(…);
公共静态***i(…);
公共静态***w(…);
公共静态***e(…);
公共静态***wtf(…);
}

我试图防止包中的所有类被混淆,但它会引发相同的错误。如果我关闭ProGuard,错误就消失了。我对ProGuard一点也不熟悉。我添加了keep类/类成员,它们实现了Parcelable,但仍然是一样的。

添加一条新规则-
-keep class MyPackage.a.*{*;}
?尝试过吗?事实上,我尝试过将所有类都保存在包中,但仍然是相同的。然后,第二次尝试,让我们尝试一下这个
-dontobfuscate-optimizations!代码/简化/算术,!字段/*,!类/合并/*,!code/allocation/variable
应该跳过模糊处理过程-如果未模糊处理的代码工作正常,而模糊处理的代码工作不正常,解决方法是告诉ProGuard不要吃掉部分或全部类:/Strange。即使没有模糊处理,也会发生相同的异常。您的链接引用与案例无关,但是感谢您的支持。添加一条新规则-
-保留类MyPackage.a.*{*}
?确实尝试过,事实上我尝试过将所有类保留在我的包中,并且仍然保持不变。然后,为了第二次尝试,让我们尝试这个
-dontobfuscate-优化!代码/简化/算术,!字段/*,!类/合并/*,!code/allocation/variable
应该跳过模糊处理过程-如果未模糊处理的代码工作正常,而模糊处理的代码工作不正常,解决方法是告诉ProGuard不要吃掉部分或全部类:/Strange。即使没有模糊处理,也会发生相同的异常。您的链接引用与案例无关,但是谢谢你的支持。
 -optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keepattributes **

-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# - reuqired to keep JS methods active
-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}
-keep class * implements android.os.Parcelable {
   public static final android.os.Parcelable$Creator *;
}
#keep libraries
-keep class com.viewpagerindicator.**  { *; }
-keep class android.support.** {*;}
-keep class com.facebook.** {*;}


# Don't warn
-dontwarn android.support.**
-dontwarn com.actionbarsherlock.internal.**
-dontwarn com.viewpagerindicator.**
-dontwarn com.androidannotations.**
-dontwarn com.fasterxml.jackson.**
-dontwarn com.google.android.gms.**
-dontwarn com.facebook.**
-dontwarn com.j256.ormlite.**
-dontwarn org.w3c.**
-dontwarn it.sephiroth.android.library.imagezoom.**
-dontwarn org.androidannotations.**
-dontwarn com.google.zxing.**


# assumenosideffects
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** i(...);
    public static *** w(...);
    public static *** e(...);
    public static *** wtf(...);
}