Edit:基于此讨论的后续问题已发布在以下链接中。
Android:如何管理同一应用程序使用的多个库中的公共代码库 https://stackoverflow.com/questions/57572278/android-how-to-manage-common-codebase-in-multiple-libraries-used-by-the-same-ap?noredirect=1#comment101605210_57572278
我有两个android aar库项目:LibA使用ClassA,LibB使用ClassB。两个库具有相同的基础包。两个库都使用名为 BaseClass 的相同类,当前分别驻留在每个库中的包名称“common”中。 BaseClass 包含一个名为 baseMethod 的方法。
这将使用具有相同名称和不同实现的类创建两个库。
这就是类的样子:
ClassA:
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();
}
}
ClassB:
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 应在同一应用程序中编译,例如:
Calling new ClassA().baseMethod()
将返回“从 A 类调用”。
Calling new ClassB().baseMethod()
将返回“从 ClassB 调用”。
前提条件:我无法更改其中一个库中的基础包名称,因为它本质上会创建不需要的 BaseClass 重复项。
NOTE:我知道通过 aar 方法这可能是不可能的。如果确实如此,我愿意考虑其他部署架构,只要我能够使用不同实现的相同公共类来编译这些库,如问题中所述。