diff --git a/app/src/main/java/com/topjohnwu/magisk/core/Hacks.kt b/app/src/main/java/com/topjohnwu/magisk/core/Hacks.kt index 1b0eed799..634a3c71d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/Hacks.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/Hacks.kt @@ -20,7 +20,6 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.download.DownloadService import com.topjohnwu.magisk.core.utils.refreshLocale import com.topjohnwu.magisk.core.utils.updateConfig -import com.topjohnwu.magisk.ktx.forceGetDeclaredField import com.topjohnwu.magisk.ui.MainActivity import com.topjohnwu.magisk.ui.surequest.SuRequestActivity @@ -137,8 +136,10 @@ private class JobSchedulerWrapper(private val base: JobScheduler) : JobScheduler service.packageName, Info.stubChk.classToComponent[name] ?: name ) + javaClass.getDeclaredField("service").apply { + isAccessible = true + }.set(this, component) - javaClass.forceGetDeclaredField("service")?.set(this, component) return this } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ktx/XJava.kt b/app/src/main/java/com/topjohnwu/magisk/ktx/XJava.kt index 3b086e71d..8cf123de1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ktx/XJava.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ktx/XJava.kt @@ -6,8 +6,6 @@ import timber.log.Timber import java.io.File import java.io.InputStream import java.io.OutputStream -import java.lang.reflect.Field -import java.lang.reflect.Method import java.text.SimpleDateFormat import java.util.* import java.util.zip.ZipEntry @@ -110,32 +108,3 @@ fun Locale.toLangTag(): String { fun SimpleDateFormat.parseOrNull(date: String) = runCatching { parse(date) }.onFailure { Timber.e(it) }.getOrNull() - -// Reflection hacks - -private val loadClass = ClassLoader::class.java.getMethod("loadClass", String::class.java) -private val getDeclaredMethod = Class::class.java.getMethod("getDeclaredMethod", - String::class.java, arrayOf>()::class.java) -private val getDeclaredField = Class::class.java.getMethod("getDeclaredField", String::class.java) - -fun ClassLoader.forceLoadClass(name: String) = - runCatching { loadClass.invoke(this, name) }.getOrNull() as Class<*>? - -fun Class<*>.forceGetDeclaredMethod(name: String, vararg types: Class<*>) = - (runCatching { getDeclaredMethod.invoke(this, name, types) }.getOrNull() as Method?)?.also { - it.isAccessible = true - } - -fun Class<*>.forceGetDeclaredField(name: String) = - (runCatching { getDeclaredField.invoke(this, name) }.getOrNull() as Field?)?.also { - it.isAccessible = true - } - -inline fun T.forceGetClass(name: String) = - T::class.java.classLoader?.forceLoadClass(name) - -fun Class<*>.forceGetField(name: String): Field? = - forceGetDeclaredField(name) ?: superclass?.forceGetField(name) - -fun Class<*>.forceGetMethod(name: String, vararg types: Class<*>): Method? = - forceGetDeclaredMethod(name, *types) ?: superclass?.forceGetMethod(name, *types)