我正在尝试为Android配置一个构建。该项目具有多种风格,在一种风格中,我想替换main中的某些类。结构是这样的:
main-MyClass.java
flavorA,flavorB ... flavorF使用main的MyClass.java,没有覆盖
flavorG需要自己的MyClass.java
我不想将MyClass.java复制到每个风味的目录中并将其完全从main中删除,这是无法维护的。有没有一种方法可以使用exclude命令完成此任务?像...
+ src
+ main
+ java
MyClass.java
other common files
AndroidManifest.xml
+ flavorA
+ java
other flavor-specific files
AndroidManifest.xml
+ flavorG
+ java
MyClass.java
other flavor-specific files
AndroidManifest.xml
使用这样的gradle设置...
productFlavors {
flavora {
}
...
flavorg {
}
}
sourceSources {
flavora {
}
flavorb {
}
...
flavorg {
main.java {
exclude 'com/myapp/mypackage/MyClass.java'
}
}
}
以上操作无效,我做错了吗?还有另一种选择吗?
答案 0 :(得分:3)
您可以使用以下表示法来控制JAR清单(特别是“ Main-Class”属性)
jar {
manifest {
attributes 'Main-Class': 'com.example.MyMain'
}
}
就像Gradle中的所有内容一样,它是一个时髦的脚本,因此您可以使用条件包装它的某些部分,以根据需要分叉行为。
假设您将风味作为-P标志传递(请参见Gradle properties and system properties),例如gradle build -Pflavor=flavorg
应会起作用:
jar {
manifest {
if (flavor == "flavorg") {
attributes 'Main-Class': 'com.example.FlavoredMain'
} else {
attributes 'Main-Class': 'com.example.GenericMain'
}
}
}
P.S,请记住,如上所述的Jar闭包是在配置时评估的,而不是执行timel的评估,这意味着在评估任务之前已确定主类条件(请参见Build lifecycle)。
Android
每个@Opals评论(对不起,没有注意到)。要解决Android中的同一问题,最快的选择是每个Spiceg都拥有一个AndroidManifest.xml,其余的
android {
sourceSets {
main {
manifest.srcFile 'main/AndroidManifest.xml'
}
flavorg {
manifest.srcFile 'main/other/AndroidManifest.xml'
}
}
}
在AndroidManifest.xml中,您定义了主要活动。
一个更好的选择是确保您遵循正确的文件夹结构
+ src
+ main
+ java
+ res
+ AndroidManifest.xml
+ flavorg
+ java
+ res
+ AndroidManifest.xml
flavorg中的AndroidManifest.xml应该只包含与主要AndroidManifest.xml的区别(即主要活动更改),它们将根据所选的风味进行合并
我建议您查看以下Merge multiple manifest files和Gradle flavors for android with custom source sets - what should the gradle files look like?
Android-修订的问题
我将改用工厂模式,根据激活的风味返回“ MyClass”的正确实例:
productFlavors {
main {
buildConfigField "string", "APP_FLAVOR", "main"
}
flavorg {
buildConfigField "string", "APP_FLAVOR", "flavorg"
}
}
然后,在工厂中,您可以使用:
if (BuildConfig.APP_FLAVOR.Equals("flavorg") {
return new FlavorgMyClass();
}
return new MyClass();
请参见Gradle Tips,特别是“与应用的代码共享自定义字段和资源值”部分