Как исключить файл из архива библиотеки Android.AAR с помощью gradle
Я пытаюсь создать файл AAR для проекта библиотеки Android, используя Android Studio и Gradle.
Я хочу исключить из этого архива определенные папки и файлы, но не могу найти работающее решение.
Проект имеет 2 вкуса.
app/
|--libs/
|--src/
|--flavour1/
| |--java/
| |--a1/
| | |--class_File1.java
|--flavour2/
| |--java/
| |--a1/
| | |--class_File1.java
|--main/
|--java/
| |--...
|--res/
| |--raw/
| | |--comments.txt
| |--...
|--AndroidManifest.xml
и я использую файл build.gradle, как этот
apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
minSdkVersion 10
targetSdkVersion 21
}
packagingOptions {
exclude 'assets'
exclude '**/comments.txt'
}
sourceSets {
flavour1 {
resources {
exclude '**/comments.txt'
}
}
flavour2 {
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
productFlavors {
flavour1 {
packagingOptions {
exclude 'assets'
exclude 'res/raw/comments.txt'
}
}
flavour2 {
}
}
}
dependencies {
compile 'com.google.android.gms:play-services:+'
}
Вообще говоря, я много экспериментировал. Я пробовал packageOptions, исключение в sourceSets, но, похоже, ничего не работает. То, что я пытаюсь достичь, не включает, например, в архив .AAR файл comments.txt и папку "assets", которая является необязательной папкой. Я каждый раз проверяю файл .AAR, переименовывая его в zip и просматривая включенные файлы.
Я также изучил документацию здесь, где, возможно, конфигурации могут быть решением, но я не уверен, как его использовать или как двигаться вперед. Любая помощь будет оценена.
Ответы
Ответ 1
Подумайте, что это связано с этой проблемой. Обычно вы можете попробовать:
- Исходный набор исключает
- Параметры упаковки
- Параметры Aapt
Я не мог заставить их работать.
Тем не менее, вы можете сделать некоторые уродливые хаки вроде этого:
def filterVariant = { variantToFilter, filterTask->
def vv = android.sourceSets."${variantToFilter}".res.srcDirs
println "${variantToFilter} --> ${vv*.toString()}"
def variantRes = android.sourceSets."${variantToFilter}".res
variantRes.srcDirs.each{ resDir->
def filterOutput = "${buildDir}/res-filter"
if (resDir.toString().contains(filterOutput)) {
return
}
println "begin filter ${resDir} to ${filterOutput}/${variantToFilter}"
filterTask.from fileTree(dir: resDir, exclude: '**/comment.txt')
filterTask.into "${filterOutput}/${variantToFilter}"
variantRes.srcDirs = ["${filterOutput}/${variantToFilter}"]
}
}
project.task('filterMainResources', type: Copy) {
filterVariant 'main', it
}
android.libraryVariants.all{ variant ->
project.task("filter${variant.name}Resources", type: Copy) { filterTask ->
filterVariant "${variant.name}", filterTask
filterTask.dependsOn "filterMainResources"
}
variant.mergeResources.dependsOn("filter${variant.name}Resources")
}
Ответ 2
Я не могу попробовать прямо сейчас, но это, вероятно, будет моим подходом:
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
aidl.srcDirs = ['src']
resources.srcDirs = ['src']
renderscript.srcDirs = ['src']
java.srcDirs = ['src']
res.srcDirs = ['res']
}
flavor1 {
java.srcDirs = ['src/main/java', 'src/flavor1/java']
res.srcDirs = ['src/flavor1/res'] //this differs from your structure
assets.srcDirs = []
}
flavor2 {
java.srcDirs = ['src/main/java', 'src/flavor2/java']
res.srcDirs = ['src/flavor2/res'] //this differs from your structure
assets.srcDirs = ['src/main/res/raw']
}
}
Опять же, я не мог попробовать, так что это может быть полная глупость. Идея заключалась в том, чтобы не исключать вещи, но включать только файлы /dirs, которые вы хотите в себе. Это может привести к дублированию файлов/папок на каждый аромат!
В качестве источников я бы рекомендовал: Руководство пользователя плагина Gralde, ответ от Xavier Ducrohet, а также этот Gradle + Android, хотите перезаписать/активы с помощью настраиваемой папки в buildFlavor.