2015-04-25 14 views
8

Dưới đây là tập tin gradle.build tôiAndroid Studio 1.1.0 thiết lập minifyEnabled đúng gây ra vấn đề với ứng dụng

defaultConfig { 

    minSdkVersion 15 
    targetSdkVersion 21 
    versionCode 2 
    versionName "1.0" 
} 
buildTypes { 
    release { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 

tập tin Proguard-rules.pro

-keepclassmembers class * extends de.greenrobot.dao.AbstractDao { 
    public static java.lang.String TABLENAME; 
} 
-keep class **$Properties 

-dontwarn com.squareup.** 
-dontwarn okio.** 
-dontwarn retrofit.** 
-dontwarn org.joda.time.** 

Tôi có một trong các lớp java như

public class Endpoints { 
    public final static String GET_ENDPOINT = "MY_ENDPOINT"; 
} 

mà tôi sử dụng trong phần phụ trang bị thêm của tôi là

RestAdapter restAdapter = new RestAdapter.Builder() 
      .setEndpoint(Endpoints.GET_ENDPOINT) 
      .setLogLevel(RestAdapter.LogLevel.NONE) 
      .setConverter(new GsonConverter(gson)) 
      .setClient(new OkClient(BusProvider.getClientInstance())) 
      .build(); 

Bây giờ khi minifiyEnabled là sai, toàn bộ mã hoạt động tốt nhưng tôi đặt minifyEnabled true, cuộc gọi mạng không xảy ra. Ứng dụng của tôi gọi điểm cuối này ngay khi nó được khởi chạy nhưng nhật ký mạng không hiển thị yêu cầu mạng được thực hiện. Ai đó có thể cho tôi biết có gì sai ở đây không?

Trả lời

12

Proguard không hoạt động tốt với nhiều thư viện tôi đã sử dụng trong dự án của mình.

Đối gson tôi đã thêm các quy tắc Proguard được đưa ra bởi đội gson tại http://google-gson.googlecode.com/svn/trunk/examples/android-proguard-example/proguard.cfg

Bạn cần thay đổi

-keep class com.google.gson.examples.android.model.** { *; } 

để

-keep class com.your.package.name.your.models.** { *; } 

Đối với trang bị thêm bạn cần phải thêm

-dontwarn retrofit.** 
-keep class retrofit.** { *; } 
-keepattributes Signature 
-keepattributes Exceptions 
-keepclasseswithmembers class * { 
    @retrofit.http.* <methods>; 
} 

Taken từ đây https://github.com/square/retrofit/issues/117

Đối với thư viện Joda tôi thêm

-keep class org.joda.time.** { *; } 
-dontwarn org.joda.time.** 

Đối với Otto bạn cần phải thêm

-dontwarn com.squareup.** 
-keepclassmembers class ** { 
    @com.squareup.otto.Subscribe public *; 
    @com.squareup.otto.Produce public *; 
} 

Taken từ đây https://github.com/StephenAsherson/Android-OttoSample/blob/master/proguard-project.txt

Tôi cũng đã thêm

-keep class com.squareup.okhttp.** { *; } 

Trước khi sử dụng các thay đổi cấu hình này, bảo vệ đã cắt ứng dụng của tôi từ 3,4 mb xuống còn 2 mb. Sau khi sử dụng những thay đổi này nó co lại nó đến 3,2 mb vì vậy tôi chỉ đi với minifyEnabled sai.

+0

Liên kết ví dụ của bạn không còn hoạt động nữa. Bạn có thể sử dụng cái này thay vào đó: https: // github.com/google/gson/blob/chủ/ví dụ/android-proguard-example/proguard.cfg – w3bshark

4

Proguard có khả năng làm xáo trộn một số lớp học của bạn trong dự án của bạn mà Retrofit/Gson đang sử dụng. Điều này dẫn đến yêu cầu của bạn không bao giờ thành công vì việc phân tích cú pháp không thành công. Điều này là do các thông số không khớp với nhau, ví dụ: String status có thể biến thành String a bằng Proguard. Điều này không khớp với phản hồi, vì vậy nó không thành công.

Tóm tắt - đảm bảo tất cả các lớp mà Retrofit/Gson sử dụng để tạo và phân tích cú pháp phản hồi được loại trừ khỏi sự che khuất của Proguard.

+0

Vâng, đó là vấn đề. Tôi sẽ đăng một câu trả lời cụ thể để giải quyết vấn đề cho tôi. –

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