Android:具有相同软件包的2个Aar库

Ari*_*ann 10 java dependencies android android-library

编辑:在下面的链接中发布了基于此讨论的后续问题。

Android:如何在同一应用程序使用的多个库中管理公共代码库

我有两个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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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();
    }
}

Run Code Online (Sandbox Code Playgroud)

LibA中的BaseClass:

package mybasepackage.common;

 public class BaseClass{

   public String baseMethod() {
        return "Called from ClassA";
    }
}
Run Code Online (Sandbox Code Playgroud)

LibB中的BaseClass:

package mybasepackage.common;

 public class BaseClass{

   public String baseMethod() {
        return "Called from ClassB";
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试在同一个应用程序中编译两个库时,会抛出重复的类error: "Program type already present: mybasepackage.common.BaseClass",这是因为编译器不知道要编译哪个BaseClass,因为它驻留在两个库中。

我的目标是允许两个aar库在同一应用程序中成功编译,同时为BaseClass提供不同的实现。更正式地讲,LibA和LibB应该在同一应用程序中进行编译,例如:

呼叫new ClassA().baseMethod()将返回“从ClassA 呼叫”。

呼叫new ClassB().baseMethod()将返回“从ClassB 呼叫”。

前提条件:我不能在其中一个库中更改基本程序包名称,因为它本质上会造成不必要的BaseClass重复。

注意:我知道通过aar方法可能无法实现。如果确实如此,我将考虑其他部署架构,只要我能够使用问题的描述,使用相同的通用类使用不同的实现来编译这些库。

The*_*ve3 6

鉴于您的先决条件,您将无法采用这种方式。Java中不能有两个具有相同程序包名称的不同库,这是引发错误的主要问题(而不是类的名称)。

您可以做的,也许是可能的话,最好的处理方式是将两个库合并为一个,并在其中添加两个子包,然后导入它们:

import mybasepackage.common.a_name.BaseClass; // class A
import mybasepackage.common.b_name.BaseClass; // class B
Run Code Online (Sandbox Code Playgroud)

这将防止重复错误,因为它们只是名称相同,但来自不同的程序包。

如果这种方法不符合您的期望,则另一个想法是通过实现另一个抽象层来更改体系结构,在该抽象层中您将BaseClass定义为抽象方法:

package mybasepackage.common;

 public class abstract BaseClass{

   public String myPublicMethod();
 }
Run Code Online (Sandbox Code Playgroud)

然后只需在ClassA和中实现方法ClassB

public class ClassA implements BaseClass{

    public ClassA() {
        super();
    }

    @Override
    public String myPublicMethod(){
        // logic for A
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:以上对类A的实现只是一个存根,不应按原样工作。适应您的需求。

无论如何,您不能有两个具有相同类名的包。


Com*_*are 6

我的目标是允许两个aar库在同一应用程序中成功编译,同时为BaseClass提供不同的实现

不可能,抱歉。

我知道通过aar方法可能无法实现。

它与AAR无关。同一应用程序,时段中不能有两个具有相同完全限定类名称的类。这些重复的类来自何处都没有关系。

我愿意考虑其他部署架构,只要我能够使用问题的描述,使用相同的通用类使用不同的实现来编译这些库。

不可能,抱歉。再次:重复类来自何处都无所谓。您根本不能拥有重复的类。