将ProGuard/Dexguard与多个Android Studio模块一起使用

将ProGuard/Dexguard与多个Android Studio模块一起使用,android,android-studio,proguard,dexguard,Android,Android Studio,Proguard,Dexguard,我有一个Android Studio Android项目,包含两个模块,模块A和模块B。我正在构建和测试这些模块,然后将它们作为.aar文件分发。当使用.aars的父应用程序运行时,我遇到了AbstractMethodError,我不知道为什么。我在这两个模块的dexguard-project.txt文件中都包含了类和接口的-keep标志,希望它可以工作,但没有效果。以下是有关该项目的更多信息: 模块A包含一个名为Util.class的类 public class Util { private

我有一个Android Studio Android项目,包含两个模块,模块A和模块B。我正在构建和测试这些模块,然后将它们作为.aar文件分发。当使用.aars的父应用程序运行时,我遇到了AbstractMethodError,我不知道为什么。我在这两个模块的dexguard-project.txt文件中都包含了类和接口的-keep标志,希望它可以工作,但没有效果。以下是有关该项目的更多信息:

模块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);
    }
}
模块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从数据库中获取对象,并尝试通过接口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成功地编译和运行了这个项目,但后来我对项目进行了更多的模块化,并认为这可能是问题的一部分。我试图缩小可能出现的问题,并认为可能是两个模块试图使用一个接口导致了问题


如果您有任何关于如何解决此问题的想法,我们将不胜感激。

处理第二个库时,第一个库上的文件过滤器不正确。您可能已经看到了第一个库中关于缺少类的警告。该问题已在DexGuard 6.1.15中修复


请注意,如果您有选择,处理最终应用程序(包括其库)比处理单个库更有效。

刚刚下载了更新,问题已经解决。谢谢你的及时回复和解决。嗨,埃里克,你能看看我的问题吗?谢谢……:)
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)