moko-resources icon indicating copy to clipboard operation
moko-resources copied to clipboard

Improve compilation speed on big resources count for iOS

Open Alex009 opened this issue 4 years ago • 1 comments

if we will measure time of resources compilation on iOS:

@OptIn(ExperimentalTime::class)
private fun setupKLibResources(generationTask: Task) {
    val compileTask: KotlinNativeCompile = compilation.compileKotlinTask
    compileTask.dependsOn(generationTask)

    compileTask.doLast { task ->
        task as KotlinNativeCompile

        val klibFile = task.outputFile.get()
        val repackDir = File(klibFile.parent, klibFile.nameWithoutExtension)
        val defaultDir = File(repackDir, "default")
        val resRepackDir = File(defaultDir, "resources")

        val unzipTime = measureTime {
            unzipTo(zipFile = klibFile, outputDirectory = repackDir)
        }

        val manifestFile: File
        val manifest: Properties
        val uniqueName: String
        val loadableBundle: LoadableBundle

        val manifestRewriteTime = measureTime {
            manifestFile = File(defaultDir, "manifest")
            manifest = Properties()
            manifest.load(manifestFile.inputStream())

            uniqueName = manifest["unique_name"] as String

            loadableBundle = LoadableBundle(
                directory = resRepackDir,
                bundleName = uniqueName,
                developmentRegion = baseLocalizationRegion,
                identifier = bundleIdentifier
            )
            loadableBundle.write()
        }

        val assetsCompilationTime = measureTime {
            assetsDirectory?.let { assetsDir ->
                val process = Runtime.getRuntime().exec(
                    "xcrun actool Assets.xcassets --compile . --platform iphoneos --minimum-deployment-target 9.0",
                    emptyArray(),
                    assetsDir.parentFile
                )
                val errors = process.errorStream.bufferedReader().readText()
                val input = process.inputStream.bufferedReader().readText()
                val result = process.waitFor()
                if (result != 0) {
                    println("can't compile assets - $result")
                    println(input)
                    println(errors)
                } else {
                    assetsDir.deleteRecursively()
                }
            }
        }

        val copyResourcesTime = measureTime {
            resourcesGenerationDir.copyRecursively(
                loadableBundle.resourcesDir,
                overwrite = true
            )
        }

        val zipTime = measureTime {
            val repackKonan = org.jetbrains.kotlin.konan.file.File(repackDir.path)
            val klibKonan = org.jetbrains.kotlin.konan.file.File(klibFile.path)

            klibFile.delete()
            repackKonan.zipDirAs(klibKonan)
        }

        val deleteRepackTime = measureTime {
            repackDir.deleteRecursively()
        }

        with(task.project.logger) {
            lifecycle("unzipTime $unzipTime")
            lifecycle("manifestRewriteTime $manifestRewriteTime")
            lifecycle("assetsCompilationTime $assetsCompilationTime")
            lifecycle("copyResourcesTime $copyResourcesTime")
            lifecycle("zipTime $zipTime")
            lifecycle("deleteRepackTime $deleteRepackTime")
        }
    }
}

we got on large project this results:

unzipTime 14.9ms
manifestRewriteTime 321us
assetsCompilationTime 14.0s
copyResourcesTime 93.3ms
zipTime 1.05s
deleteRepackTime 7.64ms

need to find way of improve speed assetsCompilation

Alex009 avatar Dec 23 '20 12:12 Alex009

assets compilation time i think we can't improve - no any options for it in man actool. xcode perfomance problem :(

Alex009 avatar Dec 23 '20 15:12 Alex009