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

霓虹灯

我有一个带有两个模块(模块A和模块B)的Android Studio android项目。我正在构建和测试这些模块,然后将其作为.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);
    }
}

}

模块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从数据库中获取一个对象,然后尝试通过FetchObjectListener接口将其返回给Startup类。此时,我收到以下错误:

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中修复。

请注意,如果可以的话,处理最终应用程序(包括其库)比处理单个库更有效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android Studio与模块一起使用

将DexGuard集成到Android Studio中

Roboblender将注释数据库与多个模块一起使用

将IntelliJ与Android插件一起使用,而不是使用Android Studio

将Proguard与可运行的JAR文件一起使用

将Android Studio与AndEngineTMXTileExtension一起使用时出现TMXLoader错误

Android Studio-将外部类中的方法与视图一起使用

调试不能与Android Studio一起使用的C ++ /本机库模块(已使用Cmake)

Android Studio:将元素分组在一起

无法将YouTube视频与Android Studio一起播放

将多个计数与多个where子句一起使用

将QGraphicsDropShadowEffect与多个小部件一起使用

将R中的same()与多个向量一起使用

将导航组件与多个活动一起使用

将readHTMLTable与多个tbody一起使用

将Varnish与多个名为vhost的apache一起使用

将多个Github帐户与SSH密钥一起使用

将 makefile 与多个 C 程序一起使用

将ACL与多个默认组一起使用

将NativeQuery多个表与EntityFramework一起使用

将Matcher.appendReplacement()与多个区域一起使用

Pyspark:将repartitionAndSortWithinPartitions与多个Critiria一起使用

将.loc与多个选择条件一起使用

将SQL聚合函数与多个联接一起使用

将SetWindowPos与多个监视器一起使用

如何将didFinishPickingMedia与多个UIImage一起使用

如何将ArgumentOutOfRangeException与多个参数一起使用?

将UIPageViewController与多个视图一起使用

如何将AdControl与多个AdUnitId一起使用?