diff --git a/manager/app/src/main/java/me/weishu/kernelsu/KernelSUApplication.kt b/manager/app/src/main/java/me/weishu/kernelsu/KernelSUApplication.kt index d2661288..4b6f463d 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/KernelSUApplication.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/KernelSUApplication.kt @@ -1,14 +1,11 @@ package me.weishu.kernelsu import android.app.Application -import android.util.Log import coil.Coil import coil.ImageLoader -import com.topjohnwu.superuser.Shell -import com.topjohnwu.superuser.ShellUtils +import me.weishu.kernelsu.ui.util.install import me.zhanghai.android.appiconloader.coil.AppIconFetcher import me.zhanghai.android.appiconloader.coil.AppIconKeyer -import java.io.File lateinit var ksuApp: KernelSUApplication @@ -32,17 +29,5 @@ class KernelSUApplication : Application() { install() } - fun createRootShell(): Shell { - Shell.enableVerboseLogging = BuildConfig.DEBUG - val su = applicationInfo.nativeLibraryDir + File.separator + "libksu.so" - val builder = Shell.Builder.create() - return builder.build(su) - } - fun install() { - val shell = createRootShell() - val ksduLib = ksuApp.applicationInfo.nativeLibraryDir + File.separator + "libksud.so" - val result = ShellUtils.fastCmdResult(shell, "$ksduLib install") - Log.w("KernelSU", "install ksud result: $result") - } } \ No newline at end of file diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt index 9202a209..9a9f1dd1 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt @@ -1,12 +1,11 @@ package me.weishu.kernelsu.ui.util -import android.content.Context import android.net.Uri -import android.os.Build -import android.os.PowerManager import android.util.Log import com.topjohnwu.superuser.CallbackList +import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ShellUtils +import me.weishu.kernelsu.BuildConfig import me.weishu.kernelsu.ksuApp import java.io.File @@ -17,10 +16,36 @@ import java.io.File */ private const val TAG = "KsuCli" +private fun getKsuDaemonPath(): String { + return ksuApp.applicationInfo.nativeLibraryDir + File.separator + "libksud.so" +} + +fun createRootShell(): Shell { + Shell.enableVerboseLogging = BuildConfig.DEBUG + val su = ksuApp.applicationInfo.nativeLibraryDir + File.separator + "libksu.so" + val builder = Shell.Builder.create() + return try { + builder.build(su) + } catch (e: Throwable) { + builder.build("sh") + } +} + fun execKsud(args: String): Boolean { - val shell = ksuApp.createRootShell() - val ksduLib = ksuApp.applicationInfo.nativeLibraryDir + File.separator + "libksud.so" - return ShellUtils.fastCmdResult(shell, "$ksduLib $args") + val shell = createRootShell() + return ShellUtils.fastCmdResult(shell, "${getKsuDaemonPath()} $args") +} + +fun install() { + val result = execKsud("install") + Log.w("KernelSU", "install ksud result: $result") +} + +fun listModules(): String { + val shell = createRootShell() + + val out = shell.newJob().add("${getKsuDaemonPath()} module list").to(ArrayList(), null).exec().out + return out.joinToString("\n") } fun toggleModule(id: String, enable: Boolean): Boolean { @@ -50,8 +75,7 @@ fun installModule(uri: Uri, onFinish: (Boolean)->Unit, onOutput: (String) -> Uni } val cmd = "module install ${file.absolutePath}" - val shell = ksuApp.createRootShell() - val ksduLib = ksuApp.applicationInfo.nativeLibraryDir + File.separator + "libksud.so" + val shell = createRootShell() val callbackList: CallbackList = object : CallbackList() { override fun onAddElement(s: String?) { @@ -59,7 +83,7 @@ fun installModule(uri: Uri, onFinish: (Boolean)->Unit, onOutput: (String) -> Uni } } - val result = shell.newJob().add("$ksduLib $cmd").to(callbackList, callbackList).exec() + val result = shell.newJob().add("${getKsuDaemonPath()} $cmd").to(callbackList, callbackList).exec() Log.i("KernelSU", "install module $uri result: $result") file.delete() @@ -70,7 +94,7 @@ fun installModule(uri: Uri, onFinish: (Boolean)->Unit, onOutput: (String) -> Uni } fun reboot(reason: String = "") { - val shell = ksuApp.createRootShell() + val shell = createRootShell() if (reason == "recovery") { // KEYCODE_POWER = 26, hide incorrect "Factory data reset" message ShellUtils.fastCmd(shell, "/system/bin/input keyevent 26") diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/ModuleViewModel.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/ModuleViewModel.kt index caebdb2b..f3f5f6d2 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/ModuleViewModel.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/ModuleViewModel.kt @@ -1,6 +1,5 @@ package me.weishu.kernelsu.ui.viewmodel -import android.net.Uri import android.os.SystemClock import android.util.Log import androidx.compose.runtime.derivedStateOf @@ -8,13 +7,10 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel -import com.topjohnwu.superuser.Shell -import com.topjohnwu.superuser.ShellUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import me.weishu.kernelsu.ksuApp +import me.weishu.kernelsu.ui.util.listModules import org.json.JSONArray -import java.io.File import java.text.Collator import java.util.* @@ -50,15 +46,12 @@ class ModuleViewModel : ViewModel() { isRefreshing = true val start = SystemClock.elapsedRealtime() - val shell = ksuApp.createRootShell() - val ksduLib = ksuApp.applicationInfo.nativeLibraryDir + File.separator + "libksud.so" - - val out = shell.newJob().add("$ksduLib module list").to(ArrayList(), null).exec().out - val result = out.joinToString("\n") - - Log.i(TAG, "result: $result") - kotlin.runCatching { + + val result = listModules() + + Log.i(TAG, "result: $result") + val array = JSONArray(result) modules = (0 until array.length()) .asSequence()