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
Ответы
Ответ 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 '.'
}
}
}
}