web-dev-qa-db-ja.com

Android上のFirebaseにはどのようなProGuard構成が必要ですか?

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でリリースを正常にコンパイルするには、アプリにどのディレクティブが必要ですか?

39
caw

私の個人的なテストに基づいて、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をより最適化できます。

45
caw

それは実際には公式のドキュメントではありませんが、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.**
8
user4989692

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.** {
*;
}
8
MrAliB

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.**
3
Ugo Chirico

Firebase 2.4.1を使用して、他の回答をフォローアップすると、proguard config(YMMV)に次のものを含めるだけで済みました。

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

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
2
Peter

私もこれに苦労しました。 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.** { *; }
1
Lee Hounshell

それは私の問題を解決します

これをproguard-rulesファイルに追加します

-optimizations !class/merging/*
0
Masum

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

0
Kevin ABRIOUX