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

如何绕过 Firebase 缓存来刷新数据(在 Android 应用中)?

数据未从 Android 应用程序写入 Firebase 实时数据库

Firebase 两个数据库(iOS、Android)

使用 Firebase 的 Android 聊天应用程序,但未在 firebase 中存储数据

如何从 Android 应用程序连接到多个 Firebase 数据库