【问题标题】:What ProGuard configuration do I need for Firebase on Android?Android 上的 Firebase 需要什么 ProGuard 配置?
【发布时间】:2023-03-17 20:43:01
【问题描述】:

在为 Android 应用程序使用 Firebase SDK 时,我不断收到类似以下的警告和错误(在 Eclipse 中):

Warning ... can't find referenced class ...
Warning: there were ... unresolved references to classes or interfaces ...
You may need to specify additional library jars (using '-libraryjars') ...

很遗憾,Firebase 没有任何关于其与 ProGuard 一起使用的官方文档。

在使用 ProGuard 进行混淆时,我的应用需要哪些指令才能使用 Firebase 成功编译版本?

【问题讨论】:

  • 很遗憾,这并没有解决 Coinverse 应用的 Firebase 问题。你可能会看到完整的代码here
  • 使用 ProGuard 的 Firebase Firestore 数据库是否有与使用实时数据库时类似的配置,如 Configure Proguard 部分所述?

标签: android firebase proguard


【解决方案1】:

根据我的个人测试,事实证明,使用 ProGuard 编译 Firebase 增强的 Android 应用程序需要遵循这些原则。

无论如何,如果您在 Firebase 中使用自定义对象(即 bean 或 POJO),则必须添加 -keepnames class com.my.package.beans.** { *; }

Firebase SDK 1.0.18:

-keepnames class com.firebase.** { *; }
-keepnames class com.shaded.fasterxml.jackson.** { *; }
-keepnames class org.shaded.apache.** { *; }
-keepnames class javax.servlet.** { *; }
-dontwarn org.w3c.dom.**
-dontwarn org.joda.time.**
-dontwarn org.shaded.apache.commons.logging.impl.**

Firebase SDK 1.1.1:

-keep class com.firebase.** { *; }
-keep class org.shaded.apache.** { *; }
-keepnames class com.shaded.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.**

Firebase SDK 2.0.0:

-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.**

# Only necessary if you downloaded the SDK jar directly instead of from maven.
-keep class com.shaded.fasterxml.jackson.** { *; }

不得已:

-keep class !com.my.package.** { *; }

注意事项:

欢迎任何官方指南。 -dontwarn 指令显然很危险,代码可能会在我没有测试过的地方中断。此外,上述规则相当宽松,其他规则可能会更好地优化您的 APK。

【讨论】:

  • @JennyTong:谢谢!对这些变化有什么解释吗?我在 SDK 中找不到任何 org.apache.**com.fasterxml.jackson.** 类,只有 shaded 版本。
  • 我必须添加-keepattributes Signature 才能让杰克逊正常工作。参考:stackoverflow.com/questions/28433281/…
  • @RiccardoCasatta 你说得对,这是必需的。我只是忘了提它,因为我有这个属性,反正。
  • 来自我们的 Slack 频道:“如果您使用 FirebaseUI,则需要添加以下行:-dontwarn com.firebase.ui.auth.**
  • 您用“如果您在 Firebase 中使用自定义对象,即 bean 或 POJO”为我节省了一天。我的应用程序因没有此规则而在生产中崩溃。谢谢!!
【解决方案2】:

我在 Firebase 文档中找到了这个:

在您的应用中使用 Firebase 实时数据库和 ProGuard 时,您需要考虑在混淆后如何对模型对象进行序列化和反序列化。如果您使用 DataSnapshot.getValue(Class) 或 DatabaseReference.setValue(Object) 来读取和写入数据,则需要在 proguard-rules.pro 文件中添加规则:

# Add this global rule    
-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.** {
*;
}

【讨论】:

【解决方案3】:

2021年答案

在您的数据类之前使用@Keep 注释,以便它们被proguard 保留。对于JavaKotlin,它是AndroidX 的一部分。适用于 Firebase、Jetpack Navigator 和 Retrofit。

@Keep
data class Listing(
    val id: String = "",
    val name: String = ""
)

According to documentation:

表示在构建时缩小代码时不应删除带注释的元素。这通常用于仅通过反射访问的方法和类,因此编译器可能会认为代码未使用。

【讨论】:

  • 哇!你是一个非常优雅的解决方案的救生员!谢谢人:)
  • Google 可以通过更新其文档做得更好。
  • 您仍然需要添加-keep class com.google.firebase.** { *; },否则您的应用将无法在三星设备上运行,请参考:stackoverflow.com/a/59883426/2430555
  • 已经在三星设备上测试过,没有遇到任何问题。我们没有这个 Proguard 规则。
【解决方案4】:

这并不是真正的官方文档,但 Firebase 确实在其 Github 存储库之一中展示了一些基本的 proguard 规则。 https://github.com/firebase/AndroidChat/blob/master/app/proguard-rules.pro

