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 {
|
fun getKernelVersion(): KernelVersion {
|
||||||
Os.uname().release.let {
|
Os.uname().release.let {
|
||||||
return parseKernelVersion(it)
|
return parseKernelVersion(it)
|
||||||
|
|||||||
@@ -3,9 +3,6 @@ package me.weishu.kernelsu.ui.screen
|
|||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.util.Log
|
|
||||||
import android.webkit.DownloadListener
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
@@ -30,28 +27,17 @@ import androidx.compose.runtime.Composable
|
|||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.core.net.toFile
|
|
||||||
import com.ramcosta.composedestinations.annotation.Destination
|
import com.ramcosta.composedestinations.annotation.Destination
|
||||||
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
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.R
|
||||||
import me.weishu.kernelsu.ui.component.rememberConfirmDialog
|
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.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.isAbDevice
|
||||||
import me.weishu.kernelsu.ui.util.isInitBoot
|
import me.weishu.kernelsu.ui.util.isInitBoot
|
||||||
import me.weishu.kernelsu.ui.util.rootAvailable
|
import me.weishu.kernelsu.ui.util.rootAvailable
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import android.net.Uri
|
|||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.DisposableEffect
|
import androidx.compose.runtime.DisposableEffect
|
||||||
import me.weishu.kernelsu.getKMI
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author weishu
|
* @author weishu
|
||||||
@@ -95,38 +94,6 @@ fun checkNewVersion(): Triple<Int, String, String> {
|
|||||||
}
|
}
|
||||||
return defaultValue
|
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
|
@Composable
|
||||||
fun DownloadListener(context: Context, onDownloaded: (Uri) -> Unit) {
|
fun DownloadListener(context: Context, onDownloaded: (Uri) -> Unit) {
|
||||||
|
|||||||
@@ -257,6 +257,20 @@ fun isInitBoot(): Boolean {
|
|||||||
.toInt() >= Build.VERSION_CODES.TIRAMISU
|
.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 {
|
fun overlayFsAvailable(): Boolean {
|
||||||
val shell = getRootShell()
|
val shell = getRootShell()
|
||||||
// check /proc/filesystems
|
// check /proc/filesystems
|
||||||
|
|||||||
Reference in New Issue
Block a user