当前位置: 首页 > 知识库问答 >
问题:

从main中替换Java文件,只使用一种产品风格

郏扬
2023-03-14
 + 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

像这样的分级设置...

productFlavors {
    flavora {
    }
    ...
    flavorg {
    }
}

sourceSources {
    flavora {
    }
    flavorb {
    }
    ...
    flavorg {
       main.java {
          exclude 'com/myapp/mypackage/MyClass.java'
       }
    }
}

上面不起作用,我是不是做错了什么?还有别的选择吗?

共有1个答案

吴缪文
2023-03-14

您可以使用以下符号来控制JAR清单(特别是'main-class'属性)

jar {
    manifest {
        attributes 'Main-Class': 'com.example.MyMain'
    }
}

和Gradle中的所有内容一样,它也是一个groovy脚本,所以您可以根据需要用条件包装它的一部分来分叉行为。

假设您将味道作为A-P标志传递(请参见Gradle属性和系统属性),例如Gradle build-pflavor=flavorg,下面应该可以工作:

jar {
    manifest {
        if (flavor == "flavorg") {
             attributes 'Main-Class': 'com.example.FlavoredMain'
        } else {
             attributes 'Main-Class': 'com.example.GenericMain'
        }
    }
}
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的差异(即主要活动变化),它们将根据所选风味进行合并

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();
 类似资料:
  • 问题内容: 我有一个名为FormatString.java的文本文件。它包含一些单词。在所有这些单词中,我想将单词oldstring替换为newstring,并将最终结果重命名为t.txt。我已经编写了代码。从技术上讲,它应该起作用。问题是我不知道在哪里保存FormatString.java文件。我是否将其保存在保存了ReplacingText程序的同一类文件夹中,还是将其保存在其他地方。我转到命

  • 问题内容: 我有一个文本文件,我只想更改文件的第一行。该文件可能长达数百万行,因此我宁愿不必遍历所有内容,因此我想知道是否还有另一种方法可以做到这一点。 我还想对第一行应用一些规则,以便将某些单词的实例替换为其他单词。 这可能吗? 问题答案: 除非结果行的长度与原始行的长度不同,否则A 将达到目的。 如果事实证明您被迫执行复制(替换第一行,其余数据应原样复制),我建议使用和。首先使用的读取第一行。

  • 问题内容: 如何替换在文本文件中找到的一行文本? 我有一个字符串,例如: 我想用更新它: (反之亦然) 我该如何完成? 顺便说一句,我只想替换已读取的行。不是整个文件。 问题答案: 在底部,我有一个通用的解决方案来替换文件中的行。但是首先,这是眼前特定问题的答案。辅助功能: 然后调用它: 原始文本文件内容: Output: New text file content: And as a note,

  • 问题内容: 我有一个字符串,其结构类似于:。每次来自外部源的字符串都可能有所不同。 我只想替换第一次出现的而不是其他的。可能吗? 问题答案: preg_replace的可选第四个参数是:

  • 在产品页面中,每个产品都有一个图像,并且下面有两个子标题:标题和到产品类别的链接。我想用产品的简短描述替换这个产品类别字段。 我查看了Woocomece文件夹中的每个php文件,但找不到要编辑的行。 谢谢你的帮助。

  • 我在这个项目中使用Android Studio 2.3.1和jdk 1.8。 我导入了一个项目,它使用的是“java”。尼奥。文件文件和java。尼奥。文件“路径”。 Java8中不存在包“java.nio.file”。 此外,Android Studio不允许选择jdk 1.7。 我可以用这个代码做什么? 这个密码呢 **(无法解析文件和路径) 谢谢