From c7f8e66e6c607c986ac6c8dcfe5d88435a10b6e4 Mon Sep 17 00:00:00 2001 From: qimiko <25387744+qimiko@users.noreply.github.com> Date: Wed, 27 Dec 2023 01:16:45 -0700 Subject: [PATCH] load geode by system abi --- .../geode/launcher/GeometryDashActivity.kt | 61 +++++++++---------- .../com/geode/launcher/utils/LaunchUtils.kt | 19 +++++- 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/geode/launcher/GeometryDashActivity.kt b/app/src/main/java/com/geode/launcher/GeometryDashActivity.kt index 93f5c9ac..d88203d9 100644 --- a/app/src/main/java/com/geode/launcher/GeometryDashActivity.kt +++ b/app/src/main/java/com/geode/launcher/GeometryDashActivity.kt @@ -128,15 +128,13 @@ class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperL // these libraries are available to the application after merging // find the first instance of the library in preferred abi order - val libraryFd = Build.SUPPORTED_ABIS.asSequence() - .mapNotNull { - try { - assets.openNonAssetFd("lib/$it/lib$libraryName.so") - } catch (_: Exception) { - null - } - } - .firstOrNull() ?: throw UnsatisfiedLinkError("Could not find library lib$libraryName.so") + val arch = LaunchUtils.getApplicationArchitecture() + + val libraryFd = try { + assets.openNonAssetFd("lib/$arch/lib$libraryName.so") + } catch (_: Exception) { + throw UnsatisfiedLinkError("Could not find library lib$libraryName.so for abi $arch") + } val fdOffset = libraryFd.startOffset val fdDescriptor = libraryFd.parcelFileDescriptor.detachFd() @@ -166,38 +164,35 @@ class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperL System.load(geodePath.path) return true } - else { - // you know zmx i have 0 clue what this does so im - // just gonna like copy the binary from external - // also i get 20 million permission denied errors - getExternalFilesDir(null)?.let { dir -> - val externalGeodePath = LaunchUtils.getInstalledGeodePath(this) - if (externalGeodePath == null) { - return false - } - val copiedPath = File(filesDir.path, "copied") - if (copiedPath.exists()) { - copiedPath.deleteRecursively() - } - copiedPath.mkdir() + // you know zmx i have 0 clue what this does so im + // just gonna like copy the binary from external + // also i get 20 million permission denied errors + getExternalFilesDir(null)?.let { dir -> + val externalGeodePath = LaunchUtils.getInstalledGeodePath(this) ?: return false - val geodePath = File(copiedPath.path, "Geode.so") + val copiedPath = File(filesDir.path, "copied") + if (copiedPath.exists()) { + copiedPath.deleteRecursively() + } + copiedPath.mkdir() - if (externalGeodePath.exists()) { - copyFile(FileInputStream(externalGeodePath), FileOutputStream(geodePath)) + val geodePath = File(copiedPath.path, "Geode.so") - if (geodePath.exists()) { - try { - println("Loading Geode from ${externalGeodePath.name}") - System.load(geodePath.path) - } catch (e: UnsatisfiedLinkError) { - e.printStackTrace() - } + if (externalGeodePath.exists()) { + copyFile(FileInputStream(externalGeodePath), FileOutputStream(geodePath)) + + if (geodePath.exists()) { + try { + println("Loading Geode from ${externalGeodePath.name}") + System.load(geodePath.path) + } catch (e: UnsatisfiedLinkError) { + e.printStackTrace() } } } } + } return false diff --git a/app/src/main/java/com/geode/launcher/utils/LaunchUtils.kt b/app/src/main/java/com/geode/launcher/utils/LaunchUtils.kt index 8701e6a7..82d3576e 100644 --- a/app/src/main/java/com/geode/launcher/utils/LaunchUtils.kt +++ b/app/src/main/java/com/geode/launcher/utils/LaunchUtils.kt @@ -1,9 +1,11 @@ package com.geode.launcher.utils +import android.annotation.SuppressLint import android.content.pm.PackageInfo import android.content.pm.PackageManager import android.content.res.AssetManager import android.content.Context +import android.os.Build import java.io.File object LaunchUtils { @@ -16,18 +18,28 @@ object LaunchUtils { } } + fun getApplicationArchitecture(): String { + // supposedly CPU_ABI returns the current arch for the running application + // despite being deprecated, this is also one of the few ways to get this information + @Suppress("DEPRECATION") + return Build.CPU_ABI + } + fun getInstalledGeodePath(context: Context): File? { - val internalGeodePath = File(context.filesDir.path, "launcher/Geode.so") + val arch = getApplicationArchitecture() + val geodeName = "Geode.$arch.so" + + val internalGeodePath = File(context.filesDir.path, "launcher/$geodeName") if (internalGeodePath.exists()) { return internalGeodePath } context.getExternalFilesDir(null)?.let { dir-> - val updateGeodePath = File(dir.path, "game/geode/update/Geode.so") + val updateGeodePath = File(dir.path, "game/geode/update/$geodeName") if (updateGeodePath.exists()) { return updateGeodePath } - val externalGeodePath = File(dir.path, "Geode.so") + val externalGeodePath = File(dir.path, geodeName) if (externalGeodePath.exists()) { return externalGeodePath } @@ -39,6 +51,7 @@ object LaunchUtils { return getInstalledGeodePath(context) != null } + @SuppressLint("DiscouragedPrivateApi") fun addAssetsFromPackage(assetManager: AssetManager, packageInfo: PackageInfo) { // this method is officially marked as deprecated but it is the only method we are allowed to reflect // (the source recommends replacing with AssetManager.setApkAssets(ApkAssets[], boolean) lol)