Я пытаюсь создать библиотеку Android, и у меня есть следующее:
- Github Repo for the library
- Library 1: Kotlin native/multiplatform code that can compile to Android and iOS
- Библиотека 2: код Kotlin / JVM в зависимости от библиотеки 1
- Пример приложения: приложение, использующее библиотеку 2 и библиотеку 1
- Personal Android Project
- Dependent on the Github Library above
В моем личном проекте у меня только:
implementation 'com.github.username:myrepo:0.5'
Проблемы
Частный проект Android загружает библиотеку Android (Библиотека 2), но мультиплатформенные модели и функции котлина (Библиотека 1) недоступны.
Обратите внимание, что пример приложения библиотеки работает нормально. Я подозреваю, что jitpack.io неправильно публикует артефакты. Есть идеи, как это исправить? Что нужно сделать с файлами gradle, чтобы решить проблему?
Я бы хотел, чтобы мультиплатформенная библиотека была опубликована отдельно. Я пытался получить к нему доступ из мультиплатформенного модуля Kotlin, но получаю сообщение «Невозможно разрешить зависимости». Вот что я пробовал:
implementation 'com.github.username.myrepo:library1_moduleName:0.1'
Мультиплатформенность Gradle для библиотеки 1:
plugins {
kotlin("multiplatform")
}
kotlin {
//select iOS target platform depending on the Xcode environment variables
val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
::iosArm64
else
::iosX64
iOSTarget("ios") {
binaries {
framework {
baseName = "library1"
freeCompilerArgs.add("-Xobjc-generics")
}
}
}
jvm("android")
sourceSets["commonMain"].dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
}
sourceSets["androidMain"].dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib")
}
}
val packForXcode by tasks.creating(Sync::class) {
val targetDir = File(buildDir, "xcode-frameworks")
/// selecting the right configuration for the iOS
/// framework depending on the environment
/// variables set by Xcode build
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val framework = kotlin.targets
.getByName<KotlinNativeTarget>("ios")
.binaries.getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
from({ framework.outputDirectory })
into(targetDir)
/// generate a helpful ./gradlew wrapper with embedded Java path
doLast {
val gradlew = File(targetDir, "gradlew")
gradlew.writeText(
"#!/bin/bash\n"
+ "export 'JAVA_HOME=${System.getProperty("java.home")}'\n"
+ "cd '${rootProject.rootDir}'\n"
+ "./gradlew \$@\n"
)
gradlew.setExecutable(true)
}
}
tasks.getByName("build").dependsOn(packForXcode)
Gradle для библиотеки 2
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
}
compileSdkVersion 29
buildToolsVersion "29.0.0"
defaultConfig {
minSdkVersion 19
targetSdkVersion 29
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
api project(":library1")
}