使用Gradle

时间:2016-06-28 09:33:27

标签: android gradle android-gradle android-library

像许多其他人一样,我正在尝试从我的多模块Android项目中生成一个AAR文件。

根据this post,由于各种限制(res&依赖关系管理,清单合并......),Android团队目前不支持它。

我正在尝试提出适合我需求的自己的解决方案。我知道我没有重复的资源,外部依赖项(如支持库)是由人们使用我的lib提供的。

我的结构类似于:

/root
|- lib1
|- lib2
|- lib3

为了实现我的目标,我创建了另一个名为distribute的库模块,其中包含所有其他模块。然后,我可以共享生成的distribute.aar文件。

/root
|- lib1
|- lib2
|- lib3
|- distribute

这是build.gradle模块的distribute文件:

apply from: '../common.gradle' // This simply configure properties shared accross all modules
apply plugin: 'com.android.library'

def allModules = rootProject.allprojects.collect { it.name } - [rootProject.name, name]
def whiteLabelDependencies = [
        whiteLabel1: allModules - ['lib2'],
        whiteLabel2: allModules,
]

android {
    def buildTypeNames = buildTypes.collect { it.name }
    def whiteLabelTypes = productFlavors.findAll { 'type'.equals(it.dimension) }.collect { it.name }

    whiteLabelDependencies.each { whiteLabel ->
        def modules = whiteLabel.value
        def whiteLabelName = whiteLabel.key

        whiteLabelTypes.each { whiteLabelType ->
            def productFlavor = whiteLabelName + whiteLabelType.capitalize()

            buildTypeNames.each { buildType ->
                def sourceSet = productFlavor + buildType.capitalize()
                def folders = ['main', whiteLabelName, whiteLabelType, productFlavor, whiteLabelName + buildType.capitalize(), sourceSet]

                android.sourceSets.maybeCreate(sourceSet)
                android.sourceSets.getByName(sourceSet) {
                    assets.srcDirs = getPathsList(modules, folders, 'assets')
                    java.srcDirs = getPathsList(modules, folders, 'java')
                    res.srcDirs = getPathsList(modules, folders, 'res')
                    resources.srcDirs = getPathsList(modules, folders, 'resources')
                }
            }
        }
    }
}

afterEvaluate {
    whiteLabelDependencies.each { whiteLabel ->
        def assembleTask = rootProject.tasks.getByPath(":${name}:assemble${whiteLabel.key.capitalize()}")
        assembleTask.dependsOn whiteLabel.value.collect { ":${it}:assemble${whiteLabel.key.capitalize()}" }
    }
}

dependencies {
    whiteLabelDependencies.each { whiteLabel ->
        whiteLabel.value.each {
            "${whiteLabel.key}Compile" project(path: ":${it}", configuration: project.whiteLabelConfigurationName)
        }
    }
}

def List<File> getPathsList(List<String> modules, List<String> folders, String sourceType) {
    return modules.collect { module ->
        folders.collect { folder ->
            new File("${rootProject.rootDir}/${module}/src/${folder}/${sourceType}")
        }.findAll {
            it.exists()
        }
    }.flatten()
}

这似乎几乎可以工作,除了在运行时,应用程序崩溃,因为它找不到每个R模块的libx类,只找到distribute模块中的一个。有没有办法强制Gradle包含每个模块的R类。

我知道每个模块的文件都是在$module/build/generated/source/r/$whiteLabel/$buildType/$package/$module/R.java生成的,但我不知道如何包含它并防止重复的类(每个模块可能依赖于另一个模块)。

0 个答案:

没有答案