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でリリースを正常にコンパイルするには、アプリにどのディレクティブが必要ですか?
私の個人的なテストに基づいて、Firebase-enhanced AndroidアプリをProGuardでコンパイルするにはこれらの行に沿って何かが必要であることが判明しました。
いずれにせよ、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をより最適化できます。
それは実際には公式のドキュメントではありませんが、FirebaseはGithubリポジトリの1つでいくつかの基本的な保護ルールを示しました。 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.**
Firebaseのドキュメントでこれを見つけました。
ProGuardとともにアプリでFirebase Realtime Databaseを使用する場合、難読化後にモデルオブジェクトをシリアル化および非シリアル化する方法を考慮する必要があります。 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.** {
*;
}
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.**
Firebase 2.4.1を使用して、他の回答をフォローアップすると、proguard config(YMMV)に次のものを含めるだけで済みました。
-keep class com.firebase.** { *; }
-dontwarn com.fasterxml.**
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
私もこれに苦労しました。 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.** { *; }
それは私の問題を解決します
これをproguard-rulesファイルに追加します
-optimizations !class/merging/*
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