Подтвердить что ты не робот

Какая конфигурация ProGuard мне нужна для Firebase на Android?

При использовании Firebase SDK для Android-приложений я продолжаю получать предупреждения и ошибки, подобные этим (в 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.

Какие директивы мне нужны для моих приложений для успешной компиляции выпусков с Firebase при запуске ProGuard?

4b9b3361

Ответ 1

Основываясь на моих личных тестах, оказалось, что что-то в этом направлении необходимо для приложений с поддержкой Firebase для Android с помощью ProGuard.

В любом случае вам нужно добавить -keepnames class com.my.package.beans.** { *; }, если вы используете пользовательские объекты в вашей Firebase, т.е. beans или POJO.

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.

Ответ 2

Это не официальная документация, но Firebase действительно продемонстрировала некоторые основные правила proguard в одном из своих репозиториев Github. 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.**

Ответ 3

Я нашел это в документации Firebase:

При использовании Firebase Realtime Database в вашем приложении вместе с ProGuard вам нужно подумать о том, как ваши объекты модели будут сериализованы и десериализованы после обфускации. Если вы используете DataSnapshot.getValue(класс) или 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.** {
*;
}

Ответ 4

Конфигурация для 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.**

Ответ 5

Следуя другим ответам, используя Firebase 2.4.1, я должен был включить следующее в мою конфигурацию proguard (YMMV):

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

Ответ 6

Мой рабочий набор для 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

Ответ 7

Я также боролся с этим. Спасибо 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.** { *; }

Ответ 8

Это решает мою проблему

Добавьте это в ваш файл правил proguard-rules

-optimizations !class/merging/*

Ответ 9

Если вы используете Firebase Realtime Database, объекты модели будут сериализованы и десериализованы после запутывания. Так что вам нужно иметь это в вашем 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.** {
  *;
}

Больше информации здесь: https://firebase.google.com/docs/database/android/start