Происходит ретрофит2: java.lang.AbstractMethodError: абстрактный метод "void retrofit2.Callback.onResponse (retrofit2.Call, retrofit2.Response)" - PullRequest
0 голосов
/ 25 октября 2018

Я занимаюсь разработкой проекта пользовательского модуля, и в нем есть класс менеджера (вызов " ManagerClass " ниже) в качестве главного входа этого модуля.В этом классе я использую retrofit2 для подключения http API в режиме постановки в очередь.

Теперь меня сводит с ума то, что в Debug buildType весь модуль работает без сбоев fault Но если я хочу сделать JAR, это означает, что в режиме выпуска я хочу, чтобы модуль был смешанными произошло исключение!

Это мой метод API:

public void apiGetPublicIpInfo2(Callback<TestIp> callback) {
    Call<TestIp> call = apiService.getPublicIpInfo("http://ipinfo.io/json");
    call.enqueue(callback);
}

Это мое использование в ManagerClass:

mApiManager.apiGetPublicIpInfo2(new Callback<TestIp>() {
        @Override
        public void onResponse(Call<TestIp> call, Response<TestIp> response) {
            ...
        }

        @Override
        public void onFailure(Call<TestIp> call, Throwable t) {
            ...
        }
    });

Но если я создаю JAR, это выглядит так:

введите описание изображения здесь

Абстрактный метод onResponse и onFailure retrofit2.Callback смешаны!

Результат:

java.lang.AbstractMethodError: abstract method "void retrofit2.Callback.onResponse(retrofit2.Call, retrofit2.Response)"
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
    at android.os.Handler.handleCallback(Handler.java:809)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:166)
    at android.app.ActivityThread.main(ActivityThread.java:7377)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)

Файл proguard-rules.pro имеет обычный тип, например:

-keep class com.----.ManagerClass {
    public <fields>;
    public <methods>;
}

Даже если изменить его на

-keep class com.----.ManagerClass {
    *;
}

Метод переопределения onResponse и onFailure анонимного внутреннего класса " new Callback <> () {} "все еще смешаны ...

Мой модуль build.gradle:

apply plugin: 'com.android.library'
android {
    compileSdkVersion 26

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 26
        versionCode 1
        versionName "0.0.1"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            jniDebuggable true
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            jniDebuggable false
        }
    }
    lintOptions {
        abortOnError false
    }
}
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.1.0'
    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.google.code.gson:gson:2.8.5'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
}

Я не знаю, как это исправить после того, как я попробовал какой-то способ, например, eдит прогард файл.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Решил мою проблему:

# Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform

# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8

# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature

# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions
-dontwarn org.xmlpull.v1.**
-dontwarn okhttp3.**

-dontwarn retrofit2.**
-keep class retrofit2.** { *; }


-keepclasseswithmembers class * {
    @retrofit2.http.* <methods>;
}

-dontwarn javax.annotation.GuardedBy
-dontwarn javax.annotation.**

Вам нужно сохранить свои модели, не запутывать их.Я видел ошибки с вашими моделями, sqlite не может работать на ваших моделях.Должно быть так:

-keep class package.to.yourmodels.** { *; }
0 голосов
/ 25 октября 2018

Попробуйте установить следующие параметры:

-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

-keepclasseswithmembers class * {
    @retrofit2.http.* <methods>;
}

Более подробные настройки см .: https://github.com/square/retrofit/blob/master/retrofit/src/main/resources/META-INF/proguard/retrofit2.pro

...