android-仅用一种产品替换主Java文件
作者:互联网
我正在尝试为Android配置构建.该项目具有多种风格,在一种风格中,我想替换main中的某些类.结构是这样的:
主要-MyClass.java
flavourA,flavourB …… flavourF使用main的MyClass.java,没有覆盖
flavourG需要自己的MyClass.java
我不想将MyClass.java复制到每种口味的目录中.完全将其删除,这是无法维护的.有没有一种方法可以使用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'
}
}
}
上面的方法不起作用,我做错了吗?还有其他选择吗?
解决方法:
您可以使用以下表示法来控制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闭包是在配置时间评估的,而不是在执行时间l评估的,这意味着在评估任务之前已确定主类条件(请参见Build lifecycle).
安卓系统
每个@Opals评论(对不起,没有注意到).要解决Android中的同一问题,最快的选择是每个flavourg有一个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
flavourg中的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,特别是“与应用程序的代码共享自定义字段和资源值”部分
标签:gradle,dagger-2,android 来源: https://codeday.me/bug/20191108/2008108.html