5

Chúng ta cần phải lưu trữ và lấy nội dung mà người dùng tạo ra với ứng dụng của chúng tôi trực tuyến. Để làm như vậy, chúng tôi đã quyết định sử dụng mẫu Google Cloud Endpoints được tích hợp của Android Studio để tạo nhanh API (ví dụ sử dụng chính thức here).cấu hình Proguard khi sử dụng Android Studio của Google Cloud thiết bị đầu cuối mẫu

Nó hoạt động tốt trong debug, nhưng trong chế độ phát hành, với Proguard được kích hoạt, nó không thành công. Tệ hơn nữa, tôi đã không tìm thấy bất kỳ tài liệu hoặc mẫu nào về việc sử dụng Proguard với các mẫu Thiết bị đầu cuối của Studio Android.

Sau một giờ hoặc lâu hơn poking xung quanh và cố gắng để làm cho nó hoạt động, các proguard-rules.pro bây giờ trông như thế này:

-keep class com.google.api.** { public *; } 
-dontwarn com.google.api.** 
-keep class com.google.common.** { public *; } 
-dontwarn com.google.common.** 

# Not allowed to post company and app names, but this line is correct in the real file 
-keep class com.companyname.appname.application.backend.** { *; } 

Với cấu hình này, tôi nhận được một dàn diễn viên lớp ngoại lệ trong ArrayAdapter tôi:

java.lang.ClassCastException: com.google.api.client.util.ArrayMap cannot be cast to com.companyname.appname.application.backend.messageApi.model.Message 

có vẻ như việc chuyển đổi dữ liệu trả về không được thực hiện ở đâu đó và, thay vì một List của Message đối tượng, tôi nhận được một List của com.google.api.client.util.ArrayMap đối tượng (chúng có chứa dữ liệu hợp lệ, nhân tiện).

tôi có thể kiểm tra xem các ứng dụng đang chạy trong chế độ phát hành và thực hiện việc chuyển đổi bằng tay, tuy nhiên, đó là một cách hacky và tôi muốn làm điều đó đúng. Vì vậy, có thể ai đó xin vui lòng cho tôi biết những gì tôi đang thiếu trong tập tin cấu hình Proguard?

Trả lời

17

tôi làm những điều tương tự với điểm cuối tại một trong những ứng dụng của tôi. Tôi đã có một số vấn đề với Proguard là tốt (không thể nhớ chính xác những gì).

Phần này của quy tắc Proguard tôi dường như áp dụng:

# Needed by google-api-client to keep generic types and @Key annotations accessed via reflection 
-keepclassmembers class * { 
    @com.google.api.client.util.Key <fields>; 
} 
-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault 

Tôi không biết nếu nó là cần thiết, nhưng tôi cũng có phần này:

# Play Services 
-dontwarn com.google.android.gms.** 
-dontwarn com.google.common.cache.** 
-dontwarn com.google.common.primitives.** 
-keep class * extends java.util.ListResourceBundle { 
    protected Object[][] getContents(); 
} 
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { 
    public static final *** NULL; 
} 
-keepnames @com.google.android.gms.common.annotation.KeepName class * 
-keepclassmembernames class * { 
    @com.google.android.gms.common.annotation.KeepName *; 
} 

Hy vọng nó giúp.

+5

Phần đầu tiên của những gì bạn đăng thực sự là giải pháp đúng. – Manvis

+2

Tuyệt vời, cảm ơn phản hồi. – myanimal

+0

Phần đầu tiên được cứu mạng tôi !! Cảm ơn rất nhiều! – KimKha

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