• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download

<lambda>null1 package com.android.ndkports
2 
3 import com.google.prefab.api.Android
4 import com.google.prefab.api.BuildSystemInterface
5 import com.google.prefab.api.Package
6 import org.gradle.api.DefaultTask
7 import org.gradle.api.file.Directory
8 import org.gradle.api.file.DirectoryProperty
9 import org.gradle.api.file.FileCollection
10 import org.gradle.api.provider.Property
11 import org.gradle.api.provider.Provider
12 import org.gradle.api.tasks.Input
13 import org.gradle.api.tasks.InputDirectory
14 import org.gradle.api.tasks.InputFiles
15 import org.gradle.api.tasks.Optional
16 import org.gradle.api.tasks.OutputDirectory
17 import org.gradle.api.tasks.TaskAction
18 import java.io.File
19 import java.util.zip.ZipFile
20 
21 abstract class PrefabTask : DefaultTask() {
22     @InputFiles
23     lateinit var aars: FileCollection
24 
25     @get:OutputDirectory
26     abstract val outputDirectory: DirectoryProperty
27 
28     @get:OutputDirectory
29     val generatedDirectory: Provider<Directory>
30         get() = outputDirectory.dir("generated")
31 
32     @get:Optional
33     @get:Input
34     abstract val generator: Property<Class<out BuildSystemInterface>>
35 
36     @get:InputDirectory
37     abstract val ndkPath: DirectoryProperty
38 
39     @get:Input
40     abstract val minSdkVersion: Property<Int>
41 
42     private val ndk: Ndk
43         get() = Ndk(ndkPath.asFile.get())
44 
45     @TaskAction
46     fun run() {
47         if (!generator.isPresent) {
48             // Creating the generated directory even if we have no generator
49             // makes it easier to write tasks that *might* consume prefab
50             // packages.
51             generatedDirectory.get().asFile.mkdirs()
52             return
53         }
54 
55         val outDir = outputDirectory.get().asFile
56         val packages = mutableListOf<Package>()
57         for (aar in aars) {
58             val packagePath = outDir.resolve(aar.nameWithoutExtension)
59             extract(aar, packagePath)
60             packages.add(Package(packagePath.toPath().resolve("prefab")))
61         }
62         generateSysroot(packages, minSdkVersion.get(), ndk.version.major)
63     }
64 
65     private fun extract(aar: File, extractDir: File) {
66         ZipFile(aar).use { zip ->
67             zip.entries().asSequence().forEach { entry ->
68                 zip.getInputStream(entry).use { input ->
69                     val outFile = extractDir.resolve(entry.name)
70                     if (entry.isDirectory) {
71                         outFile.mkdirs()
72                     } else {
73                         outFile.outputStream().use { output ->
74                             input.copyTo(output)
75                         }
76                     }
77                 }
78             }
79         }
80     }
81 
82     private fun generateSysroot(
83         packages: List<Package>, osVersion: Int, ndkVersion: Int
84     ) {
85         val generatorType = generator.get()
86         val constructor =
87             generatorType.getConstructor(File::class.java, List::class.java)
88         val buildSystemIntegration =
89             constructor.newInstance(generatedDirectory.get().asFile, packages)
90 
91         buildSystemIntegration.generate(Android.Abi.values().map {
92             Android(it, osVersion, Android.Stl.CxxShared, ndkVersion)
93         })
94     }
95 }