#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 (версия библиотеки),@
формат пакета библиотеки.