当您生成签名的 apk 时,Firebase 数据库无法正常工作

Posted

技术标签:

【中文标题】当您生成签名的 apk 时,Firebase 数据库无法正常工作【英文标题】:When you generate the signed apk Firebase Database does not work correctly 【发布时间】:2020-01-15 20:19:21 【问题描述】:

当我直接通过 android Studio(USB 调试)在移动设备上运行时,我的应用程序运行良好。当我在应用程序中注册时,它会在 Firebase 身份验证中创建用户帐户(ID、姓名、电子邮件)并保存 Firebase 实时数据库中的用户数据(id、name、email、region)。然后应用程序的主屏幕打开,在主屏幕的 onCreat 中,我将用户的令牌保存在数据库中。该应用程序没有给出任何错误。

问题:

但是当我生成签名的apk并将其安装在我的手机上时,通过执行相同的过程,即进行注册 用户,注册完成,但保存的节点名称奇怪,数据保存更多,而不是例如:

姓名:约翰

它已创建:

b: 约翰

之后,它会以登录用户和 crasha 应用程序打开主应用程序屏幕,因为它无法在数据库中找到正确的命名值,因此会发生空对象错误。唯一正确保存节点名称的数据是令牌,因为令牌仅在打开时保存到主屏幕的 onCreat。这没有任何意义......

我不知道是什么原因造成的,当我通过调试运行应用程序时一切正常,只需生成发生的签名 apk 并且应用程序无法使用。

注意:我尝试使用 Android App Bundle 生成而不是生成 APK,但无法解决。该应用程序在 Google Play 作为 Alpha,我已经在 Firebase 项目的“签名”下添加了出现在 Google Play 控制台上的两个 SHA-1 代码,并将 google-services 文件放入项目中,它没有解决任何一个。我不知道该怎么办。这和 ProGuard 有什么关系吗?

【问题讨论】:

@DHAVALASODARIYA,你提到的问题说它不起作用。在这种情况下,它适用于扭曲的字段名称。它是混淆类的proguard,因此名称看起来是扭曲的。在这里查看答案***.com/a/57937362/5636313 @DHAVALASODARIYA,感激不尽。 【参考方案1】:

这是因为 proguard 删除(混淆)未使用的代码并将类和类成员的(变量和方法)名称重命名为更短的名称。有两种方法可以随心所欲地保留它们

选项 1. 在每个字段之前添加注释,括号之间放置您希望在 Firebase 中显示的名称。

方法 A) 为公共字段添加注释

public class Datum 
    @PropertyName("name")
    public String name;

方法 B) 如果您的字段是私有的,则向公共 setter/getter 添加注释

public class Datum 

    private String name;

    @PropertyName("name")
    public String getName() 
        return name;
    

    @PropertyName("name")
    public void setName(String name) 
        this.name = name;
    

选项 2. 配置 proguard 文件以保持类、字段和方法名称不变。

方法 A) 按照 Firebase 文档进行操作。将以下行添加到您的 proguard 文件中。下面几行表示模型包和模型目录子包中每个类成员(字段、构造函数和方法)的名称将保持原样。

添加此全局规则

-keepattributes Signature

# This rule will properly ProGuard all the model classes in
# the package com.yourcompany.models. Modify to fit the structure
# of your app.

-keepclassmembers class com.yourcompany.models.**  *;

方法 B) 逐个添加类

如果您想保留 User 类的名称和类成员,请添加此内容。

-keep class com.josiah.app.data.models.User *;

方法 C) 在一个包中添加所有类

假设您的所有模型类都在模型包中,并且您希望在该包中保持所有类和类成员的名称不变。然后你必须在你的 proguard 文件中添加以下行。

-keep class com.josiah.app.data.models.**  *;

注意:

表示类中的所有内容(字段、方法和构造函数) ** 包后表示此包中的所有内容(子包和类)

【讨论】:

以上是关于当您生成签名的 apk 时,Firebase 数据库无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

我如何生成使用Firebase Auth的签名APK?]

生成带有 minifyEnabled 设置为 true 的签名 APK 后,firebase UI 输出空白

生成签名的 APK:构建 APK Android Studio 时出错

由于 APK 正在重新签名,Firebase 服务无法与 Firebase 测试实验室设备一起使用

由于 proguard 规则,生成签名 APK 时出错

Retrofit 2.3.0 生成签名 APK 时出错