manager: Fix crash when no root
This commit is contained in:
@@ -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")
|
||||
}
|
||||
}
|
||||
@@ -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<String?> = object : CallbackList<String?>() {
|
||||
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")
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user