【发布时间】:2015-04-10 14:43:48
【问题描述】:
我一直在寻找解决这个问题的方法,我尝试了许多 proguard 配置但没有成功。 该应用程序运行完美,直到我使用 proguard 制作发布版本。 我收到错误消息: “java.lang.IllegalArgumentException: 表示移动服务表的类必须定义一个 id 属性”在分配类时
我相信这是由我试图访问的表的类引起的,它的变量“id”名称已更改。
我有以下几点:
public class User {
public String id;
public String nickname;
public String phone;
}
并通过以下方式建立连接:
mClient.getTable(User.class).where().field("nickname")
.eq(nick).execute(new TableQueryCallback<User>() {....
proguard 配置文件是:
-keep class com.microsoft.azure.storage.table.** { *; }
-dontwarn com.fasterxml.jackson.core**
-keep class com.microsoft.windowsazure.mobileservices.** { *; }
-dontwarn android.os.**
-dontwarn com.microsoft.windowsazure.mobileservices.RequestAsyncTask
##---------------from here is the part that i have modified a lot of times -
-keepattributes Signature
-keepattributes *Annotation*
-keep public class com.company.app.User.** { *; }
-keepclassmembers public class com.company.app.User.** { *; }
我已经尝试了几个小时的许多修改,但没有成功。 我关注了this 和this 等等。
你能帮帮我吗? 谢谢
编辑:已解决。只需删除 proguard 文件中 User 之后的 .** 即可。就这样吧:
-keep public class com.company.app.User { *; }
-keepclassmembers public class com.company.app.User { *; }
【问题讨论】:
-
您是否尝试过将附加的 SerializedName 行添加到您的 proguard 配置中,如链接帖子 cmets 中所述? -keep @interface com.google.gson.annotations.SerializedName
-
你的意思是把类成员@com.google.gson.annotations.SerializedName("id") 然后加上-keepattributes Annotation -keep @interface com .google.gson.annotations.SerializedName ?是的,我试过了
-
我正在检查 proguard 文件,在 mapping.txt 中我可以看到 com.company.app.User -> com.company.app.User: java.lang.String 昵称 -> 一个 java。 lang.String phone -> b 所以那些被混淆并且在usage.txt中:public java.lang.String id 所以id没有保留......我猜是有问题
-
我解决了这个问题。只需在 proguard 文件中删除 User 之后的 .** 并修复即可。我不敢相信我花了这么多时间在这件事上......
-
我建议将其添加为答案并接受它,以便下次有人遇到它时,您将为他们提供解决方案:)