У меня есть 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 для успешной компиляции и запуска этого проекта, но с тех пор я разбил проект на модули и чувствую, что это может быть частью проблемы. Я пытаюсь определить, что может быть проблемой, и подумал, что, возможно, проблема может быть вызвана двумя модулями, пытающимися использовать интерфейс.
Любые идеи о том, как решить эту проблему, будут оценены.