如何在Android Studio中进行构建时使用不同的资源集(图像,主题等)?

时间:2019-05-14 00:31:52

标签: android android-studio android-resources

我们需要为来自同一来源库的不同客户构建外观各异的应用程序。每个客户的应用都必须带有商标-即必须具有不同的图像,颜色等。大多数资源-例如布局,字符串-将在所有客户端之间共享。
我们正在考虑在sourceSet中使用build.gradle。例如:

android {
...
    sourceSets {
        Main {
            // resources common to all clients
            resSrcDirs = 'res'
            // resources specific to client1
            resSrcDirs += 'client1/res' 
            // resources specific to client2
            //resSrcDirs += 'client2/res'
            ...

            // The same approach taken for manifest that contains application theme
            manifestSrcFile=client1/AndroidMainifest.xml
            // manifestSrcFile=client2/AndroidManifiest.xml
            ...
        }
    }
}

在每次构建之前,我们将取消注释/注释build.gradle中选定的行。

我们认为这可行,但是想知道是否有更好的方法。

2 个答案:

答案 0 :(得分:2)

您可以使用flavorDimensions,

android {
    flavorDimensions "version"

    productFlavors {
        commom
        client1
        client2
    }
}

然后创建资源文件夹src / client1和src / client2。 在Build Variants窗口中,可以切换要运行或调试的样式。请参考下图。 如果选择client1Debug或client1Release,则client1 / res中的资源将覆盖main / res中相同名称的资源。

enter image description here

答案 1 :(得分:1)

您的方法正确,请按客户品牌划分来源集。

我们有相同的经验,我们通过以下方式解决了问题:

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        resources.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
        jniLibs.srcDirs = ['jniLibs']
    }

    brandA {
        java.srcDirs = ['src_a']
        res.srcDirs = ['res_a']
        assets.srcDirs = ['assets_a']
    }

    brandB {
        java.srcDirs = ['src_b']
        res.srcDirs = ['res_b']
        assets.srcDirs = ['assets_b']
    }

    brandC {
        java.srcDirs = ['src_c']
        res.srcDirs = ['res_c']
        assets.srcDirs = ['assets_c']
    }
}