Android Proguard和Object extends Parcelable-解组时找不到类

Android Proguard和Object extends Parcelable-解组时找不到类,android,proguard,parcelable,Android,Proguard,Parcelable,我正在释放我的apk。在调试模式下,我没有错误。 当我用Proguard签署我的apk时,我的应用程序一直工作到第四个屏幕,在那里我必须处理一个实现Parcelable的值对象类 E/Parcel(811): Class not found when unmarshalling: com.spg.movil.vo.Pdv E/Parcel(811): java.lang.ClassNotFoundException: com.spg.movil.vo.Pdv E/Parcel(811):

我正在释放我的apk。在调试模式下,我没有错误。 当我用Proguard签署我的apk时,我的应用程序一直工作到第四个屏幕,在那里我必须处理一个实现Parcelable的值对象类

 E/Parcel(811): Class not found when unmarshalling: com.spg.movil.vo.Pdv
 E/Parcel(811): java.lang.ClassNotFoundException: com.spg.movil.vo.Pdv
 E/Parcel(811): at java.lang.Class.classForName(Native Method)
 E/Parcel(811): at java.lang.Class.forName(Class.java:251)
 E/Parcel(811): at java.lang.Class.forName(Class.java:216)
 E/Parcel(811): at android.os.Parcel.readParcelableCreator(Parcel.java:2133)
 E/Parcel(811): at android.os.Parcel.readParcelable(Parcel.java:2097)
 E/Parcel(811): at android.os.Parcel.readValue(Parcel.java:2013)
 E/Parcel(811): at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
 E/Parcel(811): at android.os.Bundle.unparcel(Bundle.java:249)
 E/Parcel(811): at android.os.Bundle.getString(Bundle.java:1118)
 E/Parcel(811): at android.content.Intent.getStringExtra(Intent.java:4991)
 E/Parcel(811): at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1353)
 E/Parcel(811): at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:977)
 E/Parcel(811): at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:3936)
 E/Parcel(811): at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:3839)
 E/Parcel(811): at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
 E/Parcel(811): at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2546)
 E/Parcel(811): at android.os.Binder.execTransact(Binder.java:404)
 E/Parcel(811): at dalvik.system.NativeStart.run(Native Method)
 E/Parcel(811): Caused by: java.lang.NoClassDefFoundError: com/spg/movil/vo/Pdv
 E/Parcel(811): ... 18 more
 E/Parcel(811): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.spg.movil.vo.Pdv" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
 E/Parcel(811): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)
 E/Parcel(811): at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
 E/Parcel(811): at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
 E/Parcel(811): ... 18 more
这是我的VO课程:

