Попытка получить длину нулевого массива после применения proguard в релизе apk - PullRequest
0 голосов
/ 04 февраля 2019

Я использую библиотеку AndroidFastNetworking для использования спокойных веб-сервисов для одного из моих проектов.Следующий код является то, что я использую для потребления API.

private void getCampaigns(){
        Util.showDialog(this);
        OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                .connectTimeout(30, TimeUnit.SECONDS)
                .addInterceptor(new GzipRequestInterceptor())
                .build();


        AndroidNetworking.get(AppConstants.BASE_URL+"GetCampaignsInfo")
                .setPriority(Priority.MEDIUM)
                .setOkHttpClient(okHttpClient)
                .build()
                .getAsObject(Campaign.class, new ParsedRequestListener<Campaign>() {
                    @Override
                    public void onResponse(Campaign response) {
                        Log.d("TAG", "size:"+response.result.length);
//                        Log.d("TAG", "size:"+response.toString());
                        getViewModel().campaignsList.addAll(Arrays.asList(response.result));
                        Util.hideDialog();
                    }

                    @Override
                    public void onError(ANError error) {
                        error.printStackTrace();
                        if(error.getMessage().contains("SocketTimeoutException")){
                            Snackbar.make(getBinding().toolbar, error.getMessage(), Snackbar.LENGTH_LONG).show();
                        }
                        Util.hideDialog();
                    }
                });
    }

И следующий код есть в моем proguard-rules.pro

-dontwarn okio.**
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *; }
-keep interface com.squareup.okhttp3.* { *; }
-dontwarn javax.annotation.Nullable
-dontwarn javax.annotation.ParametersAreNonnullByDefault
-keep class com.fasterxml.jackson.databind.ObjectMapper {
    public <methods>;
    protected <methods>;
}
-keep class com.fasterxml.jackson.databind.ObjectWriter {
    public ** writeValueAsString(**);
}
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**
-dontwarn okhttp3.internal.platform.*
-dontwarn retrofit2.Platform$Java8
-dontwarn javax.annotation.**
-keep class com.androidnetworking.** { *; }
#-keep class com.yourapp.objects.** { *; }
-keepattributes Signature, *Annotation*
-keepattributes *Annotation*,SourceFile,LineNumberTable
-keep class in.kdms.crm1100.campaigns.Campaign.** { *; }

Мой файл оценок выглядит следующим образом.

----------------
buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
        debug {
            signingConfig signingConfigs.config
        }
    }
-------------------
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.github.stfalcon:androidmvvmhelper:0.4'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.android.support:cardview-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.amitshekhar.android:jackson-android-networking:1.0.2'
    //    implementation 'com.afollestad.material-dialogs:core:0.9.4.7'
    configurations.all {
        exclude group: 'com.android.support', module: 'support-v13'
    }
    implementation 'com.afollestad.material-dialogs:core:0.9.4.7'
    implementation(name: "truesdk-v0.7-releasePartner", ext: "aar")
    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.squareup.okhttp3:okhttp:3.7.0'
}

Этот код идеальноработа в отладочных сборках.Но когда я подписал и тестировал с выпуском apk после применения proguard, logcat отображает следующее падение:

2-04 16:15:57.374 22418-22418/in.kdms.crm1100 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: in.kdms.crm1100, PID: 22418
    java.lang.NullPointerException: Attempt to get length of null array
        at in.kdms.crm1100.campaigns.CampaignsListActivity$1.a(CampaignsListActivity.java:73)
        at in.kdms.crm1100.campaigns.CampaignsListActivity$1.onResponse(CampaignsListActivity.java:70)
        at com.androidnetworking.common.ANRequest.deliverSuccessResponse(ANRequest.java:735)
        at com.androidnetworking.common.ANRequest.access$6500(ANRequest.java:80)
        at com.androidnetworking.common.ANRequest$6.run(ANRequest.java:709)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6186)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

Campaign.java

public class Campaign {
    public Result[] result;

    public Subcampaigns[] subcampaigns;
    public static class Result extends BaseObservable{
        public String SubCampaign;

        public String Status;

        public String C1100SmeName;

        public String CampaignName;

        public String RtgSmeName;

        public String Id;

        public String Dialed;

        public String RtgSlName;

        public String C1100SlName;

        public String DepartmentName;

        @Bindable
        public String getCampaignName() {
            return CampaignName;
        }

        public void setCampaignName(String campaignName) {
            CampaignName = campaignName;
//            notifyPropertyChanged(BR.CampaignName);
        }

        public String getSubCampaign() {
            return SubCampaign;
        }

        public void setSubCampaign(String subCampaign) {
            SubCampaign = subCampaign;
        }

        public String getStatus() {
            return Status;
        }

        public void setStatus(String status) {
            Status = status;
        }

        public String getC1100SmeName() {
            return C1100SmeName;
        }

        public void setC1100SmeName(String c1100SmeName) {
            C1100SmeName = c1100SmeName;
        }

        public String getRtgSmeName() {
            return RtgSmeName;
        }

        public void setRtgSmeName(String rtgSmeName) {
            RtgSmeName = rtgSmeName;
        }

        public String getId() {
            return Id;
        }

        public void setId(String id) {
            Id = id;
        }

        public String getDialed() {
            return Dialed;
        }

        public void setDialed(String dialed) {
            Dialed = dialed;
        }

        public String getRtgSlName() {
            return RtgSlName;
        }

        public void setRtgSlName(String rtgSlName) {
            RtgSlName = rtgSlName;
        }

        public String getC1100SlName() {
            return C1100SlName;
        }

        public void setC1100SlName(String c1100SlName) {
            C1100SlName = c1100SlName;
        }

        @Bindable
        public String getDepartmentName() {
            return DepartmentName;
        }

        public void setDepartmentName(String departmentName) {
            DepartmentName = departmentName;
//            notifyPropertyChanged(BR.DepartmentName);
        }
    }
    public static class Subcampaigns {
        private String Id;

        private String DisplayName;
    }
}

Так что в основном это первая строкаonResponse () в getCampaigns ().Я не получаю именно то, что я должен добавить в файл proguard, чтобы решить эту проблему.Пожалуйста, посмотрите на мою проблему один раз и дайте мне знать, что я пропустил в моем потоке.Заранее спасибо.

1 Ответ

0 голосов
/ 04 февраля 2019

Ошибка устраняется после добавления ниже двух строк кода в файл proguard.Это может помочь кому-то, кто работает над Proguard для Android.

-keep class in.kdms.crm1100.campaigns.Campaign**
     -keepclassmembers class in.kdms.crm1100.campaigns.Campaign** {
        *;
     }
...