Извлекать jars в папку libs из другого каталога перед сборкой приложения для Android

#android #gradle

#java #Android #gradle #android-gradle-плагин

Вопрос:

У меня есть проект Android, который зависит от внешнего файла jar, т. Е. A.jar .

Я настроил свой Android build.gradle на первую сборку проекта, который строит A.jar . Затем сборка Android продолжается.

Каков наилучший способ скопировать jar из папки сборки в папку библиотеки Android projects после сборки jar?

Таким образом, сборка должна выполняться следующим образом…

Создайте Jar> Скопируйте Jar в библиотеки> Создайте проект Android.

Я не использую Android Studio, поэтому я настраиваю свой проект только с помощью gradle config file манипуляции.

Проект, который в настоящее время создает jar, уже указан как зависимость в app/build.gradle

 apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "saf.mobilebeats2"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        debug {
            applicationIdSuffix ".debug"
            debuggable true
        }
    }
}

dependencies {
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    implementation 'com.android.support:appcompat-v7:26.0.0'
    implementation project(':dawcore')
    // runtime files('../DawCore/build/libs/DawCore.jar')
}
  

Ответ №1:

Поскольку вы не используете Android Studio, а модуль зависимостей находится в каком-то другом месте, где он используется в некоторых других проектах, вы можете рассмотреть возможность копирования jar в свой libs каталог после того, как модуль зависимостей завершит сборку и создаст jar для копирования. Таким образом, общее выполнение выглядит следующим образом:

  • Задача 1. Создайте модуль зависимостей
  • Задача 2. Скопируйте файл jar в определенное место, которое будет использоваться вашим приложением для Android.
  • Задача 3. При сборке вашего приложения для Android скопируйте файл jar из этого конкретного местоположения в свой libs каталог.
  • Задача 4. Создайте jar с помощью compile files('libs/jar-from-dependency.jar')

Теперь для задач 1 и 2: добавьте следующее в build.gradle файл вашего модуля зависимостей. Следовательно, после сборки модуля зависимостей это скопирует jar в местоположение, указанное в задаче копирования. Проверьте функцию копирования ниже, чтобы получить представление о том, как написать функцию копирования в gradle.

 apply plugin: 'java'

task finalize << {
    println('Here use the copyTask to copy the jar to a specific directory after each build of your library module')
}

build.finalizedBy(finalize)
// compileJava.finalizedBy(copyJarToAndroid) <-- In your case
  

Вот документ для необходимых функций, связанных с этим.

Для задачи 3: теперь задача проста. Перед сборкой с помощью gradle вам необходимо скопировать jar из этого конкретного местоположения в свой проект приложения для Android. Вот как вы можете инициировать задачу копирования перед сборкой своего проекта.

 task copyFiles(type: Copy) {
    description = 'Copying the jar'
    from 'your/jar/directory'
    into project(':Path:To:ModuleFrom:Settings.gradle').file('./libs')
    include 'jar-from-dependency.jar'
}

project.afterEvaluate {
    preBuild.dependsOn copyFiles
}

clean.dependsOn copyFiles
clean.mustRunAfter copyFiles
  

Это запустит copyFiles задачу при запуске gradle clean.

Следовательно, для задачи 4: добавьте банку в свой dependencies раздел.

 dependencies {
    // ... Other dependencies
    compile files('libs/jar-from-dependency.jar')
}
  

Комментарии:

1. Другой проект gradle, который создает jar, отделен от проекта Android, и другие проекты Java используют его, я не думаю, что было бы уместно поместить его в каталог проекта Android.

2. Я вижу. Позвольте мне обновить ответ, чтобы он соответствовал вашим требованиям.

3. Сборка проекта выполняется как Build Jar> copy jar> Build Android. Вызываемая в настоящее время задача assembly в сборке Android сначала создает jar. Так не будет ли решение, которое вы предоставили с помощью copyTask, действовать как Copy Jar> Build Jar> Build Android?

4. Да, Copy Jar > Build Jar > Build Android я об этом подумал.

5. Мне требуется, чтобы jar создавался перед копированием, так как я мог бы обновлять код и в этом проекте.

Ответ №2:

самым простым может быть удаление прямой зависимости модуля:

 // implementation project(':dawcore')
  

a) и настройте локальный flatDir репозиторий, который Android Studio будет указан как «Репозиторий библиотеки»:

 repositories {
    flatDir { dirs "/home/user/project/dawcore/build/outputs/aar" }
}
  

тогда можно зависеть от артефактов библиотечного модуля:

 dependencies {
    implementation "com.acme.dawcore:dawcore-debug:1.0.0@aar"
    // implementation "com.acme.dawcore:dawcore-release:1.0.0@aar"
}
  

б) или настройте libs каталог как flatDir :

 repositories {
    flatDir { dirs "libs" }
}
  

и добавьте Copy задачу в библиотеку build.gradle :

 tasks.whenTaskAdded { task ->
    if (task.name == 'assembleDebug' || task.name == 'assembleRelease') {
        task.finalizedBy copyArtifacts
    }
}

// dawcore:copyArtifacts
task copyArtifacts(type: Copy) {
    from("$buildDir/outputs/aar") {
        include "*.aar"
    }
    from("$buildDir/outputs/jar") {
        include "*.jar"
    }
    into file("${rootProject.projectDir}/mobile/libs")
    doLast {
        def path = ant.path {
            fileset(dir: "${rootProject.projectDir}/mobile/libs", includes: "*.aar, *.jar")
        }
        path.list().each {
            println it
        }
    }
}
  

Комментарии:

1. Что именно представляет это значение, предоставленное «реализации»?

2. @ScottF артефакт сборки проекта библиотеки. для AAR одной потребности flatDir , пока JAR можно скопировать. проблема в том, что нет «Перемещения», а только Copy amp; Delete задачи.

3. Извините, я все еще в замешательстве: s. Что конкретно представляют строковый литерал в поле «flatDir» и строковый литерал в поле «реализация».

4. @ScottF flatDir — это местоположение локального AAR репозитория, где ожидаются частные зависимости. эта строка: group (имя пакета), module (имя файла), version (версия библиотеки), @ формат пакета библиотеки.