14

我正在尝试使用 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 并查看包含的文件。

我还查看了此处的文档,其中配置可能是一种解决方案,但我不确定如何使用它或如何继续前进。任何帮助将不胜感激。

4

2 回答 2

4

认为与这个问题有关。一般来说,你可以尝试:

  • 源集排除
  • 包装选项
  • 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")
    }
于 2015-04-23T16:55:14.590 回答
0

我现在不能尝试,但这可能是我的方法:

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 Plugin User Guide来自 Xavier Ducrohet 的答案以及这个Gradle + Android,想要用 buildFlavor 中的自定义文件夹覆盖 /assets

于 2015-04-23T19:15:25.837 回答