Проблемы Android Proguard с Lamdas в модуле библиотеки - PullRequest
0 голосов
/ 06 октября 2018

У меня есть проект Android, и это зависит от модуля библиотеки.В моем модуле есть такой интерфейс:

   public interface SimpleAnimationListener extends Animation.AnimationListener {
    @Override
    default void onAnimationStart(Animation animation) {
        onAnimation(Type.START);
    }

    @Override
    default void onAnimationEnd(Animation animation) {
        onAnimation(Type.END);
    }

    @Override
    default void onAnimationRepeat(Animation animation) {
        onAnimation(Type.REPEAT);
    }

    void onAnimation(Type type);

    enum Type {
        START,
        END,
        REPEAT
    }
}

Использование:

public static void fadeViewOut(@NonNull View view, int duration) {
    view.setVisibility(View.VISIBLE);
    AlphaAnimation anim = new AlphaAnimation(1.0f, 0.0f);
    anim.setDuration(duration);
    anim.setAnimationListener((SimpleAnimationListener) type -> {
        if (type == SimpleAnimationListener.Type.END) {
            view.setVisibility(View.INVISIBLE);
        }
    });
    view.startAnimation(anim);
}

Всякий раз, когда я использую этот интерфейс в своем проекте приложения.Я получаю следующее исключение:

FATAL EXCEPTION: main
    java.lang.AbstractMethodError: abstract method not implemented
        at Zt.onAnimationStart(lambda)

В моем mappings.txt у меня есть это:

com.example.mymodule.interfaces.SimpleAnimationListener -> Wt:
<...>
com.example.mymodule.utils.-$$Lambda$AnimationUtils$rrH5aPAPZuoC__1-9DiD10TFdgY -> Zt:
        android.view.View f$0 -> a

Попытка добавления следующего в proguard-rules.pro

-keep public class com.example.mymodule.utils.AnimationUtils
-keep public interface com.example.mymodule.interfaces.SimpleAnimationListener

Тогда в моих отображениях я получу:

com.example.mymodule.interfaces.SimpleAnimationListener -> com.example.mymodule.interfaces.SimpleAnimationListener:
<...>
com.example.mymodule.utils.-$$Lambda$AnimationUtils$rrH5aPAPZuoC__1-9DiD10TFdgY -> Yt:
    android.view.View f$0 -> a

Это тоже не получится.Но ошибка будет указывать на Yt .Если я перестаю использовать свой интерфейс, который переопределяет некоторые методы, тогда приложение работает, но поскольку в исходных интерфейсах есть несколько методов, я не могу использовать с ними lamdas.Есть идеи как это исправить?

1 Ответ

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

Ты тоже сохранил enum?Потому что мы не хотим разбирать enum right.

Если нет, попробуйте следующее

-keepclassmembers enum * { *; } -keep public class com.example.mymodule.utils.AnimationUtils { *; } -keep public interface com.example.mymodule.interfaces.SimpleAnimationListener { *; }

...