Gradle:如何自定义Android清单权限?

35

在我的构建系统中,我需要构建几个不同的应用变体,每个变体请求不同的权限集。如何使用Gradle完成这一操作,而无需调用单独的脚本?

1个回答

61

我通过在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 Tools Project Site上Gradle Plugin User Guide的介绍:
类似于Build Types,Product Flavors也通过它们自己的sourceSet贡献代码和资源。
以下规则用于处理构建单个APK所使用的所有sourceSets: - 所有源代码(src/*/java)一起使用作为多个文件夹生成单个输出。 - 所有清单(Manifests)都合并成一个单独的清单。这允许Product Flavors具有不同的组件和/或权限,类似于Build Types。 - 所有资源(Android资源和资产)使用覆盖优先级使用,其中Build Type覆盖Product Flavor,Product Flavor覆盖主sourceSet。 - 每个Build Variant从资源中生成自己的R类(或其他生成的源代码)。没有任何内容在变体之间共享。
这意味着您可以在src下创建每个flavor名称的文件夹,并将自定义文件放入其中。如果该文件是AndroidManifest,则gradle将其与主清单合并。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接