@@ -71,7 +71,7 @@ dependencies {
7171 }
7272 // Android-compatible JOML variant
7373 implementation " org.joml:joml-jdk3:1.9.25"
74- implementation(group : ' org.terasology.gestalt' , name : ' gestalt-android' , version : ' 7.2.0-SNAPSHOT ' )
74+ implementation(group : ' org.terasology.gestalt' , name : ' gestalt-android' , version : gestaltVersion )
7575 // TODO: Needed for gestalt because of an internal dependency but since that dependency is never
7676 // exposed in a public API, I have no idea why it's needed for compilation.
7777 implementation " com.github.zafarkhaja:java-semver:0.10.0"
@@ -89,8 +89,14 @@ dependencies {
8989 natives " com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion :natives-x86"
9090 natives " com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion :natives-x86_64"
9191
92+ // Add reflections purely for NUI. NUI uses the ReflectionUtils class from it.
93+ implementation " org.terasology:reflections:0.9.12-MB"
94+
9295 // Android-compatible logging
9396 implementation group : ' org.slf4j' , name : ' slf4j-android' , version : ' 1.7.25'
97+
98+ // Backport some Java 8 APIs like java.time for gestalt
99+ coreLibraryDesugaring ' com.android.tools:desugar_jdk_libs:1.1.5'
94100}
95101
96102ext {
@@ -127,6 +133,9 @@ android {
127133
128134 // Make it clear we're compiling for Java 8
129135 compileOptions {
136+ // Backport some Java 8 APIs like java.time for gestalt
137+ coreLibraryDesugaringEnabled true
138+
130139 sourceCompatibility JavaVersion . VERSION_1_8
131140 targetCompatibility JavaVersion . VERSION_1_8
132141 }
@@ -153,6 +162,15 @@ android {
153162 abortOnError false
154163 }
155164
165+ packagingOptions {
166+ merge ' META-INF/annotations/*'
167+ merge ' META-INF/subtypes/*'
168+ merge ' META-INF/services/*'
169+
170+ // The contents of the "gestalt-indexes-present" file is never read, so just pick any one of them
171+ pickFirst ' META-INF/gestalt-indexes-present'
172+ }
173+
156174 defaultConfig {
157175 targetSdkVersion(project. ext. targetSdk)
158176 minSdkVersion(project. ext. minSdk)
@@ -225,9 +243,9 @@ def deleteDir(File dir) {
225243 dir. delete()
226244}
227245
228- task modulesReflections
246+ task modulesJar
229247rootProject. destinationSolModules(). each { module ->
230- modulesReflections . dependsOn " :modules:$module . name " + " :cacheReflections "
248+ modulesJar . dependsOn " :modules:$module . name " + " :jar "
231249}
232250
233251task exportModules () {
@@ -243,8 +261,7 @@ task exportModules() {
243261
244262 outputs. dir(" $projectDir /assets/modules" )
245263
246- dependsOn " :engine:cacheReflections"
247- dependsOn modulesReflections
264+ dependsOn modulesJar
248265
249266 doLast {
250267 dexModules()
@@ -277,7 +294,6 @@ task exportModules() {
277294 Files . createSymbolicLink(Paths . get(" $projectDir /assets/modules/${ module.name} /module.json" ), Paths . get(" $rootDir /modules/${ module.name} /module.json" ))
278295
279296 file(" $projectDir /assets/modules/${ module.name} /build/classes" ). mkdirs()
280- Files . createSymbolicLink(Paths . get(" $projectDir /assets/modules/${ module.name} /build/classes/reflections.cache" ), Paths . get(" $rootDir /modules/${ module.name} /build/classes/reflections.cache" ))
281297 Files . createSymbolicLink(Paths . get(" $projectDir /assets/modules/${ module.name} /build/dexes" ), Paths . get(" $rootDir /modules/${ module.name} /build/dexes" ))
282298 }
283299 } else {
@@ -297,8 +313,7 @@ task exportModules() {
297313 include " ${ module.name} /assets/**"
298314 include " ${ module.name} /overrides/**"
299315 include " ${ module.name} /deltas/**"
300- include " ${ module.name} /build/dexes/*.dex"
301- include " ${ module.name} /build/classes/reflections.cache"
316+ include " ${ module.name} /build/dexes/*.jar"
302317 }
303318 }
304319 }
@@ -326,9 +341,9 @@ def dexModules() {
326341 }
327342 def dex = " ${ buildToolsVersions[0]} /$dexCommand "
328343 for (module in rootProject. destinationSolModules()) {
329- def moduleClassesDir = " ${ rootProject.projectDir} /modules/${ module.name} /build/classes/"
344+ def moduleClassesDir = file( " ${ rootProject.projectDir} /modules/${ module.name} /build/classes/" )
330345 def moduleClassesFiles = fileTree(moduleClassesDir). filter { it. isFile() && it. name. endsWith(' .class' )}. files
331- def classesRootPath = new File ( moduleClassesDir) . toPath()
346+ def classesRootPath = moduleClassesDir. toPath()
332347 def moduleClasses = []
333348 for (file in moduleClassesFiles) {
334349 moduleClasses. add(classesRootPath. relativize(file. toPath()))
@@ -339,12 +354,30 @@ def dexModules() {
339354 }
340355 def moduleDexesDir = " ${ rootProject.projectDir} /modules/${ module.name} /build/dexes/"
341356 mkdir(moduleDexesDir)
357+ def jarOutputPath = " $moduleDexesDir /${ module.name} .jar"
342358 exec {
343359 workingDir moduleClassesDir
344360 commandLine ([" $dex " ] + moduleClasses + [' --classpath' , " $rootDir /engine/build/classes" ,
345361 ' --lib' , " $path /platforms/android-$compileSdk /android.jar" ,
346362 ' --min-api' , " $minSdk " ,
347- ' --output' , " $moduleDexesDir " ])
363+ ' --output' , " $jarOutputPath " ])
364+ }
365+ FileSystem jarFileSystem
366+ try {
367+ jarFileSystem = FileSystems . newFileSystem(URI . create(" jar:" + new File (jarOutputPath). toURI()), new HashMap<String , Object > ())
368+ fileTree(moduleClassesDir). filter {
369+ it. isFile() && ! it. name. endsWith(" .class" ) && ! it. path. startsWith(" assets/" )
370+ }. each {
371+ def destinationPath = jarFileSystem. getPath(" /${ moduleClassesDir.relativePath(it)} " )
372+ Files . createDirectories(destinationPath. parent)
373+ Files . copy(it. toPath(), destinationPath)
374+ }
375+ } catch (Exception e) {
376+ e. printStackTrace()
377+ } finally {
378+ if (jarFileSystem != null ) {
379+ jarFileSystem. close()
380+ }
348381 }
349382 }
350383}
0 commit comments