public class Pdv implements Parcelable {

int id;
int clientId;
String canal;
String formato;
String ciudad;
String region;
int ndeterminante;
String sucursal;
int nielsen;
String tienda;
String calle;
String colonia;
int CP;
int activo;
String cadena;
int estadoId;
String estado;

double latitude;
double longitude;
String telefono;
String contacto;
String horarioIni;
String horarioFin;

Proyecto proyecto;
int idRuta;
int done;
int sincronizado;

// Not include in parcelable
Marker marker;

public Marker getMarker() {
    return marker;
}

public void setMarker(Marker marker) {
    this.marker = marker;
}



@Override
public int describeContents() {
    return 0;
}


public Pdv(int id, int clientId, String canal, String formato, String ciudad, String region, int ndeterminante,
        String sucursal, int nielsen, String tienda, String calle, String colonia, int cP, int activo,
        double latitude, double longitude, String telefono, String contacto, String horarioIni, String horarioFin,
        Proyecto proyecto, int done, int sincronizado, String cadena, String estado) {
    super();
    this.id = id;
    this.clientId = clientId;
    this.canal = canal;
    this.formato = formato;
    this.ciudad = ciudad;
    this.region = region;
    this.ndeterminante = ndeterminante;
    this.sucursal = sucursal;
    this.nielsen = nielsen;
    this.tienda = tienda;
    this.calle = calle;
    this.colonia = colonia;
    this.CP = cP;
    this.cadena = cadena;
    this.estado = estado;
    this.activo = activo;
    this.latitude = latitude;
    this.longitude = longitude;
    this.telefono = telefono;
    this.contacto = contacto;
    this.horarioIni = horarioIni;
    this.horarioFin = horarioFin;
    this.proyecto = proyecto;
    this.done = done;
    this.sincronizado = sincronizado;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeInt(clientId);
    dest.writeString(canal);
    dest.writeString(formato);
    dest.writeString(ciudad);
    dest.writeString(region);
    dest.writeInt(ndeterminante);
    dest.writeString(sucursal);
    dest.writeInt(nielsen);
    dest.writeString(tienda);
    dest.writeString(calle);
    dest.writeString(colonia);
    dest.writeString(cadena);
    dest.writeString(estado);
    dest.writeInt(estadoId);
    dest.writeInt(CP);
    dest.writeInt(activo);
    dest.writeInt(done);
    dest.writeInt(sincronizado);
    dest.writeInt(idRuta);
    dest.writeDouble(latitude);
    dest.writeDouble(longitude);
    dest.writeString(telefono);
    dest.writeString(contacto);
    dest.writeString(horarioIni);
    dest.writeString(horarioFin);
    dest.writeParcelable(proyecto, 0);

}

public static final Parcelable.Creator<Pdv> CREATOR = new Parcelable.Creator<Pdv>() {
    @Override
    public Pdv createFromParcel(Parcel source) {
        return new Pdv(source);
    }

    @Override
    public Pdv[] newArray(int size) {
        return new Pdv[size];
    }
};

public Pdv(Parcel in) {


    this.id = in.readInt();
    this.clientId = in.readInt();
    this.canal = in.readString();
    this.formato = in.readString();
    this.ciudad = in.readString();
    this.region = in.readString();
    this.ndeterminante = in.readInt();
    this.sucursal = in.readString();
    this.nielsen = in.readInt();
    this.tienda = in.readString();
    this.calle = in.readString();
    this.colonia = in.readString();
    this.cadena = in.readString();
    this.estado = in.readString();
    this.estadoId = in.readInt();
    this.CP = in.readInt();
    this.activo = in.readInt();
    this.done = in.readInt();
    this.sincronizado = in.readInt();
    this.idRuta = in.readInt();

    this.latitude = in.readDouble();
    this.longitude = in.readDouble();

    this.telefono = in.readString();
    this.contacto = in.readString();
    this.horarioIni = in.readString();
    this.horarioFin = in.readString();
    this.proyecto = in.readParcelable(Proyecto.class.getClassLoader());

    }
// getters and setters ...
}
公共类Pdv实现可包裹{
int-id;
int clientId;
弦管;
字符串格式;
弦城市;
弦区;
不确定因素;
串状体;
尼尔森国际酒店;
弦蒂恩达;
字符串调用方;
弦结肠;
int-CP;
int activo;
弦卡德纳;
国际社会;
字符串estado;
双纬度;
双经度;
弦乐;
串触点;
霍拉里奥尼;
线状霍拉里奥芬;
Proyecto Proyecto;
int idRuta;
int完成;
int sincronizado;
//不包括在包裹内
标记;
公共标记getMarker(){
返回标记;
}
公共无效设置标记(标记){
this.marker=标记;
}
@凌驾
公共int描述内容(){
返回0;
}
公共Pdv(int id、int clientId、字符串通道、字符串格式、字符串ciudad、字符串区域、int ND终端、,
字符串sucursal,int nielsen,字符串tienda,字符串calle,字符串colonia,int cP,int activo,
双纬度,双经度,弦式电传机,弦式接触器,弦式horarioIni,弦式horarioFin,
Proyecto Proyecto,int done,int sincronizado,String cadena,String estado){
超级();
this.id=id;
this.clientId=clientId;
这条运河=运河;
this.formato=formato;
this.ciudad=ciudad;
这个区域=区域;
this.ndeterminate=ndeterminate;
this.sucursal=sucursal;
this.nielsen=nielsen;
this.tienda=tienda;
this.calle=calle;
this.colonia=colonia;
这个.CP=CP;
this.cadena=cadena;
this.estado=estado;
this.activo=activo;
这个。纬度=纬度;
这个经度=经度;
this.telefono=telefono;
this.contacto=contacto;
this.horarioIni=horarioIni;
this.horarioFin=horarioFin;
this.proyecto=proyecto;
this.done=done;
this.sincronizado=sincronizado;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地写入(id);
目的写入(客户端ID);
目的地登记(运河);
目的地书面记录(格式);
目的地登记(ciudad);
目的地书面限制(地区);
目的地记录(非终止);
目的地书面记录(续);
目的地记录(尼尔森);
目的地书面记录(tienda);
目的地书面记录(calle);
目的地书面记录(科洛尼亚);
目的地写作(卡德纳);
目的地书面资本(estado);
目的写入(estadoId);
目的写入(CP);
目的写入(活动);
目的地写入(完成);
目的写入(sincronizado);
目的地记录(idRuta);
目的地可写双(纬度);
目的地可写双倍(经度);
目的地记录(电传);
目的地记录(联系人);
目的地记录(horarioIni);
目的地书面资本(horarioFin);
目标可写可执行(proyecto,0);
}
public static final Parcelable.Creator=新建Parcelable.Creator(){
@凌驾
公共Pdv createFromParcel(地块源){
返回新的Pdv(源);
}
@凌驾
公共Pdv[]新数组(整数大小){
返回新的Pdv[大小];
}
};
公共Pdv(包裹内){
this.id=in.readInt();
this.clientId=in.readInt();
this.canal=in.readString();
this.formato=in.readString();
this.ciudad=in.readString();
this.region=in.readString();
this.ndeterminate=in.readInt();
this.sucursal=in.readString();
this.nielsen=in.readInt();
this.tienda=in.readString();
this.calle=in.readString();
this.colonia=in.readString();
this.cadena=in.readString();
this.estado=in.readString();
this.estadoId=in.readInt();
this.CP=in.readInt();
this.activo=in.readInt();
this.done=in.readInt();
this.sincronizado=in.readInt();
this.idRuta=in.readInt();
this.latitude=in.readDouble();
this.longitude=in.readDouble();
this.telefono=in.readString();
this.contacto=in.readString();
this.horarioIni=in.readString();
this.horarioFin=in.readString();
this.proyecto=in.readParcelable(proyecto.class.getClassLoader());
}
//接球手和接球手。。。
}
这是我的proguard.project.txt

    ##---------------Begin: proguard configuration common for all Android apps ----------
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-dump class_files.txt 
-printseeds seeds.txt 
-printusage unused.txt 
-printmapping mapping.txt 
-optimizations !code/simplification/arithmetic


