在 Android Studio 中构建期间如何使用不同的资源集(图像、主题等)?

How to use different set of resources (images, themes, etc.) during builds in Android Studio?

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

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
            ...
        }
    }
}

在每次构建之前,我们将 uncomment/comment 在 build.gradle 中选择行。

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

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

我们有同样的经历,我们解决了这个问题:

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']
    }
}

您可以使用 flavorDimensions,

android {
    flavorDimensions "version"

    productFlavors {
        commom
        client1
        client2
    }
}

然后创建您的资源文件夹 src/client1 & src/client2。 在Build Variants window中可以切换哪个样式为运行或debug.Refer如下图。 如果选择client1Debug或client1Release,client1/res中的资源将覆盖main/res中的同名资源。