JetBrains / skiko

Kotlin Multiplatform bindings to Skia
Apache License 2.0
1.8k stars 110 forks source link

SkiaAndroidSample build failed. (Task :mergeDebugJniLibFolders FAILED) #934

Open ijero opened 3 months ago

ijero commented 3 months ago

Gradle version: gradle-8.7-all Gradle JDK: corretto-22.0.1

build.gradle.kts:

buildscript {
    repositories {
        google()
        mavenCentral()
        maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
    }

    dependencies {
        classpath("com.android.tools.build:gradle:8.4.1")
    }
}

repositories {
    mavenLocal()
    google()
    mavenCentral()
    maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
}

plugins {
    id("com.android.application")  version "8.4.1"
    kotlin("android") version "1.9.24"
}

val skikoNativeX64 by configurations.creating
val skikoNativeArm64 by configurations.creating

val jniDir = "${projectDir.absolutePath}/src/main/jniLibs"

// TODO: filter .so files only.
val unzipTaskX64 = tasks.register("unzipNativeX64", Copy::class) {
    destinationDir = file("$jniDir/x86_64")
    from(skikoNativeX64.map { zipTree(it) })
}

val unzipTaskArm64 = tasks.register("unzipNativeArm64", Copy::class) {
    destinationDir = file("$jniDir/arm64-v8a")
    from(skikoNativeArm64.map { zipTree(it) })
}

android {
    compileSdk = 31

    defaultConfig {
        minSdk = 27
        targetSdk = 31
        versionCode = 1
        versionName = "1.0"

        applicationId = "org.jetbrains.skiko.sample"

        ndk {
            abiFilters += listOf("x86_64", "arm64-v8a")
        }
    }

    buildTypes {
        debug {
            isDebuggable = true
        }
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_21
        targetCompatibility = JavaVersion.VERSION_21
    }
    namespace = "org.jetbrains.skiko.sample"
}

var version = if (project.hasProperty("skiko.version")) {
  project.properties["skiko.version"] as String
} else {
  "0.0.0-SNAPSHOT"
}

// ./gradlew -Pskiko.android.enabled=true \
//    publishSkikoJvmRuntimeAndroidX64PublicationToMavenLocal \
//    publishSkikoJvmRuntimeAndroidArm64PublicationToMavenLocal \
//    publishAndroidPublicationToMavenLocal
dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0")
    implementation("org.jetbrains.skiko:skiko-android:$version")

    skikoNativeX64("org.jetbrains.skiko:skiko-android-runtime-x64:$version")
    skikoNativeArm64("org.jetbrains.skiko:skiko-android-runtime-arm64:$version")
}

tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile>().configureEach {
    dependsOn(unzipTaskX64)
    dependsOn(unzipTaskArm64)
}

