2014-10-09 25 views
31

Khi sử dụng Firebase SDK cho ứng dụng Android, tôi tiếp tục nhận được cảnh báo và lỗi như thế này (trong Eclipse):Tôi cần cấu hình ProGuard nào cho Firebase trên Android?

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') ... 

Thật không may, căn cứ hỏa lực không có bất kỳ tài liệu chính thức về việc sử dụng nó với ProGuard.

Tôi cần những chỉ thị nào để ứng dụng của mình biên dịch thành công các bản phát hành với Firebase khi bị làm phiền với ProGuard?

+0

Xem thêm [Configure ProGuard] (https : //firebase.google.com/docs/database/android/start/#proguard) – Kato

Trả lời

33

Dựa trên các thử nghiệm cá nhân của tôi, hóa ra điều gì đó dọc theo những dòng này là cần thiết cho các ứng dụng Android được tăng cường Firebase để biên dịch với ProGuard.

Trong mọi trường hợp, bạn phải thêm -keepnames class com.my.package.beans.** { *; } nếu bạn đang sử dụng các đối tượng tùy chỉnh trong Firebase, ví dụ: đậu hoặc POJO.

căn cứ hỏa lực 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.** 

căn cứ hỏa lực 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.** 

căn cứ hỏa lực 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.** { *; } 

khu nghỉ mát cuối:

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

Ghi chú:

Bất kỳ phương châm chính thức sẽ được hoan nghênh. Các chỉ thị -dontwarn rõ ràng là nguy hiểm, mã có thể phá vỡ tại các điểm mà tôi chưa thử nghiệm. Hơn nữa, các quy tắc trên khá dễ chấp nhận và các quy tắc khác có thể tối ưu hóa tốt hơn APK của bạn.

+0

@JennyTong: Cảm ơn! Bất kỳ lời giải thích cho những thay đổi? Tôi không thể tìm thấy bất kỳ lớp 'org.apache. **' hoặc 'com.fasterxml.jackson. **' nào trong SDK, chỉ có các phiên bản 'được tô bóng'. – caw

+2

Tôi đã phải thêm '-keepattributes Signature' để cho phép jackson hoạt động đúng cách. Tham khảo: http://stackoverflow.com/questions/28433281/how-to-include-typereference-proguard-rule –

+0

@RiccardoCasatta Bạn nói đúng, điều này là bắt buộc. Tôi chỉ quên đề cập đến nó bởi vì tôi có thuộc tính này, dù sao đi nữa. – caw

6

Nó không thực sự là tài liệu chính thức, nhưng Firebase đã hiển thị một số quy tắc bảo vệ cơ bản tại một trong các kho lưu trữ Github của họ. 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.** 
+0

Cảm ơn nguồn này! Sự khác biệt với cấu hình của tôi (xem câu trả lời khác) có vẻ là họ đã bỏ các quy tắc 'dontwarn' cho' org.joda.time. ** ',' org.shaded.apache. ** 'và' org.ietf.jgss . ** 'và thay vào đó bao gồm một cho' org.apache. ** '. – caw

+0

Bạn được chào đón. Chỉ muốn thêm nó vì nó đến từ chính Firebase và cũng vì nó hơi khác so với các bài kiểm tra cá nhân của bạn. – user4989692

+0

Quy tắc này không hoạt động. –

2

Theo dõi trên các câu trả lời khác, sử dụng căn cứ hỏa lực 2.4.1 Tôi chỉ phải bao gồm trong cấu hình Proguard của tôi (YMMV):

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

tôi làm việc thiết lập cho căn cứ hỏa lực 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 
+0

Vì vậy, nó chỉ là bốn mục cuối cùng mới, phải không? Có lẽ một '-dontwarn com.firebase. **' là đủ ở đây? – caw

+0

Đúng vậy, tôi đã cập nhật bài đăng. – Peter

2

Cấu hình cho firebase 2.5.2 có vẻ đã thay đổi. Đây là những gì đang làm việc cho tôi:

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

Tôi cũng phải vật lộn với điều này. Nhờ người dùng4989692 và Ugo để chỉ cho tôi hướng đi đúng.

Đây là những gì phù hợp với tôi:

.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.** { *; } 
+6

sẽ không giữ com.YOUR-APP_DOMAIN chỉ cần tắt tất cả Proguard? Điều này có vẻ thực sự sai. – domenukk

+0

Theo cơ sở dữ liệu bạn cần thay thế: -keepclassmembers class com.yourcompany.models. ** { *; } chỉ là các mô hình bạn đang sử dụng cùng với cơ sở dữ liệu thời gian thực! – Tino

4

Tôi thấy điều này trong các tài liệu căn cứ hỏa lực:

Khi sử dụng cơ sở dữ liệu căn cứ hỏa lực Realtime trong ứng dụng của bạn cùng với ProGuard bạn cần phải xem xét như thế nào đối tượng mô hình của bạn sẽ được tuần tự hóa và deserialized sau khi obfuscation. Nếu bạn sử dụng DataSnapshot.getValue (Class) hoặc DatabaseReference.setValue (Object) để đọc và ghi dữ liệu bạn sẽ cần phải thêm các quy tắc vào file 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.** { 
*; 
} 
+0

Bạn có thể cung cấp liên kết đến tài liệu không? – SalicBlu3

+1

https://firebase.google.com/docs/database/android/start/ – MrAliB

Các vấn đề liên quan