我想知道java中是否有一种方法可以使用相对包路径进行导入。像这样的东西:
import *.fragments.MyFragment;
如果我有一个白标应用程序,我希望主应用程序有一个“MyFragment”定义,但产品风格需要以不同方式定义它,我会使用它。
我想知道java中是否有一种方法可以使用相对包路径进行导入。像这样的东西:
import *.fragments.MyFragment;
如果我有一个白标应用程序,我希望主应用程序有一个“MyFragment”定义,但产品风格需要以不同方式定义它,我会使用它。
不。
类是完全合格的东西。即使您可以导入例如。所有包中名为 Object 的所有类,运行时必须知道您要在任何给定语句中使用哪一个。如果没有完全限定的名称(这正是 import 语句的用途),运行时绝对无法知道您想要哪个类。而且,如果两个类共享相同的规范名称,那么它们就是同一个类。
完整地说,在 vanilla java 中,您实际上可以将两个具有相同名称的类加载到同一个运行时中。但是,您必须使用指向 different 的不同类加载器jars
。您还可以巧妙地制作类路径,以便在同一个类加载器中隐藏其他类(您将获得类路径中首先出现的类)。但是 android 构建系统不会让你有dex
多个具有相同规范名称的类。你会得到一个DexException
,因为所有东西都被压缩到同一个classes.dex
文件中。我不知道这个限制在 multidex 世界中是否已经放松。
要做你想做的事,你可以简单地利用特定于风味的源集。因此,您src/flavor1/java
包含该类的一个定义,然后src/flavor2/java
包含同一类的另一个定义。如果您这样做,则无法在主源集中定义该类,并且必须在每个风味的源集中单独定义该类。
请注意,风味通常定义产品的类型和flavor != variant
. 所以你会想要一个normal
和一个whitelabel
味道。在正常风味中,您使用正常片段构建。在白标风味中,您使用不同的片段构建。那只是两个不同的类别。
除此之外,您还可以使用普通的旧依赖注入和接口,无论如何,您可以选择它们以将您的构建理念与风味和 gradle 的方便的源集概念解开。
作为@dcow 答案的扩展 - 您可以在维度上组合风味。因此,例如,如果您想拥有 4 种口味,并且它们只有两种视图变体 - 添加另外两种口味,将它们设置为一个维度,并将您的初始口味设置为另一个。然后构建您需要的任何组合。
android {
...
flavorDimensions "appversion", "appserver"
productFlavors {
free {
applicationId = "com.myapp.free"
dimension "appversion"
}
paid {
applicationId = "com.myapp.paid"
dimension "appversion"
}
server1{
dimension "appserver"
}
server2{
dimension "appserver"
}
}
}