2013-09-05 28 views
49

Sau khi một số thông tin cập nhật trong quản lý Android SDK tôi cố gắng làm cho apk ký và có được điều này:ProGuard: không thể tìm thấy lớp được tham chiếu com.google.android.gms.R

ProGuard: [] Warning: com.google.android.gms.auth.GoogleAuthUtil: 
    can't find referenced class com.google.android.gms.R 
ProGuard: [] Warning: com.google.android.gms.auth.GoogleAuthUtil: 
    can't find referenced class com.google.android.gms.R$string 
... 
etc. 

Nếu đặt -dontwarn com.google.android.gms.** biên dịch là OK. Nhưng sau khi chạy, tôi nhận được nhiều báo cáo lỗi như thế này (từ nhiều thiết bị):

Caused by: android.view.InflateException: Binary XML file line #32: 
    Error inflating class com.google.android.gms.common.SignInButton 

Trên tất cả các thiết bị của tôi đều ổn. Trước khi cập nhật, tôi không có cảnh báo ProGuard và tất cả đều hoạt động hoàn hảo. Làm thế nào nó sửa chữa?

Trả lời

29

Bạn cần bỏ qua như bạn đang biên soạn nhưng bạn cũng cần phải giữ cho lớp để nó có thể tìm thấy nó trong thời gian chạy.

Thêm hai dòng này vào tệp cấu hình Proguard của bạn:

-keep class com.google.android.gms.** { *; } 
-dontwarn com.google.android.gms.** 
+3

Điều này giữ được quá nhiều. – rds

+0

@rds Rõ ràng là nó sử dụng một ký tự đại diện và bạn có thể chọn những gì bạn muốn với việc đặt tên lớp cụ thể hơn. Khi bạn bắt đầu cắt các lớp GMS, bạn có thể gặp phải rất nhiều sự cố không mong muốn với sự cố người dùng. – Codeversed

+0

chúng ta có nên sử dụng giữ với dontwarn nói chung cho bất kỳ cảnh báo mà chúng tôi muốn bỏ qua? – batmaci

1

tôi tình cờ gặp một vấn đề tương tự và cuối cùng phát hiện ra rằng tôi đã cập nhật dịch vụ Google Play mô-đun tuy nhiên tôi đã không tái thêm các module để mô-đun chính của tôi trong Android Studio. Thêm lại điều đó trong việc giải quyết các vấn đề của tôi.

97

Mặc dù thêm công cụ này vào proguard-project.txt tệp hoạt động, nó giữ tất cả các lớp.

-keep class com.google.android.gms.** { *; } 
-dontwarn com.google.android.gms.** 

tôi thích điều này, mà làm cho kích thước tập tin apk nhỏ hơn nhiều:

-keep public class com.google.android.gms.* { public *; } 
-dontwarn com.google.android.gms.** 

Cũng lưu ý cập nhật Google Play Proguard thông báo ở đây: http://developer.android.com/google/play-services/setup.html#Proguard

-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 *; 
} 

-keepnames class * implements android.os.Parcelable { 
    public static final ** CREATOR; 
} 
+1

Bạn đã giúp tôi lưu một vài Mb với đề xuất thứ hai của bạn. Cảm ơn! – palvarez89

+0

bạn đã cứu tôi sau 5 ngày đấu tranh và đôi mắt đẫm máu nhờ – Alok

+1

điều này vẫn có liên quan? phần proguard của dịch vụ chơi cho biết không cần cấu hình đặc biệt. – AsafK

2

Nếu bạn sử dụng Proguard, bạn cần giữ một số lớp học GMS (Dịch vụ của Google Play). Hy vọng rằng chúng được chú thích với @com.google.android.gms.common.annotation.KeepName.

# Proguard config for project using GMS 

-keepnames @com.google.android.gms.common.annotation.KeepName class 
    com.google.android.gms.**, 
    com.google.ads.** 

-keepclassmembernames class 
    com.google.android.gms.**, 
    com.google.ads.** { 
    @com.google.android.gms.common.annotation.KeepName *; 
} 

# Called by introspection 
-keep class 
    com.google.android.gms.**, 
    com.google.ads.** 
    extends java.util.ListResourceBundle { 
    protected java.lang.Object[][] getContents(); 
} 


# This keeps the class name as well as the creator field, because the 
# "safe parcelable" can require them during unmarshalling. 
-keepnames class 
    com.google.android.gms.**, 
    com.google.ads.** 
    implements android.os.Parcelable { 
    public static final ** CREATOR; 
} 

# com.google.android.gms.auth.api.signin.SignInApiOptions$Builder 
# references these classes but no implementation is provided. 
-dontnote com.facebook.Session 
-dontnote com.facebook.FacebookSdk 
-keepnames class com.facebook.Session {} 
-keepnames class com.facebook.FacebookSdk {} 

# android.app.Notification.setLatestEventInfo() was removed in 
# Marsmallow, but is still referenced (safely) 
-dontwarn com.google.android.gms.common.GooglePlayServicesUtil