Подтвердить что ты не робот

Переопределение префикса пакета разрешений GCM с Gradle

У меня есть проект Gradle Android, в котором есть 4 аромата продукта (у каждого есть свое уникальное имя пакета). Файл build.gradle очень прост:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}

apply plugin: 'android'

repositories {
    mavenCentral()
}

dependencies {
    // All dependencies here
    // ...
}

android {
    // Usual stuff goes here

    productFlavors {
        flav1 {
            packageName 'com.company.flav1'
            versionName calcVersion()
        }

        flav2 {
            packageName 'com.company.flav2'
            versionName calcVersion()
        }

        flav3 {
            packageName 'com.company.flav3'
            versionName calcVersion()
        }

        flav4 {
            packageName 'com.company.flav4'
            versionName calcVersion()
        }
    }

    // Other configurations
    // ...
}

Все идет хорошо, и необходимые ресурсы объединяются, e.t.c. Теперь я пытаюсь реализовать функцию Push Notification с помощью GCM. И согласно документации, я должен объявить разрешение для своего приложения, например:

<permission android:name="com.company.flav.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
<uses-permission android:name="com.company.flav.permission.C2D_MESSAGE" />

Но я использую один файл манифеста для всех 4 приложений (они отличаются только ресурсами приложений и некоторыми настройками, которые помещаются в папку с ресурсами).

Итак, мой вопрос: как я могу переопределить эти разрешения для каждого продукта?

4b9b3361

Ответ 1

Я использовал:

<permission android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />

в манифесте Android - это, по-видимому, правильно разрешено.

Ответ 2

Вы можете использовать какое-то наследование AndroidManifest.

The following rules are used when dealing with all the sourcesets used to build a single APK:

 - All source code (src/*/java) are used together as multiple folders generating a single output.
 - *Manifests are all merged together into a single manifest. This allows Product Flavors to have different components and/or permissions, similarly to Build Types.*
 - All resources (Android res and assets) are used using overlay priority where the Build Type overrides the Product Flavor, which overrides the main sourceSet.
 - Each Build Variant generates its own R class (or other generated source code) from the resources. Nothing is shared between variants.

код:

  productFlavors {
        flav1 {
            packageName 'com.company.flav1'
            versionName calcVersion()
        }

        flav2 {
            packageName 'com.company.flav2'
            versionName calcVersion()
        }

        flav3 {
            packageName 'com.company.flav3'
            versionName calcVersion()
        }

        flav4 {
            packageName 'com.company.flav4'
            versionName calcVersion()
        }
    }

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

        flav1 {
            manifest.srcFile 'flavor1/AndroidManifest.xml'
        }

        flav2 {
            manifest.srcFile 'flavor2/AndroidManifest.xml'
        }

        ...
    }

Где flavor1 и flavor2 - папки в корневой папке проекта.

В flavor1/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.sample.someapp"
      android:versionCode="1"
      android:versionName="1.0">

<permission android:name="com.company.flav1.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
<uses-permission android:name="com.company.flav1.permission.C2D_MESSAGE" />  

</manifest>

В flavor2/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.sample.someapp"
      android:versionCode="1"
      android:versionName="1.0">

<permission android:name="com.company.flav2.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
<uses-permission android:name="com.company.flav2.permission.C2D_MESSAGE" />  

</manifest>

И в корне AndroidManifest все остальное.

Ответ 3

Теперь AndroidManifest.xml сливается правильно с gradle 1.11, используя настройки по умолчанию.