-injars      bin/classes
-injars      libs
-outjars     bin/classes-processed.jar



-allowaccessmodification
-keepattributes *Annotation*
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''


-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.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService

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

# Explicitly preserve all serialization members. The Serializable interface
# is only a marker interface, so it wouldn't save them.
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}


# Preserve all native method names and the names of their classes.
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclassmembers class * extends android.content.Context {
   public void *(android.view.View);
   public void *(android.view.MenuItem);
}
-keepclassmembers class * implements android.os.Parcelable {
    static ** CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}


-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}


-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}


# Preserve static fields of inner classes of R classes that might be accessed
# through introspection.
-keepclassmembers class **.R$* {
  public static <fields>;
}


# Preserve the special static methods that are required in all enumeration classes.
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}


-keep public class * {
    public protected *;
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
##---------------End: proguard configuration common for all Android apps ----------


##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature


# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }


# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }


##---------------End: proguard configuration for Gson  ----------

##---------------Begin proguard configuration for Google Maps --------------------

-keep class com.google.android.gms.** { *; }
-dontwarn com.google.android.gms.**

-keep class org.** { *; }
-keep class * extends java.util.ListResourceBundle {
    protected Object[][] getContents();
}

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}

-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @com.google.android.gms.common.annotation.KeepName *;
}


-renamesourcefileattribute SourceFile    
-keepattributes SourceFile,LineNumberTable

##---------------End proguard configuration for Google Maps --------------------

##---------------Begin proguard configuration for my libs  -----------------------
-keep class com.todddavies.components.progressbar.** { *; }
-dontwarn com.todddavies.components.progressbar.**

-dontwarn org.apache.**


-keepclassmembers class * implements android.os.Parcelable {
    static ** CREATOR;
}
##-----------------开始:所有Android应用程序的通用proguard配置----------
-优化过程5
-dontusemixedcaseclassnames
-DontskipnonPublicLibraryClass
-dontskipnonpubliclibraryclassmembers
-不要翻转
-冗长的
-dump class_files.txt
-printseeds.txt
-printusage unused.txt
-printmapping.txt
-优化!代码/简化/算术
-injars箱/类
-injars libs
-outjars bin/classes-processed.jar
-允许访问修改
-keepattributes*注释*
-重命名SourceFileAttribute源文件
-keepattributes源文件,LineNumberTable
-重新打包类“”
-keep public class*扩展android.app.Activity
-keep public class*扩展android.app.Application
-keep public class*扩展了android.app.Service
-keep public class*扩展了android.content.BroadcastReceiver
-keep public class*扩展了android.content.ContentProvider
-keep public class*扩展了android.app.backup.BackupAgentHelper
-keep public class*扩展了android.preference.preference
-保持公共类com.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService
-keep public class*扩展了android.view.view{
public(android.content.Context);
public(android.content.Context、android.util.AttributeSet);
public(android.content.Context,android.util.AttributeSet,int);
公共无效集*(…);
}
#显式保留所有序列化成员。可序列化接口
#只是一个标记接口,因此无法保存它们。
-keepclassmembers类*实现java.io.Serializable{
静态最终长SerialVersionId;
私人sta
# keep CREATOR for referenced parcelables since it is accessed via reflection
-keepclassmembers class * implements android.os.Parcelable {
    static ** CREATOR;
}
extras.setClassLoader(getClass().getClassLoader());
# Keep all known parcelables
-keep public class * implements android.os.Parcelable
try {
  Bundle extras = getIntent().getExtras();
  if (extras != null) {
    // Trigger unparcel
    extras.size();
  }
} catch (BadParcelableException e) {
  Log.w(TAG, "Got poison Bundle or programmer needs to fix proguard/classloader", e);
}