Archive paths in NativeDependencyCache

How do I get external dependency resolve path from ResolvedArtifact? Here’s far I got -

open class MyTask : DefaultTask() {
  @Suppress("unused")
  @TaskAction
  fun run() {
    project.configurations.forEach { configuration ->
      println("$configuration: resolve: ${configuration.isCanBeResolved}, consume: ${configuration.isCanBeConsumed}")
      if (!configuration.isCanBeResolved) {
        return
      }

      configuration.resolvedConfiguration.resolvedArtifacts.forEach { artifact ->
        println("\tartifact: ${artifact.moduleVersion.id}, file: ${artifact.file.absolutePath}")
      }

      configuration.resolvedConfiguration.files.forEach { file ->
        println("\tfile: ${file.absolutePath}")
      }
    }
  }
}

For the static-library examples from native samples, here’s the output I get -

configuration ':app:cppCompileDebug': resolve: true, consume: false
	artifact: com.amazon.lyengine:utilities:0.1, file: C:\Users\shahji\.gradle\caches\modules-2\files-2.1\com.amazon.lyengine\utilities\0.1\57a4f25f97896922639a79d35e41dd4ce3bf9e\cpp-api-headers.zip
	artifact: com.amazon.lyengine:list:0.1, file: C:\Users\shahji\.gradle\caches\modules-2\files-2.1\com.amazon.lyengine\list\0.1\8fa2746740f3a811e8989dde0613acdf53d23d30\cpp-api-headers.zip
	file: C:\Users\shahji\.gradle\caches\modules-2\files-2.1\com.amazon.lyengine\utilities\0.1\57a4f25f97896922639a79d35e41dd4ce3bf9e\cpp-api-headers.zip
	file: C:\Users\shahji\.gradle\caches\modules-2\files-2.1\com.amazon.lyengine\list\0.1\8fa2746740f3a811e8989dde0613acdf53d23d30\cpp-api-headers.zip
configuration ':app:cppCompileRelease': resolve: true, consume: false
	artifact: com.amazon.lyengine:utilities:0.1, file: C:\Users\shahji\.gradle\caches\modules-2\files-2.1\com.amazon.lyengine\utilities\0.1\57a4f25f97896922639a79d35e41dd4ce3bf9e\cpp-api-headers.zip
	artifact: com.amazon.lyengine:list:0.1, file: C:\Users\shahji\.gradle\caches\modules-2\files-2.1\com.amazon.lyengine\list\0.1\8fa2746740f3a811e8989dde0613acdf53d23d30\cpp-api-headers.zip
	file: C:\Users\shahji\.gradle\caches\modules-2\files-2.1\com.amazon.lyengine\utilities\0.1\57a4f25f97896922639a79d35e41dd4ce3bf9e\cpp-api-headers.zip
	file: C:\Users\shahji\.gradle\caches\modules-2\files-2.1\com.amazon.lyengine\list\0.1\8fa2746740f3a811e8989dde0613acdf53d23d30\cpp-api-headers.zip

How do I get access to the path where cpp-api-headers.zip gets unpacked? Quick browsing thru’ gradle source code gets in NativeDependencyCache implementation but all those classes are internal with no public accessors.

From the build output log file, for list project the archive was unpacked here -

C:\Users\shahji\.gradle\caches\5.0\native-dep\3ecbhng8tu5qkbvm97rwzf7ly\list-0.1

How do I get access to this path?

Answering my own question. The way to get an instance of NativeDependencyCache -

project.gradle.serviceOf<NativeDependencyCache>()

And here’s the full solution -

val componentIds = configuration.incoming.resolutionResult.allDependencies
  .filter { it is ResolvedDependencyResult }
  .map { (it as ResolvedDependencyResult).selected.id }
  
val result = project.dependencies.createArtifactResolutionQuery()
  .forComponents(componentIds)
  .withArtifacts(MavenModule::class.java, MavenPomArtifact::class.java)
  .execute()

val cache = project.gradle.serviceOf<NativeDependencyCache>()
result.resolvedComponents.forEach { component ->
  if (component.id is ModuleComponentIdentifier) {
    component.getArtifacts(MavenPomArtifact::class).forEach { artifact ->
    val resolvedArtifact = artifact as ResolvedArtifactResult
    if (resolvedArtifact.file.isFile) {
      val id = component.id as ModuleComponentIdentifier
      val headerDir = cache.getUnpackedHeaders(artifact.file, "${id.module}-${id.version}")
      
      println("component.id: $id, headerDir: $headerDir")
    }
  }
}