2011-10-17 53 views
5

Kể từ hôm nay, có điều gì đó kỳ lạ đang xảy ra với ứng dụng của tôi. Mỗi khi tôi nhấp vào nút đã đặt thuộc tính android: onClick, tôi nhận được một IllegalStateException: Không thể tìm thấy phương thức ...android: onClick không hoạt động với ProGuard

Tôi nhận thấy rằng chỉ xảy ra khi tôi bật Proguard trong tệp: default.properties

Đây là proguard.cfg tôi:

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembernames class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembernames class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

Cái này là không xảy ra tuần trước .. (tôi đã sử dụng Proguard quá). Bất kỳ ý tưởng?

EDIT tôi tìm thấy một giải pháp cho vấn đề này: Dự án với các vấn đề đã được tạo ra với một phiên bản cũ của các plugin ADT (Eclipse). Tôi đã tạo một dự án mới với cùng các tham số và sao chép src/, res/Tệp kê khai và giải quyết sự cố!

+0

Trong bài đăng của bạn, bạn đã vô tình nhận xét hầu hết mã - không chắc đó có phải là lỗi đánh máy hay không. –

+0

Đó là tập tin bảo vệ, nó có/* và stackoverflow phát hiện nó như một bình luận .. – SERPRO

Trả lời

4

Bạn cần yêu cầu người bảo vệ không được thay đổi phương thức được liên kết với thẻ của bạn.

Dưới đây là một quy tắc dụ (lấy từ the proguard website):

-keep class mypackage.MyCallbackClass { 
    void myCallbackMethod(java.lang.String); 
} 
+0

Đó là nó .. Cảm ơn! Tôi vẫn không hiểu tại sao điều đó không xảy ra trước đây. – SERPRO

+0

Tôi chỉ cần kiểm tra và android: onClick hoạt động trong một số xml nhưng không phải ở những người khác .. Bạn có biết tại sao điều đó xảy ra không? – SERPRO

6

trong file ví dụ trong các công cụ khuôn khổ android (YOUR_ANDROID_DIR/tools/Proguard/Proguard-android.txt), bạn có thể tìm thấy những điều sau đây quy tắc:

# We want to keep methods in Activity that could be used in the XML attribute onClick 
-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

Với nhận xét khá rõ ràng.

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