android-仅用一种产品替换主Java文件

android-仅用一种产品替换主Java文件,第1张

概述我正在尝试为Android配置构建.该项目具有多种风格,在一种风格中,我想替换main中的某些类.结构是这样的:主要-MyClass.javaflavourA,flavourB……flavourF使用main的MyClass.java,没有覆盖flavourG需要自己的MyClass.java我不想将MyClass.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,特别是“与应用程序的代码共享自定义字段和资源值”部分

总结

以上是内存溢出为你收集整理的android-仅用一种产品替换主Java文件全部内容,希望文章能够帮你解决android-仅用一种产品替换主Java文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1081837.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存