mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-11-27 12:05:30 +00:00
Update libsu
This commit is contained in:
parent
e7c82f20e3
commit
71e37345b4
@ -86,7 +86,7 @@ dependencies {
|
|||||||
implementation("${bindingAdapter}:${vBAdapt}")
|
implementation("${bindingAdapter}:${vBAdapt}")
|
||||||
implementation("${bindingAdapter}-recyclerview:${vBAdapt}")
|
implementation("${bindingAdapter}-recyclerview:${vBAdapt}")
|
||||||
|
|
||||||
val vLibsu = "3.2.1"
|
val vLibsu = "4.0.0"
|
||||||
implementation("com.github.topjohnwu.libsu:core:${vLibsu}")
|
implementation("com.github.topjohnwu.libsu:core:${vLibsu}")
|
||||||
implementation("com.github.topjohnwu.libsu:io:${vLibsu}")
|
implementation("com.github.topjohnwu.libsu:io:${vLibsu}")
|
||||||
implementation("com.github.topjohnwu.libsu:service:${vLibsu}")
|
implementation("com.github.topjohnwu.libsu:service:${vLibsu}")
|
||||||
|
@ -111,13 +111,13 @@ abstract class BaseMainActivity<Binding : ViewDataBinding> : NavigationActivity<
|
|||||||
runCatching {
|
runCatching {
|
||||||
// Hidden, remove com.topjohnwu.magisk if exist as it could be malware
|
// Hidden, remove com.topjohnwu.magisk if exist as it could be malware
|
||||||
packageManager.getApplicationInfo(APPLICATION_ID, 0)
|
packageManager.getApplicationInfo(APPLICATION_ID, 0)
|
||||||
Shell.su("(pm uninstall $APPLICATION_ID)& >/dev/null 2>&1").exec()
|
Shell.cmd("(pm uninstall $APPLICATION_ID)& >/dev/null 2>&1").exec()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (Config.suManager.isNotEmpty())
|
if (Config.suManager.isNotEmpty())
|
||||||
Config.suManager = ""
|
Config.suManager = ""
|
||||||
pkg ?: return
|
pkg ?: return
|
||||||
if (!Shell.su("(pm uninstall $pkg)& >/dev/null 2>&1").exec().isSuccess) {
|
if (!Shell.cmd("(pm uninstall $pkg)& >/dev/null 2>&1").exec().isSuccess) {
|
||||||
// Uninstall through Android API
|
// Uninstall through Android API
|
||||||
uninstallAndWait(pkg)
|
uninstallAndWait(pkg)
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,7 @@ open class App() : Application() {
|
|||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
RootRegistry.bindTask = RootService.createBindTask(
|
RootRegistry.bindTask = RootService.bindOrTask(
|
||||||
intent<RootRegistry>(),
|
intent<RootRegistry>(),
|
||||||
UiThreadHandler.executor,
|
UiThreadHandler.executor,
|
||||||
RootRegistry.Connection
|
RootRegistry.Connection
|
||||||
@ -92,8 +92,6 @@ object ActivityTracker : Application.ActivityLifecycleCallbacks {
|
|||||||
@Volatile
|
@Volatile
|
||||||
var foreground: Activity? = null
|
var foreground: Activity? = null
|
||||||
|
|
||||||
val hasForeground get() = foreground != null
|
|
||||||
|
|
||||||
override fun onActivityResumed(activity: Activity) {
|
override fun onActivityResumed(activity: Activity) {
|
||||||
if (activity is SuRequestActivity) return
|
if (activity is SuRequestActivity) return
|
||||||
foreground = activity
|
foreground = activity
|
||||||
|
@ -43,7 +43,7 @@ open class Receiver : BaseReceiver() {
|
|||||||
getUid(intent)?.let { rmPolicy(it) }
|
getUid(intent)?.let { rmPolicy(it) }
|
||||||
}
|
}
|
||||||
Intent.ACTION_PACKAGE_FULLY_REMOVED -> {
|
Intent.ACTION_PACKAGE_FULLY_REMOVED -> {
|
||||||
getPkg(intent)?.let { Shell.su("magisk --denylist rm $it").submit() }
|
getPkg(intent)?.let { Shell.cmd("magisk --denylist rm $it").submit() }
|
||||||
}
|
}
|
||||||
Intent.ACTION_LOCALE_CHANGED -> Shortcuts.setupDynamic(context)
|
Intent.ACTION_LOCALE_CHANGED -> Shortcuts.setupDynamic(context)
|
||||||
Intent.ACTION_MY_PACKAGE_REPLACED -> {
|
Intent.ACTION_MY_PACKAGE_REPLACED -> {
|
||||||
|
@ -18,7 +18,7 @@ class Query(private val _query: String) {
|
|||||||
|
|
||||||
suspend inline fun <R : Any> query(crossinline mapper: (Map<String, String>) -> R?): List<R> =
|
suspend inline fun <R : Any> query(crossinline mapper: (Map<String, String>) -> R?): List<R> =
|
||||||
withContext(Dispatchers.Default) {
|
withContext(Dispatchers.Default) {
|
||||||
Shell.su(query).await().out.map { line ->
|
Shell.cmd(query).await().out.map { line ->
|
||||||
async {
|
async {
|
||||||
line.split("\\|".toRegex())
|
line.split("\\|".toRegex())
|
||||||
.map { it.split("=", limit = 2) }
|
.map { it.split("=", limit = 2) }
|
||||||
@ -32,7 +32,7 @@ class Query(private val _query: String) {
|
|||||||
|
|
||||||
suspend inline fun query() = query { it }
|
suspend inline fun query() = query { it }
|
||||||
|
|
||||||
suspend inline fun commit() = Shell.su(query).to(null).await()
|
suspend inline fun commit() = Shell.cmd(query).to(null).await()
|
||||||
}
|
}
|
||||||
|
|
||||||
class Delete : Query.Builder {
|
class Delete : Query.Builder {
|
||||||
|
@ -46,15 +46,15 @@ data class LocalModule(
|
|||||||
if (enable) {
|
if (enable) {
|
||||||
disableFile.delete()
|
disableFile.delete()
|
||||||
if (Const.Version.atLeast_21_2())
|
if (Const.Version.atLeast_21_2())
|
||||||
Shell.su("copy_sepolicy_rules").submit()
|
Shell.cmd("copy_sepolicy_rules").submit()
|
||||||
else
|
else
|
||||||
Shell.su("mkdir -p $dir", "cp -af $ruleFile $dir").submit()
|
Shell.cmd("mkdir -p $dir", "cp -af $ruleFile $dir").submit()
|
||||||
} else {
|
} else {
|
||||||
!disableFile.createNewFile()
|
!disableFile.createNewFile()
|
||||||
if (Const.Version.atLeast_21_2())
|
if (Const.Version.atLeast_21_2())
|
||||||
Shell.su("copy_sepolicy_rules").submit()
|
Shell.cmd("copy_sepolicy_rules").submit()
|
||||||
else
|
else
|
||||||
Shell.su("rm -rf $dir").submit()
|
Shell.cmd("rm -rf $dir").submit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,15 +65,15 @@ data class LocalModule(
|
|||||||
if (updateFile.exists()) return
|
if (updateFile.exists()) return
|
||||||
removeFile.createNewFile()
|
removeFile.createNewFile()
|
||||||
if (Const.Version.atLeast_21_2())
|
if (Const.Version.atLeast_21_2())
|
||||||
Shell.su("copy_sepolicy_rules").submit()
|
Shell.cmd("copy_sepolicy_rules").submit()
|
||||||
else
|
else
|
||||||
Shell.su("rm -rf $PERSIST/$id").submit()
|
Shell.cmd("rm -rf $PERSIST/$id").submit()
|
||||||
} else {
|
} else {
|
||||||
removeFile.delete()
|
removeFile.delete()
|
||||||
if (Const.Version.atLeast_21_2())
|
if (Const.Version.atLeast_21_2())
|
||||||
Shell.su("copy_sepolicy_rules").submit()
|
Shell.cmd("copy_sepolicy_rules").submit()
|
||||||
else
|
else
|
||||||
Shell.su("cp -af $ruleFile $PERSIST/$id").submit()
|
Shell.cmd("cp -af $ruleFile $PERSIST/$id").submit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ data class LocalModule(
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
runCatching {
|
runCatching {
|
||||||
parseProps(Shell.su("dos2unix < $path/module.prop").exec().out)
|
parseProps(Shell.cmd("dos2unix < $path/module.prop").exec().out)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id.isEmpty()) {
|
if (id.isEmpty()) {
|
||||||
|
@ -36,7 +36,7 @@ class SuRequestHandler(
|
|||||||
|
|
||||||
// Never allow com.topjohnwu.magisk (could be malware)
|
// Never allow com.topjohnwu.magisk (could be malware)
|
||||||
if (policy.packageName == BuildConfig.APPLICATION_ID) {
|
if (policy.packageName == BuildConfig.APPLICATION_ID) {
|
||||||
Shell.su("(pm uninstall ${BuildConfig.APPLICATION_ID})& >/dev/null 2>&1").exec()
|
Shell.cmd("(pm uninstall ${BuildConfig.APPLICATION_ID})& >/dev/null 2>&1").exec()
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ open class FlashZip(
|
|||||||
|
|
||||||
console.add("- Installing ${mUri.displayName}")
|
console.add("- Installing ${mUri.displayName}")
|
||||||
|
|
||||||
return Shell.su("sh $installDir/update-binary dummy 1 \'$zipFile\'")
|
return Shell.cmd("sh $installDir/update-binary dummy 1 \'$zipFile\'")
|
||||||
.to(console, logs).exec().isSuccess
|
.to(console, logs).exec().isSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ open class FlashZip(
|
|||||||
Timber.e(e)
|
Timber.e(e)
|
||||||
false
|
false
|
||||||
} finally {
|
} finally {
|
||||||
Shell.su("cd /", "rm -rf $installDir ${Const.TMPDIR}").submit()
|
Shell.cmd("cd /", "rm -rf $installDir ${Const.TMPDIR}").submit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,7 @@ object HideAPK {
|
|||||||
Timber.e(e)
|
Timber.e(e)
|
||||||
stub.createNewFile()
|
stub.createNewFile()
|
||||||
val cmd = "\$MAGISKBIN/magiskinit -x manager ${stub.path}"
|
val cmd = "\$MAGISKBIN/magiskinit -x manager ${stub.path}"
|
||||||
if (!Shell.su(cmd).exec().isSuccess)
|
if (!Shell.cmd(cmd).exec().isSuccess)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -452,7 +452,7 @@ abstract class MagiskInstaller(
|
|||||||
if (success) {
|
if (success) {
|
||||||
console.add("- All done!")
|
console.add("- All done!")
|
||||||
} else {
|
} else {
|
||||||
Shell.sh("rm -rf $installDir").submit()
|
Shell.cmd("rm -rf $installDir").submit()
|
||||||
console.add("! Installation failed")
|
console.add("! Installation failed")
|
||||||
}
|
}
|
||||||
return success
|
return success
|
||||||
@ -497,7 +497,7 @@ abstract class MagiskInstaller(
|
|||||||
val success = super.exec()
|
val success = super.exec()
|
||||||
if (success) {
|
if (success) {
|
||||||
UiThreadHandler.handler.postDelayed(3000) {
|
UiThreadHandler.handler.postDelayed(3000) {
|
||||||
Shell.su("pm uninstall ${context.packageName}").exec()
|
Shell.cmd("pm uninstall ${context.packageName}").exec()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return success
|
return success
|
||||||
|
@ -5,6 +5,7 @@ import android.content.Intent
|
|||||||
import android.content.ServiceConnection
|
import android.content.ServiceConnection
|
||||||
import android.os.Binder
|
import android.os.Binder
|
||||||
import android.os.IBinder
|
import android.os.IBinder
|
||||||
|
import com.topjohnwu.superuser.Shell
|
||||||
import com.topjohnwu.superuser.ipc.RootService
|
import com.topjohnwu.superuser.ipc.RootService
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.util.concurrent.CountDownLatch
|
import java.util.concurrent.CountDownLatch
|
||||||
@ -48,6 +49,6 @@ class RootRegistry(stub: Any?) : RootService() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
var bindTask: Runnable? = null
|
var bindTask: Shell.Task? = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ import java.util.jar.JarFile
|
|||||||
class ShellInit : Shell.Initializer() {
|
class ShellInit : Shell.Initializer() {
|
||||||
override fun onInit(context: Context, shell: Shell): Boolean {
|
override fun onInit(context: Context, shell: Shell): Boolean {
|
||||||
if (shell.isRoot) {
|
if (shell.isRoot) {
|
||||||
RootRegistry.bindTask?.run()
|
RootRegistry.bindTask?.let { shell.execTask(it) }
|
||||||
RootRegistry.bindTask = null
|
RootRegistry.bindTask = null
|
||||||
}
|
}
|
||||||
shell.newJob().apply {
|
shell.newJob().apply {
|
||||||
|
@ -29,9 +29,9 @@ class LogRepository(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Info.env.isActive) {
|
if (Info.env.isActive) {
|
||||||
Shell.su("cat ${Const.MAGISK_LOG} || logcat -d -s Magisk").to(list).await()
|
Shell.cmd("cat ${Const.MAGISK_LOG} || logcat -d -s Magisk").to(list).await()
|
||||||
} else {
|
} else {
|
||||||
Shell.sh("logcat -d").to(list).await()
|
Shell.cmd("logcat -d").to(list).await()
|
||||||
}
|
}
|
||||||
return list.buf.toString()
|
return list.buf.toString()
|
||||||
}
|
}
|
||||||
@ -39,7 +39,7 @@ class LogRepository(
|
|||||||
suspend fun clearLogs() = logDao.deleteAll()
|
suspend fun clearLogs() = logDao.deleteAll()
|
||||||
|
|
||||||
fun clearMagiskLogs(cb: (Shell.Result) -> Unit) =
|
fun clearMagiskLogs(cb: (Shell.Result) -> Unit) =
|
||||||
Shell.su("echo -n > ${Const.MAGISK_LOG}").submit(cb)
|
Shell.cmd("echo -n > ${Const.MAGISK_LOG}").submit(cb)
|
||||||
|
|
||||||
suspend fun insert(log: SuLog) = logDao.insert(log)
|
suspend fun insert(log: SuLog) = logDao.insert(log)
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ object RebootEvent {
|
|||||||
R.id.action_reboot_bootloader -> systemReboot("bootloader")
|
R.id.action_reboot_bootloader -> systemReboot("bootloader")
|
||||||
R.id.action_reboot_download -> systemReboot("download")
|
R.id.action_reboot_download -> systemReboot("download")
|
||||||
R.id.action_reboot_edl -> systemReboot("edl")
|
R.id.action_reboot_edl -> systemReboot("edl")
|
||||||
R.id.action_reboot_recovery -> Shell.su("/system/bin/reboot recovery").submit()
|
R.id.action_reboot_recovery -> Shell.cmd("/system/bin/reboot recovery").submit()
|
||||||
else -> Unit
|
else -> Unit
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
@ -34,7 +34,7 @@ class UninstallDialog : DialogEvent() {
|
|||||||
show()
|
show()
|
||||||
}
|
}
|
||||||
|
|
||||||
Shell.su("restore_imgs").submit { result ->
|
Shell.cmd("restore_imgs").submit { result ->
|
||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
if (result.isSuccess) {
|
if (result.isSuccess) {
|
||||||
Utils.toast(R.string.restore_done, Toast.LENGTH_SHORT)
|
Utils.toast(R.string.restore_done, Toast.LENGTH_SHORT)
|
||||||
|
@ -84,7 +84,7 @@ fun Intent.startActivity(context: Context) = context.startActivity(this)
|
|||||||
fun Intent.startActivityWithRoot() {
|
fun Intent.startActivityWithRoot() {
|
||||||
val args = mutableListOf("am", "start", "--user", Const.USER_ID.toString())
|
val args = mutableListOf("am", "start", "--user", Const.USER_ID.toString())
|
||||||
val cmd = toCommand(args).joinToString(" ")
|
val cmd = toCommand(args).joinToString(" ")
|
||||||
Shell.su(cmd).submit()
|
Shell.cmd(cmd).submit()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Intent.toCommand(args: MutableList<String> = mutableListOf()): MutableList<String> {
|
fun Intent.toCommand(args: MutableList<String> = mutableListOf()): MutableList<String> {
|
||||||
|
@ -8,14 +8,14 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
fun reboot(reason: String = if (Config.recovery) "recovery" else "") {
|
fun reboot(reason: String = if (Config.recovery) "recovery" else "") {
|
||||||
Shell.su("/system/bin/svc power reboot $reason || /system/bin/reboot $reason").submit()
|
Shell.cmd("/system/bin/svc power reboot $reason || /system/bin/reboot $reason").submit()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun relaunchApp(context: Context) {
|
fun relaunchApp(context: Context) {
|
||||||
val intent = context.packageManager.getLaunchIntentForPackage(context.packageName) ?: return
|
val intent = context.packageManager.getLaunchIntentForPackage(context.packageName) ?: return
|
||||||
val args = mutableListOf("am", "start", "--user", Const.USER_ID.toString())
|
val args = mutableListOf("am", "start", "--user", Const.USER_ID.toString())
|
||||||
val cmd = intent.toCommand(args).joinToString(separator = " ")
|
val cmd = intent.toCommand(args).joinToString(separator = " ")
|
||||||
Shell.su("run_delay 1 \"$cmd\"").exec()
|
Shell.cmd("run_delay 1 \"$cmd\"").exec()
|
||||||
Runtime.getRuntime().exit(0)
|
Runtime.getRuntime().exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ class ProcessRvItem(
|
|||||||
set(value) = set(value, process.isEnabled, { process.isEnabled = it }, BR.enabled) {
|
set(value) = set(value, process.isEnabled, { process.isEnabled = it }, BR.enabled) {
|
||||||
val arg = if (it) "add" else "rm"
|
val arg = if (it) "add" else "rm"
|
||||||
val (name, pkg) = process
|
val (name, pkg) = process
|
||||||
Shell.su("magisk --denylist $arg $pkg \'$name\'").submit()
|
Shell.cmd("magisk --denylist $arg $pkg \'$name\'").submit()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun toggle() {
|
fun toggle() {
|
||||||
|
@ -52,7 +52,7 @@ class DenyListViewModel : BaseViewModel() {
|
|||||||
state = State.LOADING
|
state = State.LOADING
|
||||||
val (apps, diff) = withContext(Dispatchers.Default) {
|
val (apps, diff) = withContext(Dispatchers.Default) {
|
||||||
val pm = AppContext.packageManager
|
val pm = AppContext.packageManager
|
||||||
val denyList = Shell.su("magisk --denylist ls").exec().out
|
val denyList = Shell.cmd("magisk --denylist ls").exec().out
|
||||||
.map { CmdlineListItem(it) }
|
.map { CmdlineListItem(it) }
|
||||||
val apps = pm.getInstalledApplications(MATCH_UNINSTALLED_PACKAGES).run {
|
val apps = pm.getInstalledApplications(MATCH_UNINSTALLED_PACKAGES).run {
|
||||||
asFlow()
|
asFlow()
|
||||||
|
@ -144,7 +144,7 @@ class HomeViewModel(
|
|||||||
private suspend fun ensureEnv() {
|
private suspend fun ensureEnv() {
|
||||||
if (MagiskState.NOT_INSTALLED == stateMagisk || checkedEnv) return
|
if (MagiskState.NOT_INSTALLED == stateMagisk || checkedEnv) return
|
||||||
val cmd = "env_check ${Info.env.versionString} ${Info.env.versionCode}"
|
val cmd = "env_check ${Info.env.versionString} ${Info.env.versionCode}"
|
||||||
if (!Shell.su(cmd).await().isSuccess) {
|
if (!Shell.cmd(cmd).await().isSuccess) {
|
||||||
EnvFixDialog(this).publish()
|
EnvFixDialog(this).publish()
|
||||||
}
|
}
|
||||||
checkedEnv = true
|
checkedEnv = true
|
||||||
|
@ -257,7 +257,7 @@ object DenyList : BaseSettingsItem.Toggle() {
|
|||||||
set(value) {
|
set(value) {
|
||||||
field = value
|
field = value
|
||||||
val cmd = if (value) "enable" else "disable"
|
val cmd = if (value) "enable" else "disable"
|
||||||
Shell.su("magisk --denylist $cmd").submit { result ->
|
Shell.cmd("magisk --denylist $cmd").submit { result ->
|
||||||
if (result.isSuccess) {
|
if (result.isSuccess) {
|
||||||
Config.denyList = value
|
Config.denyList = value
|
||||||
} else {
|
} else {
|
||||||
|
@ -134,7 +134,7 @@ class SettingsViewModel : BaseViewModel(), BaseSettingsItem.Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun createHosts() {
|
private fun createHosts() {
|
||||||
Shell.su("add_hosts_module").submit {
|
Shell.cmd("add_hosts_module").submit {
|
||||||
Utils.toast(R.string.settings_hosts_toast, Toast.LENGTH_SHORT)
|
Utils.toast(R.string.settings_hosts_toast, Toast.LENGTH_SHORT)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ tasks.withType<KotlinCompile> {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(kotlin("gradle-plugin", "1.6.10"))
|
implementation(kotlin("gradle-plugin", "1.6.10"))
|
||||||
implementation("com.android.tools.build:gradle:7.1.1")
|
implementation("com.android.tools.build:gradle:7.1.2")
|
||||||
implementation("androidx.navigation:navigation-safe-args-gradle-plugin:2.5.0-alpha01")
|
implementation("androidx.navigation:navigation-safe-args-gradle-plugin:2.5.0-alpha01")
|
||||||
implementation("io.michaelrocks:paranoid-gradle-plugin:0.3.7")
|
implementation("io.michaelrocks:paranoid-gradle-plugin:0.3.7")
|
||||||
implementation("org.eclipse.jgit:org.eclipse.jgit:5.12.0.202106070339-r")
|
implementation("org.eclipse.jgit:org.eclipse.jgit:5.12.0.202106070339-r")
|
||||||
|
Loading…
Reference in New Issue
Block a user