olegvarmy
@olegvarmy
android developer

Как из android-library модуля собрать jar с зависимостями?

Есть gradle-модуль, который в свою очередь зависит от:
другого gradle - модуля,
aar - файла(google-play-services)
jar-файла(gson).
Мне нужно собрать из всего этого джарник со всеми зависимостями, то есть, в конечном jar должны быть class-файлы:
моих модулей,
google-play сервисов,
gson.
Делается это для того, чтобы была возможность подключения android-библиотеки как jar - файла (без обязательного использования gradle или maven, которые умеют подключать aar)
Как это сделать, я не знаю.
вот gradle.build
buildscript {
    repositories {
        mavenCentral()
    }
    
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
        classpath 'com.github.dcendents:android-maven-plugin:1.2'
    }
}

apply plugin: 'com.android.library'
apply plugin: 'android-maven'

group = "com.foo"
version = "1.0"

android {
    compileSdkVersion 21
    buildToolsVersion '21.1.2'

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['res']
        }
    }

    defaultConfig {
        minSdkVersion 5
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

repositories {
    jcenter()
    mavenLocal()
    mavenCentral()
}

dependencies {
    compile project (':amlogger')
    compile 'com.google.android.gms:play-services:6.5.87'
    compile 'com.google.code.gson:gson:2.3'
}
  • Вопрос задан
  • 3965 просмотров
Решения вопроса 1
olegvarmy
@olegvarmy Автор вопроса
android developer
Ну, собственно, сам и отвечу
android.libraryVariants.all { variant ->
    tasks.create(name: "fatJar${variant.name.capitalize()}", type: Jar, dependsOn: assembleRelease) {
        doFirst {
            baseName = variant.name
            destinationDir = file('output')
            duplicatesStrategy = DuplicatesStrategy.EXCLUDE
            from zipTree(tasks.getByName("package${variant.name.capitalize()}Jar").outputs.files.singleFile)
            def closure = { file ->
                if (file.name.endsWith('.aar')) {
                    println file.name
                    List<File> listJarFiles = zipTree(file).findAll { fileInAar ->
                        fileInAar.name.endsWith('.jar')
                    }
                    def listClassesFilesFromJars = listJarFiles.collect {
                        zipTree(it)
                    }
                    listClassesFilesFromJars
                } else if (file.name.endsWith('.jar')) {
                    return zipTree(file)
                }
            }
            from configurations.compile.files.collect(closure)
            from configurations.getByName("${variant.name}Compile").files.collect(closure)

        }
    }
}

добавляет таск с названием fatJar{variantName}
каждый таск проходит по всем зависимостям compile и {variantName}Compile, собирает jar и aar- файлы (если файл aar - то из него достается classes.jar + джарники из libs) и все это упаковывается в файл с названием {variantName}.jar

и второй скрипт, который делает то же самое, только не запаковывает все в fatJar, а собирает все библиотеки в одну директорию
android.libraryVariants.all { variant ->
    tasks.create(name: "collectJars${variant.name.capitalize()}", type: Copy, dependsOn: assembleRelease) {
        delete file("output/outputJars${variant.name.capitalize()}")
        duplicatesStrategy = DuplicatesStrategy.EXCLUDE
        from tasks.getByName("package${variant.name.capitalize()}Jar").outputs.files.singleFile, {
            rename 'classes.jar', variant.name + "-" + project.version + ".jar"
        }
        def closure = { file ->
            if (file.name.endsWith('.aar')) {
                println file.name
                zipTree(file).findAll { fileInAar ->
                    fileInAar.name.endsWith('.jar')
                }.each { f ->
                    if(f.name == "classes.jar") {
                        from f, {
                            println f.name
                            rename "classes", file.name.substring(0, file.name.lastIndexOf("."))
                        }
                    } else {
                        from f
                    }

                }
            } else if (file.name.endsWith('.jar')) {
                from file
            }
        }
        configurations.compile.files.collect(closure)
        configurations.getByName("${variant.name}Compile").files.collect(closure)
        into 'output/outputJars' + variant.name.capitalize()
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы