首页 文章

如何使用gradle从.AAR Android库存档中排除文件

提问于
浏览
14

我正在尝试使用Android Studio和gradle为库Android项目创建AAR文件 .

我想从此存档中排除特定的文件夹和文件,但我找不到有效的解决方案 .

该项目有两种口味 .

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并查看包含的文件 .

我也在这里查看了文档:http://simpligility.github.io/android-maven-plugin/aar-mojo.html#configurations其中可能配置可能是一个解决方案,但我不知道如何使用它或如何前进 . 任何帮助将不胜感激 .

2 回答

  • 0

    认为它与this问题有关 . 通常你可以试试:

    • 源集排除

    • 包装选项

    • 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")
        }
    
  • 3

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

    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 Guideanswer from Xavier Ducrohet以及Gradle + Android, want to overwrite /assets with custom folder in buildFlavor .

相关问题