Android 发布应用在 Firebase 数据库中插入错误的值
Posted
技术标签:
【中文标题】Android 发布应用在 Firebase 数据库中插入错误的值【英文标题】:Android release app inserting wrong value in Firebase database 【发布时间】:2017-04-02 04:31:09 【问题描述】:我有用于在 Firebase 数据库中存储值的模型类,它对于调试应用程序工作正常,但是当我在发布模式下运行或生成发布 .apk 时,我的 Firebase 数据库中发布了错误的值(未发布实际的 json)。
-KWqzFGEvUyCLx6obroBaddclose
a: "hLjOMC64NRdjqR0nfaUKhR3qz0l2"
b: "xyz@gmail.com"
我的 Proguard 条目的
-keep @com.google.gson.annotations.Expose public class *
-dontwarn sun.misc.Unsafe
-dontwarn android.databinding.**
-keep class android.databinding.** *;
# Facebook library
-dontwarn javax.annotation.**
-dontwarn okio.**
-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip
-keep @com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class *
@com.facebook.common.internal.DoNotStrip *;
####################Retrofit##############
# Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform
# Platform used when running on RoboVM on ios. Will not be used at runtime.
-dontnote retrofit2.Platform$IOS$MainThreadExecutor
# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions
##########################################
-keep class com.firebase.** *;
-keep class org.apache.** *;
-keepnames class com.fasterxml.jackson.** *;
-keepnames class javax.servlet.** *;
-keepnames class org.ietf.jgss.** *;
-dontwarn org.w3c.dom.**
-dontwarn org.joda.time.**
-dontwarn org.shaded.apache.**
-dontwarn org.ietf.jgss.**
构建警告
Error:warning: Ignoring InnerClasses attribute for an anonymous inner class
Error:(c.a.a.g.b) that doesn't come with an
Error:associated EnclosingMethod attribute. This class was probably produced by a
Error:compiler that did not target the modern .class file format. The recommended
Error:solution is to recompile the class from source, using an up-to-date compiler
Error:and without specifying any "-target" type options. The consequence of ignoring
Error:this warning is that reflective operations on this class will incorrectly
Error:indicate that it is *not* an inner class.
【问题讨论】:
【参考方案1】:由于您没有显示代码,因此很难给出非常准确的答案。
我假设你有这样的代码:
public class MyData
private String id ;
private String email ;
然后:
MyData myData = ... ;
databaseReference.push().setValue(myData);
问题是 MyData 被混淆了。那么有两种可能的解决方案:
在 MyData 上防止混淆:
-keepnames class com.example.MyData
-keepclassmembers class com.example.MyData *;
或者更好地控制发送到 firebase 的内容:
public class MyData
private String id ;
private String email ;
public Map<String, Object> toMap()
Map<String, Object> map = new HashMap<>();
map.put("id", id);
map.put("email", email);
return map ;
然后:
MyData myData = ... ;
databaseReference.push().setValue(myData.toMap());
如果 MyData 被混淆,这个解决方案应该可以工作。
希望对你有所帮助。
【讨论】:
感谢您的回答,它在正常情况下会起作用,但不幸的是,在将问题发布到 Stack-overflow 之前,我已经实现了这两个解决方案,这是我从其他线程获得的。仍然错误没有得到解决。所以我在发布模式下启用了调试,发现模型类本身产生了异常,因为我覆盖了“equals”方法,在该方法中产生了在调试模式下没有发生的异常。暂时我已经修复了错误,但我仍然很好奇为什么仅在发布模式下会生成异常。 @user2837615 如果您仅在发布时遇到问题,它看起来像是一个混淆问题。但是上面的第一个解决方案 - 防止对 MyData 的混淆 - 应该已经解决了这个问题。也许你可以同时发布 equals() 方法和你得到的异常堆栈?以上是关于Android 发布应用在 Firebase 数据库中插入错误的值的主要内容,如果未能解决你的问题,请参考以下文章
如何绕过 Firebase 缓存来刷新数据(在 Android 应用中)?
数据未从 Android 应用程序写入 Firebase 实时数据库