2013-05-03 42 views
8

Ứng dụng của tôi hoạt động tốt trước khi obfuscation nhưng khi tôi cho phép Proguard tôi nhận được lỗi sau:Parcelable vấn đề Khi Obfuscating Với Proguard

2013-05-02 13:43:58.772 E 30138/AndroidRuntime: FATAL EXCEPTION: main java.lang.NumberFormatException: Invalid long: "0.20" 
    at java.lang.Long.invalidLong(Long.java:125) 
    at java.lang.Long.parse(Long.java:362) 
    at java.lang.Long.parseLong(Long.java:353) 
    at java.lang.Long.parseLong(Long.java:319) 
    at com.sourcetone.data.model.Station.long getId()(SourceFile:195) 
    at com.sourcetone.STStationListFragment.void deleteStation(com.sourcetone.data.model.Station)(SourceFile:298) 
    at com.sourcetone.STStationListFragment.void access$4(com.sourcetone.STStationListFragment,com.sourcetone.data.model.Station)(SourceFile:293) 
    at com.sourcetone.STStationListFragment$ArrayListAdapter$1.void onClick(android.view.View)(SourceFile:274) 
    at android.view.View.performClick(View.java:3528) 
    at android.view.View$PerformClick.run(View.java:14217) 
    at android.os.Handler.handleCallback(Handler.java:605) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4482) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561) 
    at dalvik.system.NativeStart.main(Native Method) 

2013-05-02 13:43:58.803 W 472/ActivityManager: Force finishing activity com.sourcetone/.STMainActivity 

Proguard cấu hình của tôi có như sau:

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

Vì vậy Parcelable nên được giữ đúng không? Long không hợp lệ mà nó ném thực sự là một phần của yêu cầu của tôi vì vậy nó đọc sai số. Tôi có phải giữ lớp HttpResponse của mình không? Còn gì nữa?

+0

Nó phụ thuộc vào cách bạn phân tích cú pháp yêu cầu của bạn. Bạn đang sử dụng thư viện phản chiếu nào? Gson, Jackson? –

Trả lời

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

Không giữ nguyên toàn bộ nội dung lớp học, chỉ giữ tên lớp và phương pháp CREATOR.

Cố gắng giữ các lĩnh vực quá trong lớp Parcelable của bạn, thêm một cái gì đó như:

-keepclassmembers class * implements android.os.Parcelable { 
public <fields>; 
} 
-1
-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

Nó sẽ chỉ giữ tên lớp và CREATOR.

Bạn nên thay đổi nó để

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

quy tắc android Mặc định bao gồm các hướng dẫn ở trên, và sẽ được áp dụng cho dự án của bạn cũng vậy, nếu bạn để mặc định được tạo ra định nghĩa gradle tại chỗ:

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
Các vấn đề liên quan