将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中修复.
请注意,如果可以的话,处理最终应用程序(包括其库)比处理单个库更有效.
标签:dexguard,android-studio,proguard,android 来源: https://codeday.me/bug/20191120/2044922.html