# Basic ProGuard rules for Firebase Android SDK 2.0.0+
-keep class com.firebase.** { *; }
-keep class org.apache.** { *; }
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class javax.servlet.** { *; }
-keepnames class org.ietf.jgss.** { *; }
-dontwarn org.apache.**
-dontwarn org.w3c.dom.**

【讨论】:

  • 感谢此来源!我的配置的不同之处(见其他答案)似乎是他们放弃了org.joda.time.**org.shaded.apache.**org.ietf.jgss.**dontwarn 规则,而是包括org.apache.** 的规则。
  • 不客气。只是想添加它,因为它来自 Firebase 本身,而且它与您的个人测试略有不同。
【解决方案5】:

使用 Firebase 2.4.1 跟进其他答案,我只需在我的 proguard 配置 (YMMV) 中包含以下内容:

-keep class com.firebase.** { *; }
-dontwarn com.fasterxml.**

【讨论】:

    【解决方案6】:

    firebase 2.5.2 的配置似乎已更改。这对我有用:

    -keep class com.firebase.** { *; }
    -keep class org.apache.** { *; }
    -keepnames class com.shaded.fasterxml.** { *; }
    -keepnames class com.fasterxml.jackson.** { *; }
    -keepnames class javax.servlet.** { *; }
    -keepnames class org.ietf.jgss.** { *; }
    -dontwarn org.apache.**
    -dontwarn org.w3c.dom.**
    

    【讨论】:

      【解决方案7】:

      我的 Firebase SDK 2.4.2 工作集:

      -keep class com.firebase.** { *; }
      -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.**
      -dontwarn com.firebase.**
      -dontnote com.firebase.client.core.GaePlatform
      

      【讨论】:

      • 所以只有最后四个条目是新的,对吧?也许-dontwarn com.firebase.** 就足够了吗?
      【解决方案8】:

      我也为此苦苦挣扎。 感谢 user4989692 和 Ugo 为我指明了正确的方向。

      这对我有用:

      build.gradle

          buildTypes {
          debug {
              minifyEnabled false
              shrinkResources false
              useProguard false
              debuggable true
              signingConfig signingConfigs.debug
          }
          release {
              minifyEnabled true
              shrinkResources true
              useProguard true
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
              signingConfig signingConfigs.release
          }
      }
      

      proguard-rules.pro

      -dontwarn org.w3c.dom.**
      -dontwarn org.joda.time.**
      -dontwarn org.shaded.apache.**
      -dontwarn org.ietf.jgss.**
      -dontwarn com.firebase.**
      -dontnote com.firebase.client.core.GaePlatform
      
      -keepattributes Signature
      -keepattributes *Annotation*
      -keepattributes InnerClasses,EnclosingMethod
      
      -keep class com.YOUR-APP-DOMAIN.** { *; }
      
      # Basic ProGuard rules for Firebase Android SDK 2.0.0+
      -keep class com.firebase.** { *; }
      
      -keepnames class com.fasterxml.jackson.** { *; }
      -keepnames class javax.servlet.** { *; }
      -keepnames class org.ietf.jgss.** { *; }
      

      【讨论】:

      • 不会保留 com.YOUR-APP_DOMAIN 只是禁用所有 Proguard?这似乎真的错了。
      • 根据你需要的firebase:-keepclassmembers class com.yourcompany.models.** { *; } 只是您与实时数据库一起使用的模型!
      【解决方案9】:

      解决了我的问题

      将此添加到您的 proguard-rules 文件中

      -optimizations !class/merging/*
      

      【讨论】:

      • 很遗憾,这并没有解决 Coinverse 应用的 Firebase 问题。你可能会看到完整的代码here
      【解决方案10】:

      如果您使用的是 Firebase 实时数据库,模型对象将在混淆强文本后进行序列化和反序列化

      -keep class com.yourdevelopername.urappname.** { *; }
      

      【讨论】:

      • @Kaiffidocumentation 中的方法对您不起作用吗?
      • 很遗憾,这并没有解决 Coinverse 应用的 Firebase 问题。你可能会看到完整的代码here
      【解决方案11】:

      这就是为什么当你做干净的架构很容易修复时,看看这个场景,如果我的应用程序中有来自多个文件的多个 firebase 请求,那么尝试保持单个类让 firebase 工作会很麻烦,所以,如果我们有一个模块化的代码,并且我们将所有的请求和数据模型存储在一个数据层中,那么只保留使用 firebase 的类而不是整个项目会非常容易,这样做会更好地缩小 apk大小也

      -keep class com.mypackage.data.** {*;}
      

      【讨论】:

        猜你喜欢
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        • 2017-05-23
        • 2018-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多