manager: get kmi info from ksud
This commit is contained in:
@@ -37,23 +37,6 @@ fun parseKernelVersion(version: String): KernelVersion {
|
||||
}
|
||||
}
|
||||
|
||||
fun parseKMI(input: String): String? {
|
||||
val regex = Regex("(.* )?(\\d+\\.\\d+)(\\S+)?(android\\d+)(.*)")
|
||||
val result = regex.find(input)
|
||||
|
||||
return result?.let {
|
||||
val androidVersion = it.groups[4]?.value ?: ""
|
||||
val kernelVersion = it.groups[2]?.value ?: ""
|
||||
"$androidVersion-$kernelVersion"
|
||||
}
|
||||
}
|
||||
|
||||
fun getKMI(): String? {
|
||||
Os.uname().release.let {
|
||||
return parseKMI(it)
|
||||
}
|
||||
}
|
||||
|
||||
fun getKernelVersion(): KernelVersion {
|
||||
Os.uname().release.let {
|
||||
return parseKernelVersion(it)
|
||||
|
||||
@@ -3,9 +3,6 @@ package me.weishu.kernelsu.ui.screen
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.util.Log
|
||||
import android.webkit.DownloadListener
|
||||
import android.widget.Toast
|
||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.annotation.StringRes
|
||||
@@ -30,28 +27,17 @@ import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.core.net.toFile
|
||||
import com.ramcosta.composedestinations.annotation.Destination
|
||||
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
||||
import com.topjohnwu.superuser.Shell
|
||||
import com.topjohnwu.superuser.ShellUtils
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import me.weishu.kernelsu.R
|
||||
import me.weishu.kernelsu.ui.component.rememberConfirmDialog
|
||||
import me.weishu.kernelsu.ui.component.rememberLoadingDialog
|
||||
import me.weishu.kernelsu.ui.screen.destinations.FlashScreenDestination
|
||||
import me.weishu.kernelsu.ui.util.DownloadListener
|
||||
import me.weishu.kernelsu.ui.util.download
|
||||
import me.weishu.kernelsu.ui.util.getLKMUrl
|
||||
import me.weishu.kernelsu.ui.util.isAbDevice
|
||||
import me.weishu.kernelsu.ui.util.isInitBoot
|
||||
import me.weishu.kernelsu.ui.util.rootAvailable
|
||||
|
||||
@@ -10,7 +10,6 @@ import android.net.Uri
|
||||
import android.os.Environment
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.DisposableEffect
|
||||
import me.weishu.kernelsu.getKMI
|
||||
|
||||
/**
|
||||
* @author weishu
|
||||
@@ -95,38 +94,6 @@ fun checkNewVersion(): Triple<Int, String, String> {
|
||||
}
|
||||
return defaultValue
|
||||
}
|
||||
fun getLKMUrl(): Result<Pair<String, String>> {
|
||||
val url = "https://api.github.com/repos/tiann/KernelSU/releases/latest"
|
||||
|
||||
val kmi = getKMI() ?: return Result.failure(RuntimeException("Get KMI failed"))
|
||||
runCatching {
|
||||
okhttp3.OkHttpClient().newCall(okhttp3.Request.Builder().url(url).build()).execute()
|
||||
.use { response ->
|
||||
val body = response.body?.string() ?: return Result.failure(RuntimeException("request body failed"))
|
||||
if (!response.isSuccessful) {
|
||||
return Result.failure(RuntimeException("Request failed, code: ${response.code}, message: $body"))
|
||||
}
|
||||
val json = org.json.JSONObject(body)
|
||||
|
||||
val assets = json.getJSONArray("assets")
|
||||
for (i in 0 until assets.length()) {
|
||||
val asset = assets.getJSONObject(i)
|
||||
val name = asset.getString("name")
|
||||
if (!name.endsWith(".ko")) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (name.contains(kmi)) {
|
||||
return Result.success(Pair(name, asset.getString("browser_download_url")))
|
||||
}
|
||||
}
|
||||
}
|
||||
}.onFailure {
|
||||
return Result.failure(it)
|
||||
}
|
||||
|
||||
return Result.failure(RuntimeException("Cannot find LKM for $kmi"))
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun DownloadListener(context: Context, onDownloaded: (Uri) -> Unit) {
|
||||
|
||||
@@ -257,6 +257,20 @@ fun isInitBoot(): Boolean {
|
||||
.toInt() >= Build.VERSION_CODES.TIRAMISU
|
||||
}
|
||||
|
||||
fun getCurrentKmi(): String {
|
||||
val shell = getRootShell()
|
||||
val cmd = "boot-info supported-kmi"
|
||||
return ShellUtils.fastCmd(shell, "${getKsuDaemonPath()} $cmd")
|
||||
}
|
||||
|
||||
fun getSupportedKmis(): List<String> {
|
||||
val shell = getRootShell()
|
||||
val cmd = "boot-info supported-kmi"
|
||||
val out =
|
||||
shell.newJob().add("${getKsuDaemonPath()} $cmd").to(ArrayList(), null).exec().out
|
||||
return out.filter { it.isNotBlank() }.map { it.trim() }
|
||||
}
|
||||
|
||||
fun overlayFsAvailable(): Boolean {
|
||||
val shell = getRootShell()
|
||||
// check /proc/filesystems
|
||||
|
||||
Reference in New Issue
Block a user