【发布时间】:2019-12-12 07:05:07
【问题描述】:
编辑:基于此讨论的后续问题已发布在以下链接中。
Android: How to manage common codebase in multiple libraries used by the same application
我有两个 android aar 库项目:使用 ClassA 的 LibA 和使用 ClassB 的 LibB。两个库具有相同的基本包。两个库都使用同一个名为 BaseClass 的类,当前分别位于包名称“common”中的每个库中。 BaseClass 包含一个名为 baseMethod 的方法。
这会使用同名的类和不同的实现创建两个库。
这是类的样子:
A 类:
package mybasepackage.a;
import mybasepackage.common.BaseClass;
public class ClassA {
BaseClass baseClass;
public ClassA() {
this.baseClass= new BaseClass();
}
public String myPublicMethod(){
return this.baseClass.baseMethod();
}
}
B 类:
package mybasepackage.b;
import mybasepackage.common.BaseClass;
public class ClassB {
BaseClass baseClass;
public ClassB() {
this.baseClass = new BaseClass();
}
public String myPublicMethod(){
return this.baseClass.baseMethod();
}
}
LibA 中的基类:
package mybasepackage.common;
public class BaseClass{
public String baseMethod() {
return "Called from ClassA";
}
}
LibB 中的基类:
package mybasepackage.common;
public class BaseClass{
public String baseMethod() {
return "Called from ClassB";
}
}
当我尝试在同一个应用程序中编译两个库时,它会抛出一个重复的类 error: "Program type already present: mybasepackage.common.BaseClass",这是因为编译器无法知道要编译哪个 BaseClass,因为它位于两个库中。
我的目标是允许两个 aar 库在同一个应用程序中成功编译,同时为 BaseClass 提供不同的实现。更正式地说,LibA 和 LibB 应该在同一个应用程序中编译,例如:
调用new ClassA().baseMethod() 将返回“Called from ClassA”。
调用new ClassB().baseMethod() 将返回“Called from ClassB”。
前提条件:我无法更改其中一个库中的基本包名称,因为它实质上会造成不必要的 BaseClass 重复。
注意:我知道这可能无法通过 aar 方法实现。如果确实如此,我愿意考虑其他部署架构,只要我能够使用不同的实现使用相同的公共类编译这些库,如问题中所述。
【问题讨论】:
-
BaseClass 包含一个名为 baseMethod 的方法。为什么要使用 BaseClass,而里面的唯一方法应该不同?
标签: java android dependencies android-library