35

For my build system, I need to build several app variants, each requesting a different set of permissions. How can this be done with Gradle, without invoking a separate script?

4

1 回答 1

62

我只是通过在我的 gradle 文件中使用不同的风格来做到这一点:

    free {
        packageName 'com.sample.free'
        buildConfigField "boolean", "HAS_AD", "true"
    }

    paid {
        packageName 'com.sample.paid'
        buildConfigField "boolean", "HAS_AD", "false"
    }

然后我在 src 下创建了一个名为“free”的新文件夹,并在该文件夹下创建了一个名为“res”的文件夹

src/
 + free/
 |   + res/
 + src/

并在该文件夹中创建一个新文件“AndroidManifest.xml”,其中包含以下代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.sample" >
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

根据Android 工具项目网站上的Gradle 插件用户指南:

与 Build Types 类似,Product Flavors 也通过自己的 sourceSets 贡献代码和资源。

在处理用于构建单个 APK 的所有源集时,使用以下规则:

  • 所有源代码 (src/*/java) 作为多个文件夹一起使用,生成单个输出。
  • 清单全部合并到一个清单中。这允许产品风味具有不同的组件和/或权限,类似于构建类型。
  • 所有资源(Android res 和 assets)都使用覆盖优先级,其中 Build Type 覆盖 Product Flavor,后者覆盖主 sourceSet。
  • 每个 Build Variant 从资源中生成自己的 R 类(或其他生成的源代码)。变体之间没有任何共享。

这意味着您可以在 src 下创建一个包含每个风味名称的文件夹,并将您的自定义文件放入其中。如果所述文件是 AndroidManifest gradle 会将其与主清单中的清单合并。

于 2013-07-01T22:18:23.407 回答