<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 }