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

Android Studio с двумя файлами манифеста

У меня возникли проблемы с определением двух разных файлов манифеста для моих вкусов в Android Studio. Это моя текущая структура проекта:

Current project structure

AndroidManifest.xml в цвете free выглядит следующим образом:

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

AndroidManifest.xml в аромате main не имеет разрешений-применений, но содержит остальную часть кода манифеста, который разделяется между всеми вкусами.

AndroidManifest.xml в аромате pro выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="se.example.package">
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
</manifest>

build.gradle определяет два варианта, например

productFlavors {
    free {
        applicationId 'se.example.package.free'
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName '1.0'
    }
    pro {
        minSdkVersion 14
        applicationId 'se.example.package.pro'
        targetSdkVersion 21
        versionCode 2
        versionName '1.1'
    }
}

Результат, который я ожидаю, заключается в том, что разные вкусы определяют разные разрешения-разрешения. Это не тот случай. В результате в обоих вариантах только <uses-permission android:name="com.android.vending.CHECK_LICENSE" /> определяется как AndroidManifest.xml в профиле pro.

Я пробовал:

  • Очистить проект
  • Проект перестройки
  • Перезапустить Android Studio
  • Синхронизация gradle

Но без успеха. Как я могу это исправить? Любая помощь приветствуется.

РЕДАКТИРОВАТЬ 1

Я изменил местоположение каждого файла AndroidManifest.xml каждого из папок res в папку free и pro. Результат:

  • Про вкус показывает лицензионное разрешение, как ожидалось.
  • Бесплатный вкус показывает разрешения от AndroidManifest.xml файлы, лицензии и сетевые разрешения (должна быть только сеть)

Это похоже на проблему структуры проекта. Что с этим делать?

РЕДАКТИРОВАТЬ 2

Я вывел отчеты о слиянии, поскольку Commonsware намекнул, это отчеты о uses-permissions

Free:

uses-permission#com.android.vending.CHECK_LICENSE
ADDED from qwknoteGIT:licencing-library:unspecified:26:5
    android:name
        ADDED from qwknoteGIT:licencing-library:unspecified:26:22

Pro:

uses-permission#com.android.vending.CHECK_LICENSE
MERGED from qwknoteGIT:licencing-library:unspecified:26:5
4b9b3361

Ответ 1

Технический фон:

по этой ссылке объясняются методы и параметры, которые можно использовать для слияния манифестов: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-tools:node -markers

Одним из конкретных tools:node являются tools:node который указывает, как определенные XML-узлы в манифесте должны вести себя при объединении.

Решение:

чтобы получить некоторые разрешения для одного и другого в другом манифесте, добавьте ВСЕ необходимые вам права доступа к main а в манифесте вариантов удалите те, которые вам не нужны, как в примере ниже:

free удалить чек лицензии

<uses-permission
   android:name="com.android.vending.CHECK_LICENSE" 
   tools:node="remove"/>

Ответ 2

Ваша проблема исходит от библиотеки, а не от ваших вкусов. В частности, qwknoteGIT:licencing-library запрашивает CHECK_LICENSE.

Если вы не используете эту библиотеку во всех вариантах, используйте ароматизированный compile (например, proCompile), чтобы использовать эту библиотеку только в этом аромате.

Если вы используете библиотеку для всех вкусов, но убедитесь, что вам не нужно разрешение в одном цвете, что если в манифесте аромата можно использовать атрибут tools:node, чтобы заблокировать это разрешение, предоставленное библиотеки.

И манифест слияния - ваш друг.: -)

Ответ 3

Это должно решить проблему, по крайней мере. Я считаю полезным использовать конкретный манифест для каждого варианта. Ура! Он явно направляет файл манифеста под каждой папкой варианта.

    android {
      productFlavors {
        prod {
          manifest.srcFile "prod/AndroidManifest.xml"
        }
        dev {
          manifest.srcFile "dev/AndroidManifest.xml"
        }
      }
      ...

}

Ответ 4

Вы должны изменить свой код:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="se.example.package">

для

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.your.appid">

Ответ 5

В вашем приложении build.gradle

 android {
    productFlavors {
                bizdartFlavourNoCallLog {
            minSdkVersion 16
            applicationIdSuffix '.bizdart'
            targetSdkVersion 26
            dimension "tier"
            sourceSets {
                main {
                    manifest.srcFile "src/bizdartFlavourNoCallLog/AndroidManifest.xml"
                }
            }
            copy {
                from 'src/bizdartFlavourNoCallLog/'
                include '*.json'
                into '.'
                }
            }
       }
    }