Android proguard включен apk не подключается к лазурному серверу

Я искал решение с прошлой недели. У меня есть приложение, которое подключено к серверу Windows Azure. Мне нужно передать свой apk клиентам, поэтому я пытаюсь зашифровать свой apk перед развертыванием. Сейчас я использую proguard и могу создать apk без предупреждения. Но после установки устройство не подключается к серверу. Без прогарда подключается. вот мой

на моем MainActivity. Toast отображается с исключением «java.lang.IllegalArgumentException: класс, представляющий мобильный serviceTable, должен иметь одно свойство id» при назначении класса

         mClient = new MobileServiceClient(
                "https://uchek.azure-mobile.net/",
                "LslqFcIcUrlbLnYdDxTHUVrZBeQwPX81",
            con);

    try{
    mToDoTable = mClient.getTable(Product.class); //Assigning table
    }catch(Exception e){Toast.makeText(getApplicationContext(),    e+"",Toast.LENGTH_LONG).show();}

Product.java

 public class ProductInfo {


@com.google.gson.annotations.SerializedName("id")
private int mId;

@com.google.gson.annotations.SerializedName("imei")
private String mIMEI;
public ProductInfo(int id, String imei)
    { 
    this.setId(id);
    this.setIMEI(imei);
    }
    public final void setIMEI(String imei) {
    mIMEI = imei;
}
public int getId() {
    return mId;
}
public String getIMEI() {
    return mIMEI;
}

public final void setId(int id) {
    mId = id;
}
    }

proguard-project.txt

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-dontshrink
-dontoptimize
-verbose

-injars bin/classes
-injars libs
-outjars bin/classes-processed.jar
-libraryjars libs/achartengine-1.1.0.jar 
-libraryjars libs/droidText.0.5.jar
-libraryjars libs/gson-2.2.2.jar
-libraryjars libs/httpclient-4.2.3.jar
-libraryjars libs/joda-time-2.2.jar
-libraryjars libs/mobileservices-0.2.1.jar
-libraryjars libs/mobileservices-0.2.1-javadoc.jar
-libraryjars libs/mobileservices-0.2.1-sources.jar
-dontwarn org.apache.**
-dontwarn org.joda.**
-dontwarn org.slf4j.**
-dontwarn org.json.*
-dontwarn org.mortbay.**
-dontwarn org.apache.log4j.**
-dontwarn org.apache.commons.logging.**
-dontwarn org.apache.commons.logging.**
-dontwarn org.apache.commons.codec.binary.**
-dontwarn javax.xml.**
-dontwarn javax.management.**
-dontwarn java.lang.management.**
-dontwarn android.support.**
-dontwarn com.google.code.**
-dontwarn oauth.signpost.**
-dontwarn twitter4j.**

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

    -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
-keep public class com.google.code.linkedinapi.**
-keep public class * implements java.io.Serializable
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.support.v4.app.ListFragment

-keep class javax.**  { *; }
-keep class org.**  { *; }
-keep class twitter4j.**  { *; }
-keep class java.lang.management.**  { *; }
-keep class com.google.code.**  { *; }
-keep class oauth.signpost.**  { *; }
-keep class com.microsoft.windowsazure.mobileservices.**  { *; }

-keepclassmembers public class                 com.google.code.linkedinapi.client.impl.LinkedInApiXppClient {
 public <init>(java.lang.String, java.lang.String);
}

-keepclasseswithmembernames class * {
native <methods>;
}

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

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

-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * extends com.actionbarsherlock.ActionBarSherlock {
<init>(android.app.Activity, int);
}
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
 public *;
}
-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();
}

person Comrade    schedule 17.12.2013    source источник


Ответы (2)


Я сам столкнулся с той же проблемой и, немного посмотрев код, нашел решение: просто переименуйте mId в id, и все в порядке. MobileServiceClient.getTable () вызывает метод validateClass (), который ищет поле с именем 'id' или, если оно помечено аннотацией @SerializedName, значение аннотации. Поскольку он не нашел его по значению аннотации, просто переименуйте его в своем коде, и он подберет его по имени поля. Он говорит, что у него должно быть только одно поле id, но дело в том, что он его не находит, следовательно, ошибка.

person diazazar    schedule 29.12.2013
comment
Я пробовал это, и это не сработало: /, другие предложения? - person Franco; 30.10.2015

Доступ к аннотациям осуществляется через отражение. ProGuard не знает об этом, поэтому вам нужно явно сохранить их:

-keepattributes *Annotation*
-keep @interface com.google.gson.annotations.SerializedName

Обратите внимание, что если вы используете стандартные сценарии сборки Ant / Eclipse / Gradle, они уже автоматически определяют все необходимые параметры -injars, -outjars и -libraryjars, а также другие параметры, не относящиеся к проекту.

person Eric Lafortune    schedule 01.01.2014