tasks.withType<Copy> {
    // This line needs to properly merge MANIFEST files from jars into dex
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

gradle.properties:

# android.useAndroidX=true
android.defaults.buildfeatures.buildconfig=true
android.nonFinalResIds=false
android.nonTransitiveRClass=false
skiko.version=0.8.5

Build log:

Executing tasks: [:assembleDebug] in project D:\work\kmm\skiko\samples\SkiaAndroidSample

> Configure project :
AGPBI: {"kind":"warning","text":"The option setting 'android.defaults.buildfeatures.buildconfig=true' is deprecated.\nThe current default is 'false'.\nIt will be removed in version 9.0 of the Android Gradle plugin.\nYou can resolve this warning in Android Studio via `Refactor` > `Migrate BuildConfig to Gradle Build Files`","sources":[{}]}
Configuration 'skikoNativeX64' was resolved during configuration time.
This is a build performance and scalability issue.
See https://github.com/gradle/gradle/issues/2298
Run with --info for a stacktrace.
Configuration 'skikoNativeArm64' was resolved during configuration time.
This is a build performance and scalability issue.
See https://github.com/gradle/gradle/issues/2298
Run with --info for a stacktrace.
Kotlin does not yet support 22 JDK target, falling back to Kotlin JVM_21 JVM target

> Task :preBuild UP-TO-DATE
> Task :preDebugBuild UP-TO-DATE
> Task :mergeDebugNativeDebugMetadata NO-SOURCE
> Task :checkKotlinGradlePluginConfigurationErrors
> Task :generateDebugBuildConfig UP-TO-DATE
> Task :checkDebugAarMetadata UP-TO-DATE
> Task :generateDebugResValues UP-TO-DATE
> Task :mapDebugSourceSetPaths UP-TO-DATE
> Task :generateDebugResources UP-TO-DATE
> Task :mergeDebugResources UP-TO-DATE
> Task :createDebugCompatibleScreenManifests UP-TO-DATE
> Task :extractDeepLinksDebug UP-TO-DATE
> Task :processDebugMainManifest UP-TO-DATE
> Task :processDebugManifest UP-TO-DATE
> Task :processDebugManifestForPackage UP-TO-DATE
> Task :processDebugResources UP-TO-DATE
> Task :unzipNativeArm64
> Task :unzipNativeX64

> Task :compileDebugKotlin UP-TO-DATE
Kotlin does not yet support 22 JDK target, falling back to Kotlin JVM_21 JVM target

> Task :javaPreCompileDebug UP-TO-DATE
> Task :compileDebugJavaWithJavac UP-TO-DATE
> Task :mergeDebugShaders UP-TO-DATE
> Task :compileDebugShaders NO-SOURCE
> Task :generateDebugAssets UP-TO-DATE
> Task :mergeDebugAssets UP-TO-DATE
> Task :compressDebugAssets UP-TO-DATE
> Task :desugarDebugFileDependencies UP-TO-DATE
> Task :dexBuilderDebug UP-TO-DATE
> Task :mergeDebugGlobalSynthetics UP-TO-DATE
> Task :processDebugJavaRes UP-TO-DATE
> Task :mergeDebugJavaResource UP-TO-DATE
> Task :mergeDebugStartupProfile UP-TO-DATE
> Task :checkDebugDuplicateClasses
> Task :mergeDebugJniLibFolders FAILED
> Task :mergeLibDexDebug UP-TO-DATE
> Task :mergeProjectDexDebug UP-TO-DATE
> Task :validateSigningDebug UP-TO-DATE
> Task :writeDebugAppMetadata UP-TO-DATE
> Task :writeDebugSigningConfigVersions UP-TO-DATE
> Task :mergeExtDexDebug

FAILURE: Build failed with an exception.

* What went wrong:
Some problems were found with the configuration of task ':mergeDebugJniLibFolders' (type 'MergeSourceSetFolders').
  - Gradle detected a problem with the following location: 'D:\work\kmm\skiko\samples\SkiaAndroidSample\src\main\jniLibs'.

    Reason: Task ':mergeDebugJniLibFolders' uses this output of task ':unzipNativeArm64' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.

    Possible solutions:
      1. Declare task ':unzipNativeArm64' as an input of ':mergeDebugJniLibFolders'.
      2. Declare an explicit dependency on ':unzipNativeArm64' from ':mergeDebugJniLibFolders' using Task#dependsOn.
      3. Declare an explicit dependency on ':unzipNativeArm64' from ':mergeDebugJniLibFolders' using Task#mustRunAfter.

    For more information, please refer to https://docs.gradle.org/8.7/userguide/validation_problems.html#implicit_dependency in the Gradle documentation.
  - Gradle detected a problem with the following location: 'D:\work\kmm\skiko\samples\SkiaAndroidSample\src\main\jniLibs'.

    Reason: Task ':mergeDebugJniLibFolders' uses this output of task ':unzipNativeX64' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.

    Possible solutions:
      1. Declare task ':unzipNativeX64' as an input of ':mergeDebugJniLibFolders'.
      2. Declare an explicit dependency on ':unzipNativeX64' from ':mergeDebugJniLibFolders' using Task#dependsOn.
      3. Declare an explicit dependency on ':unzipNativeX64' from ':mergeDebugJniLibFolders' using Task#mustRunAfter.

    For more information, please refer to https://docs.gradle.org/8.7/userguide/validation_problems.html#implicit_dependency in the Gradle documentation.

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.

* Exception is:
org.gradle.internal.execution.WorkValidationException: Some problems were found with the configuration of task ':mergeDebugJniLibFolders' (type 'MergeSourceSetFolders').
  - Gradle detected a problem with the following location: 'D:\work\kmm\skiko\samples\SkiaAndroidSample\src\main\jniLibs'.

    Reason: Task ':mergeDebugJniLibFolders' uses this output of task ':unzipNativeArm64' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.

    Possible solutions:
      1. Declare task ':unzipNativeArm64' as an input of ':mergeDebugJniLibFolders'.
      2. Declare an explicit dependency on ':unzipNativeArm64' from ':mergeDebugJniLibFolders' using Task#dependsOn.
      3. Declare an explicit dependency on ':unzipNativeArm64' from ':mergeDebugJniLibFolders' using Task#mustRunAfter.

    For more information, please refer to https://docs.gradle.org/8.7/userguide/validation_problems.html#implicit_dependency in the Gradle documentation.
  - Gradle detected a problem with the following location: 'D:\work\kmm\skiko\samples\SkiaAndroidSample\src\main\jniLibs'.

    Reason: Task ':mergeDebugJniLibFolders' uses this output of task ':unzipNativeX64' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.

    Possible solutions:
      1. Declare task ':unzipNativeX64' as an input of ':mergeDebugJniLibFolders'.
      2. Declare an explicit dependency on ':unzipNativeX64' from ':mergeDebugJniLibFolders' using Task#dependsOn.
      3. Declare an explicit dependency on ':unzipNativeX64' from ':mergeDebugJniLibFolders' using Task#mustRunAfter.

    For more information, please refer to https://docs.gradle.org/8.7/userguide/validation_problems.html#implicit_dependency in the Gradle documentation.
    at org.gradle.internal.execution.WorkValidationException$BuilderWithSummary.build(WorkValidationException.java:137)
    at org.gradle.internal.execution.WorkValidationException$BuilderWithSummary.get(WorkValidationException.java:119)
    at org.gradle.internal.execution.steps.ValidateStep.throwValidationException(ValidateStep.java:174)
    at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:98)
    at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:55)
    at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:64)
    at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:43)
    at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:125)
    at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:56)
    at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:36)
    at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
    at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
    at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
    at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)
    at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)
    at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)
    at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:289)
    at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)
    at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)
    at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)
    at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)
    at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)
    at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)
    at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)
    at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)
    at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)
    at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:48)
    at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:35)
    at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:61)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:127)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116)
    at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
    at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
    at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
    at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:80)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
    at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
    at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)

BUILD FAILED in 5s
35 actionable tasks: 6 executed, 29 up-to-date
Siedlerchr commented 4 weeks ago

you need to add dependsOn

val unzipTaskX64 = tasks.register("unzipNativeX64", Copy::class) {
    dependsOn("mergeDebugJniLibFolders", "mergeReleaseJniLibFolders")
    destinationDir = file("$jniDir/x86_64")
    from(skikoNativeX64.map { zipTree(it) })
}