moko-resources
moko-resources copied to clipboard
Improve compilation speed on big resources count for iOS
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
assets compilation time i think we can't improve - no any options for it in man actool. xcode perfomance problem :(