From 52e1b84d41173993470e7b4e34624dc6d5393167 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sat, 30 Jan 2021 01:12:49 -0800 Subject: [PATCH] Symlink pre API 21 --- .../java/com/topjohnwu/magisk/ktx/XAndroid.kt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/ktx/XAndroid.kt b/app/src/main/java/com/topjohnwu/magisk/ktx/XAndroid.kt index 5e9dedc70..f970649f9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ktx/XAndroid.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ktx/XAndroid.kt @@ -56,22 +56,24 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import java.io.File +import java.lang.reflect.Method import java.lang.reflect.Array as JArray val packageName: String get() = get().packageName +private lateinit var osSymlink: Method +private lateinit var os: Any + fun symlink(oldPath: String, newPath: String) { if (SDK_INT >= 21) { Os.symlink(oldPath, newPath) } else { - // Just copy the files pre 5.0 - val old = File(oldPath) - val newFile = File(newPath) - old.copyTo(newFile) - if (old.canExecute()) - newFile.setExecutable(true) + if (!::osSymlink.isInitialized) { + os = Class.forName("libcore.io.Libcore").getField("os").get(null)!! + osSymlink = os.javaClass.getMethod("symlink", String::class.java, String::class.java) + } + osSymlink.invoke(os, oldPath, newPath) } - } val ServiceInfo.isIsolated get() = (flags and FLAG_ISOLATED_PROCESS) != 0