Использование ProGuard/Dexguard с несколькими модулями Android Studio

У меня есть Android-проект Android Studio с двумя модулями: модулем A и модулем B. Я создаю и тестирую эти модули, а затем распространяю их в виде файлов .aar. Когда запускается родительское приложение, использующее .aars, я сталкиваюсь с AbstractMethodError и не могу понять, почему. Я включил флаги -keep для классов и интерфейсов в файлы dexguard-project.txt обоих модулей в надежде, что это сработает, но безрезультатно. Вот дополнительная информация о проекте:

Модуль A содержит класс Util.class.

public class Util {

private static CustomObject getObjectFromDb(Context context) {
    return new CustomObject();
}

public static class GetObjectTask extends AsyncTask<Context, Void, CustomObject> {
    FetchCustomObjectListener mListener;
    Context mContext;

    public GetObjectTask(Context context, FetchCustomObjectListener listener) {
        mListener = listener;
        mContext = context;
    }

    @Override
    protected CustomObject doInBackground(Context... params) {
        return getObjectFromDb(mContext);
    }

    @Override
    protected void onPostExecute(CustomObject d) {
        super.onPostExecute(d);
        mListener.onCustomObjectFetched(d);
    }
}

}

Модуль A также содержит интерфейс с именем FetchCustomObjectListener.class.

public interface FetchCustomObjectListener {
    public void onObjectFetched(CustomObject d);
}

Модуль B содержит класс Startup.class:

public class Startup {

private Startup(Context context) {
    super(context);

    Util.GetObjectTask getObjectTask = new Util.GetObjectTask(context, new FetchCustomObjectListener() {
        @Override
        public void onObjectFetched(CustomObject d) {
            //handle custom object here
        }
    });

    getObjectTask.execute();
}

Во время выполнения класс Startup создает экземпляр GetObjectTask и выполняет его. GetObjectTask захватывает объект из базы данных и пытается вернуть его классу Startup через интерфейс FetchObjectListener. В этот момент я получаю следующую ошибку:

java.lang.AbstractMethodError: abstract method "void a.b.c.FetchObjectListener.onObjectFetched(a.b.c.CustomObject)"
at a.b.c.Util$GetObjectTask.onPostExecute(SourceFile:65)
at a.b.c.Util$GetObjectTask.onPostExecute(SourceFile:48)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Насколько я понимаю, эта ошибка может возникать, когда интерфейс «сохраняется» одним модулем или классом и не «сохраняется» другим при запуске Dexguard. Таким образом, один модуль имеет фактическое имя, а другой имеет запутанное имя, и из-за этого два модуля не могут взаимодействовать с использованием интерфейса, и поэтому выдается AbstractMethodError.

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

Любые идеи о том, как решить эту проблему, будут оценены.


person neonDion    schedule 25.03.2015    source источник


Ответы (1)


Оказывается неправильный файловый фильтр на первой библиотеке при обработке второй библиотеки. Возможно, вы видели предупреждения об отсутствующих классах из первой библиотеки. Проблема была исправлена ​​в DexGuard 6.1.15.

Обратите внимание, что обработка конечного приложения (включая его библиотеки) более эффективна, чем обработка отдельных библиотек, если у вас есть выбор.

person Eric Lafortune    schedule 28.03.2015
comment
Только что скачал обновление и проблема ушла. Спасибо за оперативный ответ и решение. - person neonDion; 30.03.2015
comment
Привет, Эрик, не могли бы вы взглянуть на мой вопрос здесь? Спасибо ... :) - person Y.S; 25.05.2016