Какая конфигурация 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?
Ответы
Ответ 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