-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathBaseAssetsInstaller.kt
More file actions
104 lines (90 loc) · 2.74 KB
/
BaseAssetsInstaller.kt
File metadata and controls
104 lines (90 loc) · 2.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package com.itsaky.androidide.assets
import android.content.Context
import com.itsaky.androidide.utils.Environment
import com.itsaky.androidide.utils.FeatureFlags
import com.termux.shared.termux.TermuxConstants
import org.slf4j.LoggerFactory
import java.io.File
import java.nio.file.Path
import java.util.concurrent.TimeUnit
import kotlin.concurrent.thread
import kotlin.system.measureTimeMillis
abstract class BaseAssetsInstaller : AssetsInstaller {
private val logger = LoggerFactory.getLogger(BaseAssetsInstaller::class.java)
override suspend fun postInstall(
context: Context,
stagingDir: Path,
) {
for (bin in arrayOf(
"aapt",
"aapt2",
"aidl",
"apksigner",
"d8",
"dexdump",
"split-select",
"zipalign",
)) {
Environment.setExecutable(Environment.BUILD_TOOLS_DIR.resolve(bin))
}
installNdk(
File(Environment.ANDROID_HOME, Environment.NDK_TAR_XZ),
Environment.ANDROID_HOME,
)
}
private fun installNdk(
archiveFile: File,
outputDir: File,
): Boolean {
if (!FeatureFlags.isExperimentsEnabled) return false
if (!archiveFile.exists()) {
logger.debug("NDK installable package not found: ${archiveFile.absolutePath}")
return false
}
logger.debug("Starting installation of ${archiveFile.absolutePath}")
var exitCode: Int
var result: String
val elapsed =
measureTimeMillis {
val processBuilder =
ProcessBuilder(
"${TermuxConstants.TERMUX_BIN_PREFIX_DIR_PATH}/bash",
"-c",
"tar -xJf ${archiveFile.absolutePath} -C ${outputDir.absolutePath} --no-same-owner",
).redirectErrorStream(true)
val env = processBuilder.environment()
env["PATH"] = "${TermuxConstants.TERMUX_BIN_PREFIX_DIR_PATH}:${env["PATH"]}"
val process = processBuilder.start()
val output = StringBuilder()
val reader =
thread(start = true, name = "ndk-extract-output") {
process.inputStream.bufferedReader().useLines { lines ->
lines.forEach { output.appendLine(it) }
}
}
val completed = process.waitFor(2, TimeUnit.MINUTES)
if (!completed) process.destroyForcibly()
reader.join()
result = output.toString()
exitCode = if (completed) process.exitValue() else -1
}
return if (exitCode == 0) {
logger.debug("Extraction of ${archiveFile.absolutePath} successful took ${elapsed}ms : $result")
if (archiveFile.exists()) {
val deleted = archiveFile.delete()
if (deleted) {
logger.debug("${archiveFile.absolutePath} deleted successfully.")
} else {
logger.debug("Failed to delete ${archiveFile.absolutePath}.")
}
deleted
} else {
logger.debug("Archive file not found for deletion.")
false
}
} else {
logger.error("Extraction failed with code $exitCode: $result")
false
}
}
}