[英]How to exclude a file from an .AAR Android library archive with gradle
我正在尝试使用Android Studio和Gradle为图书馆的Android项目创建AAR文件。
我想从此存档中排除特定的文件夹和文件,但找不到有效的解决方案。
该项目有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:+'
}
一般来说,我已经做了很多实验。 我试过了PackagingOptions,排除在sourceSets中,但似乎没有任何效果。 我要实现的目标不包括在.AAR档案中,例如comments.txt文件和“ assets”文件夹(这是一个可选文件夹)。 我每次通过将.AAR文件重命名为zip并查看其中包含的文件来进行检查。
我也在这里查看了文档,其中的配置可能是一种解决方案,但是我不确定如何使用它或如何向前发展。 任何帮助将不胜感激。
认为与这个问题有关。 通常,您可以尝试:
但是我不能让他们两个都工作。
也就是说,您可以像这样进行一些丑陋的修改:
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")
}
我现在无法尝试,但这可能是我的方法:
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']
}
}
同样,我无法尝试,所以这可能完全是胡说。 想法是不排除内容,而仅包含您想要的风味文件/目录。 这可能会导致每种口味的文件/文件夹重复!
作为来源,我建议: Gralde插件用户指南 , Xavier Ducrohet的答案以及这个Gradle + Android,都希望使用buildFlavor中的自定义文件夹覆盖/ assets 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.