如果找不到引用但不必要的源/资源,如何解决产品风味的构建错误?

我有一个项目,它有2个产品口味和自己的目录:

build.gradle

android { ... productFlavors { free { applicationId "com.sample.free" buildConfigField "boolean", "free", "true" } paid { applicationId "com.sample" buildConfigField "boolean", "free", "false" } } } 

我有一个类(例如PaidOperationClass ),它只用于paid风格。 所以,我把那个类放在src/paid/java目录下。 我有另一个类(如CommonClass ),两种口味都使用它。 所以我把它放在src/main/java目录下:

 src/main/ --> has CommonClass src/free/ src/paid/ --> has PaidOperationClass 

CommonClass我有一个方法,例如:

 if(!BuildConfig.FREE) { PaidOperationClass.doSomeStuff(); } 

所以PaidOperationClass被引用(有一个导入)但从未被免费构建使用。

如果我为paid风格构建应用程序,一切都很完美。 但是,如果我尝试构建它free味道,它失败,因为没有find引用但不必要的类。 如何在没有代码(类/方法)复制的情况下解决这个问题(比如将假的PaidOperationClass放在free味道下)? 是否有任何gradle选项在构建时忽略了这种构建错误?

编辑:我需要一个不需要代码复制的gradle解决方案。 基于注释的自定义脚本可能会在编译时删除不必要的产品风格代码。

Solutions Collecting From Web of "如果找不到引用但不必要的源/资源,如何解决产品风味的构建错误?"

你不能这样做,因为import语句在CommonClass并且它无法解决免费风格的PaidOperationClass

实现它的一种方法是:

Free flavor中创建一个空类:

 public class PaidOperationClass{ public static void doSomeStuff(){ //do nothing.. } } 

最简单的解决方案可能是创建一个类:IPaidOperations,它位于PaidOperationClass实现的/ src / main目录中。 然后只需使用CommonClass中的接口即可。

无论您是否使用,您都可以从free套餐中引用paid套餐:

 if(!BuildConfig.FREE) { PaidOperationClass.doSomeStuff(); } 

所以我建议两种选择之一:

1。
因此,如果您有一段从未使用过的代码,为什么要将它保留在那里? 将其取下并更换为:

 if(!BuildConfig.FREE) { // Do something within the imported packages. } 

否则,您必须导入paid包。

2。
或者有两个free包版本

free_paidfree_no_paid并删除free_no_paid中对free_no_paid的引用,并在没有paid情况下编译时使用它,并在使用free_paid编译时使用free_paid包。

另一个解决方案是创建两个CommonClass es – 包括freepaid源集(但不包括main ),其中包含特定于特定风格的代码。 例如: src/free/java/.../CommonClass.java

 doSomeStuff() { doSomeFreeStuff(); } 

src/paid/java/.../CommonClass.java

 doSomeStuff() { doSomePaidStuff(); } 

在这种情况下,无论构建哪种风味,位于main源集中的代码都可以引用CommonClass#doSomeStuff() 。 只编译一个特定风味的CommonClass 。 换句话说,不是手动使用ifs,而是让gradle选择合适的类进行编译。

您还可以从CommonClass到抽象类提取真正常见的代码(不依赖于任何特定于freepaid )。 BaseCommonClass放在main源集中,让CommonClass扩展它。