Использование библиотеки Android в многоплатформенной библиотеке Kotlin

У меня есть три цели commonMain / androidMain / iOSMain соответственно. Потому что мне нужно получить доступ к активам на устройствах Android в модуле androidMain. Я обнаружил, что не могу использовать Android API ... Следующее является частью моего build.gradle.kts:

import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
    id("com.android.application")
    kotlin("multiplatform")
}
repositories {
    google()
    jcenter()
}

android {
    compileSdkVersion(29)
    buildToolsVersion("29.0.1")
    defaultConfig {
        minSdkVersion(19)
        targetSdkVersion(29)
    }
    sourceSets {
        getByName("main") {
            manifest.srcFile("src/androidMain/AndroidManifest.xml")
            java.srcDirs(file("src/androidMain/kotlin"))
            res.srcDirs(file("src/androidMain/res"))
        }
    }
}

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 = "Example"
            }
        }
    }

    jvm("android")

    sourceSets["commonMain"].dependencies {
        implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
    }

    sourceSets["androidMain"].dependencies {
        implementation("org.jetbrains.kotlin:kotlin-stdlib")
    }

    sourceSets["commonTest"].dependencies {
        implementation ("org.jetbrains.kotlin:kotlin-test")
        implementation ("org.jetbrains.kotlin:kotlin-test-junit")
    }
}

Как я могу использовать библиотеку Android в androidMain? Например,

val inputStream = assets.open("Test.txt")

person James Fu    schedule 28.10.2019    source источник
comment
Может быть, поможет этот абзац?   -  person Artyom Degtyarev    schedule 28.10.2019
comment
Я обновил build.gradle.kts, как указано выше. И я все еще не могу использовать val inputStream = assets.open (Test.txt) в androidMain. Что не так с моей конфигурацией мультиплатформенности?   -  person James Fu    schedule 29.10.2019
comment
Похоже, что в примере, который вы используете, нет возможности использовать Android SDK. Я думаю, вы пытаетесь использовать этот образец? Там SDK доступен только для модуля app, но не для SharedCode. Возможно, эта статья сможет помогите разобраться с этой проблемой, пожалуйста, посмотрите.   -  person Artyom Degtyarev    schedule 29.10.2019
comment
Да, я бы хотел использовать Android SDK в androidMain в SharedCode вместо приложения. Я прочитал предоставленную вами статью, но я все еще не могу использовать Android SDK в SharedCode ... Вы пробовали, это возможно? Потому что я могу получить доступ к пакету для iOS с помощью мультиплатформенного SDK kotlin, но не могу получить доступ для Android ... это действительно странно ... Я просто хочу получить доступ к хранилищу из SharedCode.   -  person James Fu    schedule 29.10.2019
comment
Затем попробуйте добавить зависимость в скрипт SharedCode, как в app. Кроме того, я лично рекомендую вам присоединиться к Kotlin Community Slack (получите приглашение здесь ). Есть много пользователей Kotlin / Native и MPP, которые могут поделиться большим опытом, чем я.   -  person Artyom Degtyarev    schedule 29.10.2019
comment
Спасибо за вашу помощь. Я присоединяюсь к сообществу, которое вы рекомендуете. Между прочим, я заменяю целевой jvm (android) на android (), и, похоже, он работает, но вызывает другую проблему ... IDE заявила, что функция многоплатформенных проектов является экспериментальной и должна быть включена явно. Я думал, что мультиплатформа kotlin не такая стабильная: /   -  person James Fu    schedule 30.10.2019


Ответы (2)


Обязательно создайте AndroidManifest.xml с именем пакета (модуль библиотеки), отличным от имени пакета (модуль приложения), в каталоге SharedCode / src. И, как сказала Надя Роби, используйте android () вместо jvm ('android'). Также проверьте приведенные ниже ссылки:

person Ali Almesbah    schedule 06.02.2020

Попробуйте использовать android() вместо jvm('android') для загрузки цели из предустановок.

person Róbert Nagy    schedule 06.11.2019
comment
Да, я перешел с jvm ('android') на android (), но IDE выдает другую ошибку. Он сказал, что функция многоплатформенных проектов является экспериментальной и должна быть включена явно в моем фактическом классе Android. Есть ли какой-либо рабочий пример в GitHub с использованием API Android в качестве справочника? - person James Fu; 07.11.2019
comment
Попробуйте добавить enableFeaturePreview('GRADLE_METADATA') в settings.gradle вашего проекта - person Róbert Nagy; 07.11.2019