From a25d6478ff5e95048c05aba5f1d50cf1573880ab Mon Sep 17 00:00:00 2001 From: Mygod Date: Thu, 13 Aug 2020 03:51:21 +0800 Subject: [PATCH] Refactoring to lazy --- .../be/mygod/librootkotlinx/AppProcess.kt | 20 +++++++------------ .../java/be/mygod/librootkotlinx/Utils.kt | 19 ++++++++++++++++++ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/mobile/src/main/java/be/mygod/librootkotlinx/AppProcess.kt b/mobile/src/main/java/be/mygod/librootkotlinx/AppProcess.kt index e27f71b6..1dbc20c1 100644 --- a/mobile/src/main/java/be/mygod/librootkotlinx/AppProcess.kt +++ b/mobile/src/main/java/be/mygod/librootkotlinx/AppProcess.kt @@ -11,24 +11,18 @@ object AppProcess { /** * Based on: https://android.googlesource.com/platform/bionic/+/aff9a34/linker/linker.cpp#3397 */ - @get:RequiresApi(29) + @get:RequiresApi(28) val genericLdConfigFilePath: String get() { - val classVMRuntime = Class.forName("dalvik.system.VMRuntime") - val abiString = classVMRuntime.getDeclaredMethod("getCurrentInstructionSet").invoke( - classVMRuntime.getDeclaredMethod("getRuntime").invoke(null)) - "/system/etc/ld.config.$abiString.txt".let { if (File(it).isFile) return it } + "/system/etc/ld.config.$currentInstructionSet.txt".let { if (File(it).isFile) return it } if (Build.VERSION.SDK_INT >= 30) "/linkerconfig/ld.config.txt".let { check(File(it).isFile) { "failed to find generated linker configuration from \"$it\"" } return it } - val prop = Class.forName("android.os.SystemProperties") - if (prop.getDeclaredMethod("getBoolean", String::class.java, Boolean::class.java).invoke(null, - "ro.vndk.lite", false) as Boolean) "/system/etc/ld.config.vndk_lite.txt".let { - if (File(it).isFile) return it - } else when (val version = prop.getDeclaredMethod("get", String::class.java, String::class.java).invoke(null, - "ro.vndk.version", "") as String) { + if (isVndkLite) { + "/system/etc/ld.config.vndk_lite.txt".let { if (File(it).isFile) return it } + } else when (vndkVersion) { "", "current" -> { } - else -> "/system/etc/ld.config.$version.txt".let { if (File(it).isFile) return it } + else -> "/system/etc/ld.config.$vndkVersion.txt".let { if (File(it).isFile) return it } } return "/system/etc/ld.config.txt" } @@ -36,7 +30,7 @@ object AppProcess { /** * Based on: https://android.googlesource.com/platform/bionic/+/30f2f05/linker/linker_config.cpp#182 */ - @RequiresApi(29) + @RequiresApi(26) fun findLinkerSection(lines: Sequence, binaryRealPath: String): String { for (untrimmed in lines) { val line = untrimmed.substringBefore('#').trim() diff --git a/mobile/src/main/java/be/mygod/librootkotlinx/Utils.kt b/mobile/src/main/java/be/mygod/librootkotlinx/Utils.kt index f2f21c54..4249bf51 100644 --- a/mobile/src/main/java/be/mygod/librootkotlinx/Utils.kt +++ b/mobile/src/main/java/be/mygod/librootkotlinx/Utils.kt @@ -7,10 +7,29 @@ import android.content.Context import android.os.Parcel import android.os.Parcelable import android.util.* +import androidx.annotation.RequiresApi import kotlinx.android.parcel.Parcelize class NoShellException(cause: Throwable) : Exception("Root missing", cause) +val currentInstructionSet by lazy { + val classVMRuntime = Class.forName("dalvik.system.VMRuntime") + val runtime = classVMRuntime.getDeclaredMethod("getRuntime").invoke(null) + classVMRuntime.getDeclaredMethod("getCurrentInstructionSet").invoke(runtime) as String +} + +private val classSystemProperties by lazy { Class.forName("android.os.SystemProperties") } +@get:RequiresApi(26) +val isVndkLite by lazy { + classSystemProperties.getDeclaredMethod("getBoolean", String::class.java, Boolean::class.java).invoke(null, + "ro.vndk.lite", false) as Boolean +} +@get:RequiresApi(26) +val vndkVersion by lazy { + classSystemProperties.getDeclaredMethod("get", String::class.java, String::class.java).invoke(null, + "ro.vndk.version", "") as String +} + val systemContext by lazy { val classActivityThread = Class.forName("android.app.ActivityThread") val activityThread = classActivityThread.getMethod("systemMain").invoke(null)