Skip to content

Commit 0446b33

Browse files
authored
GH-811 GH-813 Copy missing resource files for android exports (#814)
* GH-811 Copy missing resource files to godot-bootstrap-dex.jar * GH-813 Copy all files from main.jar to main-dex.jar except class files * GH-813 Readd missing registration entry files
1 parent 08dcfd3 commit 0446b33

File tree

4 files changed

+124
-35
lines changed

4 files changed

+124
-35
lines changed

kt/plugins/godot-gradle-plugin/src/main/kotlin/godot/gradle/projectExt/setupTasks.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package godot.gradle.projectExt
22

33
import godot.gradle.tasks.android.checkAndroidJarAccessibleTask
44
import godot.gradle.tasks.android.checkD8ToolAccessibleTask
5+
import godot.gradle.tasks.android.createBootstrapDexJarTask
56
import godot.gradle.tasks.android.createMainDexFileTask
67
import godot.gradle.tasks.android.packageBootstrapDexJarTask
78
import godot.gradle.tasks.android.packageMainDexJarTask
@@ -32,10 +33,13 @@ fun Project.setupTasks() {
3233
// START: android specific tasks
3334
val checkD8ToolAccessibleTask = checkD8ToolAccessibleTask()
3435
val checkAndroidJarAccessibleTask = checkAndroidJarAccessibleTask()
35-
val packageBootstrapDexJarTask = packageBootstrapDexJarTask(
36+
val createBootstrapDexJarTask = createBootstrapDexJarTask(
3637
checkAndroidJarAccessibleTask = checkAndroidJarAccessibleTask,
3738
checkD8ToolAccessibleTask = checkD8ToolAccessibleTask,
38-
packageBootstrapJarTask = packageBootstrapJarTask
39+
packageBootstrapJarTask = packageBootstrapJarTask,
40+
)
41+
val packageBootstrapDexJarTask = packageBootstrapDexJarTask(
42+
createBootstrapDexJarTask = createBootstrapDexJarTask,
3943
)
4044
val createMainDexFileTask = createMainDexFileTask(
4145
checkAndroidJarAccessibleTask = checkAndroidJarAccessibleTask,
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package godot.gradle.tasks.android
2+
3+
import godot.gradle.GodotPlugin
4+
import godot.gradle.projectExt.godotJvmExtension
5+
import org.gradle.api.Project
6+
import org.gradle.api.Task
7+
import org.gradle.api.tasks.Exec
8+
import org.gradle.api.tasks.TaskProvider
9+
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
10+
import java.io.File
11+
12+
fun Project.createBootstrapDexJarTask(
13+
checkAndroidJarAccessibleTask: TaskProvider<out Task>,
14+
checkD8ToolAccessibleTask: TaskProvider<out Task>,
15+
packageBootstrapJarTask: TaskProvider<out Task>
16+
): TaskProvider<out Task> {
17+
return tasks.register("createBootstrapDexJar", Exec::class.java) {
18+
with(it) {
19+
group = "godot-kotlin-jvm"
20+
description = "Converts the godot-bootstrap.jar to an android compatible version. Needed for android builds only"
21+
22+
dependsOn(checkD8ToolAccessibleTask, checkAndroidJarAccessibleTask, packageBootstrapJarTask)
23+
24+
doFirst {
25+
val libsDir = project.layout.buildDirectory.asFile.get().resolve("libs")
26+
val godotBootstrapJar = File(libsDir, "godot-bootstrap.jar")
27+
val mainDexRules = project.layout.buildDirectory.asFile.get().resolve("main-dex-rules.proguard").also { mainDexRules ->
28+
mainDexRules.outputStream().use { outputStream ->
29+
requireNotNull(GodotPlugin::class.java.getResourceAsStream("android/main-dex-rules.proguard"))
30+
.copyTo(outputStream)
31+
}
32+
}.absolutePath
33+
34+
workingDir = libsDir
35+
if (DefaultNativePlatform.getCurrentOperatingSystem().isWindows) {
36+
commandLine(
37+
"cmd",
38+
"/c",
39+
godotJvmExtension.d8ToolPath.get().asFile.absolutePath,
40+
godotBootstrapJar.absolutePath,
41+
"--output",
42+
"godot-bootstrap-dex.jar",
43+
"--lib",
44+
"${godotJvmExtension.androidCompileSdkDir.get().asFile.absolutePath}${File.separator}android.jar",
45+
"--min-api",
46+
godotJvmExtension.androidMinApi.get(),
47+
"--main-dex-rules",
48+
mainDexRules,
49+
)
50+
} else {
51+
commandLine(
52+
godotJvmExtension.d8ToolPath.get().asFile.absolutePath,
53+
godotBootstrapJar.absolutePath,
54+
"--output",
55+
"godot-bootstrap-dex.jar",
56+
"--lib",
57+
"${godotJvmExtension.androidCompileSdkDir.get().asFile.absolutePath}/android.jar",
58+
"--min-api",
59+
godotJvmExtension.androidMinApi.get(),
60+
"--main-dex-rules",
61+
mainDexRules,
62+
)
63+
}
64+
}
65+
}
66+
}
67+
}

kt/plugins/godot-gradle-plugin/src/main/kotlin/godot/gradle/tasks/android/packageBootstrapDexJarTask.kt

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package godot.gradle.tasks.android
22

3-
import godot.gradle.GodotPlugin
4-
import godot.gradle.projectExt.godotJvmExtension
53
import org.gradle.api.Project
64
import org.gradle.api.Task
75
import org.gradle.api.tasks.Exec
@@ -10,56 +8,67 @@ import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
108
import java.io.File
119

1210
fun Project.packageBootstrapDexJarTask(
13-
checkAndroidJarAccessibleTask: TaskProvider<out Task>,
14-
checkD8ToolAccessibleTask: TaskProvider<out Task>,
15-
packageBootstrapJarTask: TaskProvider<out Task>
11+
createBootstrapDexJarTask: TaskProvider<out Task>
1612
): TaskProvider<out Task> {
1713
return tasks.register("packageBootstrapDexJar", Exec::class.java) {
1814
with(it) {
1915
group = "godot-kotlin-jvm"
20-
description =
21-
"Converts the godot-bootstrap.jar to an android compatible version. Needed for android builds only"
16+
description = "Packages needed resources into godot-bootstrap-dex.jar. Needed for android builds only"
2217

23-
dependsOn(checkD8ToolAccessibleTask, checkAndroidJarAccessibleTask, packageBootstrapJarTask)
18+
dependsOn(createBootstrapDexJarTask)
2419

2520
doFirst {
2621
val libsDir = project.layout.buildDirectory.asFile.get().resolve("libs")
2722
val godotBootstrapJar = File(libsDir, "godot-bootstrap.jar")
28-
val mainDexRules = project.layout.buildDirectory.asFile.get().resolve("main-dex-rules.proguard").also { mainDexRules ->
29-
mainDexRules.outputStream().use { outputStream ->
30-
requireNotNull(GodotPlugin::class.java.getResourceAsStream("android/main-dex-rules.proguard"))
31-
.copyTo(outputStream)
23+
val godotBootstrapDexJar = File(libsDir, "godot-bootstrap-dex.jar")
24+
val resourcesDir = libsDir.resolve("resources").apply { mkdirs() }
25+
26+
val resourcesToCopy = listOf(
27+
"build.properties",
28+
)
29+
30+
val zipTree = zipTree(godotBootstrapJar)
31+
32+
resourcesToCopy.forEach { resourcePath ->
33+
val resourceFile = zipTree.firstOrNull { file -> file.path.endsWith(resourcePath) }
34+
35+
if (resourceFile == null) {
36+
project.logger.error("Could not copy $resourcePath to godot-bootstrap-dex.jar")
37+
} else {
38+
resourceFile.copyTo(resourcesDir.resolve(resourcePath))
3239
}
33-
}.absolutePath
40+
}
3441

3542
workingDir = libsDir
43+
44+
45+
// assembles the following command: jar uf <path_to_bootstrap_dex_jar> -C <path_to_resource_dirs_containing_resources_to_copy> build.properties
46+
// which updates the godot-bootstrap-dex.jar to include the necessary resources as the r8 tool handles only files
47+
val resourceCopyCommands = resourcesToCopy
48+
.flatMap { resourcesToCopy ->
49+
listOf(
50+
"-C",
51+
resourcesDir.absolutePath,
52+
resourcesToCopy,
53+
)
54+
}
55+
.toTypedArray()
56+
3657
if (DefaultNativePlatform.getCurrentOperatingSystem().isWindows) {
3758
commandLine(
3859
"cmd",
3960
"/c",
40-
godotJvmExtension.d8ToolPath.get().asFile.absolutePath,
41-
godotBootstrapJar.absolutePath,
42-
"--output",
43-
"godot-bootstrap-dex.jar",
44-
"--lib",
45-
"${godotJvmExtension.androidCompileSdkDir.get().asFile.absolutePath}${File.separator}android.jar",
46-
"--min-api",
47-
godotJvmExtension.androidMinApi.get(),
48-
"--main-dex-rules",
49-
mainDexRules,
61+
"jar",
62+
"uf",
63+
godotBootstrapDexJar.absolutePath,
64+
*resourceCopyCommands,
5065
)
5166
} else {
5267
commandLine(
53-
godotJvmExtension.d8ToolPath.get().asFile.absolutePath,
54-
godotBootstrapJar.absolutePath,
55-
"--output",
56-
"godot-bootstrap-dex.jar",
57-
"--lib",
58-
"${godotJvmExtension.androidCompileSdkDir.get().asFile.absolutePath}/android.jar",
59-
"--min-api",
60-
godotJvmExtension.androidMinApi.get(),
61-
"--main-dex-rules",
62-
mainDexRules,
68+
"jar",
69+
"uf",
70+
godotBootstrapDexJar.absolutePath,
71+
*resourceCopyCommands,
6372
)
6473
}
6574
}

kt/plugins/godot-gradle-plugin/src/main/kotlin/godot/gradle/tasks/android/packageMainDexJarTask.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,17 @@ fun Project.packageMainDexJarTask(
1717
archiveBaseName.set("main-dex")
1818

1919
from("src/main/resources").include("**/godot.registration.Entry")
20+
// add all dex files (converted class files)
2021
from("${project.layout.buildDirectory.asFile.get().absolutePath}/libs/").include("*.dex")
2122

23+
from(zipTree(project.layout.buildDirectory.asFile.get().resolve("libs/main.jar"))) { copySpec ->
24+
// copy everything from the main.jar
25+
copySpec.include("**/*")
26+
27+
// except class files as these are contained in converted form in the dex files
28+
copySpec.exclude("**/*.class")
29+
}
30+
2231
dependsOn(createMainDexFileTask)
2332
}
2433
}

0 commit comments

Comments
 (0)