编程语言
首页 > 编程语言> > android-仅用一种产品替换主Java文件

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 filesGradle 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