将 ProGuard / Dexguard 与多个 Android Studio 模块一起使用
Posted
技术标签:
【中文标题】将 ProGuard / Dexguard 与多个 Android Studio 模块一起使用【英文标题】:Using ProGuard / Dexguard with multiple Android Studio Modules 【发布时间】:2015-05-29 17:15:23 【问题描述】:我有一个带有两个模块的 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);
模块 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成功编译并运行过这个项目,但后来对项目进行了更多模块化,觉得这可能是问题的一部分。我正在尝试缩小可能出现问题的范围,并认为可能是两个模块尝试使用一个接口可能会导致问题。
任何关于如何解决这个问题的想法都将不胜感激。
【问题讨论】:
【参考方案1】:在处理第二个库时,结果是第一个库上的文件过滤器不正确。您可能已经从第一个库中看到有关缺少类的警告。该问题已在 DexGuard 6.1.15 中修复。
请注意,如果您可以选择,处理最终应用程序(包括其库)比处理单个库更有效。
【讨论】:
刚刚下载了更新,问题已经解决。感谢您的及时回复和解决。 嗨,Eric,你能看看我的问题here吗?谢谢... :)以上是关于将 ProGuard / Dexguard 与多个 Android Studio 模块一起使用的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 ProGuard 中启用缩小时出现 DexGuard 错误
我应该在 proGuard 上使用 dexGuard、redEX 来混淆广播接收器吗