0

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

在此处输入图像描述

问题:

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

姓名:约翰

它被创建:

b:约翰

在此处输入图像描述

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

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

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

4

1 回答 1

0

这是因为 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.** { *;}

笔记:

  • 表示类内的所有内容(字段、方法和构造函数)** 包后表示此包中的所有内容(子包和类)
于 2021-12-20T20:16:04.490 回答