From fb5c7c2f9d3fb27b7fe52c0eef458821ae9ece08 Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Sun, 6 Jul 2025 14:44:36 +0800 Subject: [PATCH] manager: Updated dependency library version - Add JNI macros to simplify field setup and object creation --- manager/app/build.gradle.kts | 1 - manager/app/src/main/cpp/jni.c | 113 ++++++++++++----------------- manager/app/src/main/cpp/prelude.h | 49 +++++++++++++ manager/gradle/libs.versions.toml | 22 +++--- 4 files changed, 106 insertions(+), 79 deletions(-) diff --git a/manager/app/build.gradle.kts b/manager/app/build.gradle.kts index f09d042c..3458f146 100644 --- a/manager/app/build.gradle.kts +++ b/manager/app/build.gradle.kts @@ -1,6 +1,5 @@ @file:Suppress("UnstableApiUsage") -import com.android.build.api.dsl.ApkSigningConfig import com.android.build.gradle.internal.api.BaseVariantOutputImpl import com.android.build.gradle.tasks.PackageAndroidArtifact diff --git a/manager/app/src/main/cpp/jni.c b/manager/app/src/main/cpp/jni.c index 964a7231..836f74c4 100644 --- a/manager/app/src/main/cpp/jni.c +++ b/manager/app/src/main/cpp/jni.c @@ -19,6 +19,13 @@ NativeBridgeNP(getVersion, jint) { return get_version(); } +// get VERSION FULL +NativeBridgeNP(getFullVersion, jstring) { + char buff[255] = { 0 }; + get_full_version((char *) &buff); + return GetEnvironment()->NewStringUTF(env, buff); +} + NativeBridgeNP(getAllowList, jintArray) { int uids[1024]; int size = 0; @@ -291,16 +298,19 @@ NativeBridge(setSuEnabled, jboolean, jboolean enabled) { return set_su_enabled(enabled); } +// Check if KPM is enabled NativeBridgeNP(isKPMEnabled, jboolean) { return is_KPM_enable(); } +// Get HOOK type NativeBridgeNP(getHookType, jstring) { char hook_type[16]; get_hook_type(hook_type, sizeof(hook_type)); return GetEnvironment()->NewStringUTF(env, hook_type); } +// SuSFS Related Function Status NativeBridgeNP(getSusfsFeatureStatus, jobject) { struct susfs_feature_status status; bool result = get_susfs_feature_status(&status); @@ -313,46 +323,25 @@ NativeBridgeNP(getSusfsFeatureStatus, jobject) { jmethodID constructor = GetEnvironment()->GetMethodID(env, cls, "", "()V"); jobject obj = GetEnvironment()->NewObject(env, cls, constructor); - // 设置各个字段 - jfieldID statusSusPathField = GetEnvironment()->GetFieldID(env, cls, "statusSusPath", "Z"); - jfieldID statusSusMountField = GetEnvironment()->GetFieldID(env, cls, "statusSusMount", "Z"); - jfieldID statusAutoDefaultMountField = GetEnvironment()->GetFieldID(env, cls, "statusAutoDefaultMount", "Z"); - jfieldID statusAutoBindMountField = GetEnvironment()->GetFieldID(env, cls, "statusAutoBindMount", "Z"); - jfieldID statusSusKstatField = GetEnvironment()->GetFieldID(env, cls, "statusSusKstat", "Z"); - jfieldID statusTryUmountField = GetEnvironment()->GetFieldID(env, cls, "statusTryUmount", "Z"); - jfieldID statusAutoTryUmountBindField = GetEnvironment()->GetFieldID(env, cls, "statusAutoTryUmountBind", "Z"); - jfieldID statusSpoofUnameField = GetEnvironment()->GetFieldID(env, cls, "statusSpoofUname", "Z"); - jfieldID statusEnableLogField = GetEnvironment()->GetFieldID(env, cls, "statusEnableLog", "Z"); - jfieldID statusHideSymbolsField = GetEnvironment()->GetFieldID(env, cls, "statusHideSymbols", "Z"); - jfieldID statusSpoofCmdlineField = GetEnvironment()->GetFieldID(env, cls, "statusSpoofCmdline", "Z"); - jfieldID statusOpenRedirectField = GetEnvironment()->GetFieldID(env, cls, "statusOpenRedirect", "Z"); - jfieldID statusMagicMountField = GetEnvironment()->GetFieldID(env, cls, "statusMagicMount", "Z"); - jfieldID statusSusSuField = GetEnvironment()->GetFieldID(env, cls, "statusSusSu", "Z"); - - GetEnvironment()->SetBooleanField(env, obj, statusSusPathField, status.status_sus_path); - GetEnvironment()->SetBooleanField(env, obj, statusSusMountField, status.status_sus_mount); - GetEnvironment()->SetBooleanField(env, obj, statusAutoDefaultMountField, status.status_auto_default_mount); - GetEnvironment()->SetBooleanField(env, obj, statusAutoBindMountField, status.status_auto_bind_mount); - GetEnvironment()->SetBooleanField(env, obj, statusSusKstatField, status.status_sus_kstat); - GetEnvironment()->SetBooleanField(env, obj, statusTryUmountField, status.status_try_umount); - GetEnvironment()->SetBooleanField(env, obj, statusAutoTryUmountBindField, status.status_auto_try_umount_bind); - GetEnvironment()->SetBooleanField(env, obj, statusSpoofUnameField, status.status_spoof_uname); - GetEnvironment()->SetBooleanField(env, obj, statusEnableLogField, status.status_enable_log); - GetEnvironment()->SetBooleanField(env, obj, statusHideSymbolsField, status.status_hide_symbols); - GetEnvironment()->SetBooleanField(env, obj, statusSpoofCmdlineField, status.status_spoof_cmdline); - GetEnvironment()->SetBooleanField(env, obj, statusOpenRedirectField, status.status_open_redirect); - GetEnvironment()->SetBooleanField(env, obj, statusMagicMountField, status.status_magic_mount); - GetEnvironment()->SetBooleanField(env, obj, statusSusSuField, status.status_sus_su); + SET_BOOLEAN_FIELD(obj, cls, statusSusPath, status.status_sus_path); + SET_BOOLEAN_FIELD(obj, cls, statusSusMount, status.status_sus_mount); + SET_BOOLEAN_FIELD(obj, cls, statusAutoDefaultMount, status.status_auto_default_mount); + SET_BOOLEAN_FIELD(obj, cls, statusAutoBindMount, status.status_auto_bind_mount); + SET_BOOLEAN_FIELD(obj, cls, statusSusKstat, status.status_sus_kstat); + SET_BOOLEAN_FIELD(obj, cls, statusTryUmount, status.status_try_umount); + SET_BOOLEAN_FIELD(obj, cls, statusAutoTryUmountBind, status.status_auto_try_umount_bind); + SET_BOOLEAN_FIELD(obj, cls, statusSpoofUname, status.status_spoof_uname); + SET_BOOLEAN_FIELD(obj, cls, statusEnableLog, status.status_enable_log); + SET_BOOLEAN_FIELD(obj, cls, statusHideSymbols, status.status_hide_symbols); + SET_BOOLEAN_FIELD(obj, cls, statusSpoofCmdline, status.status_spoof_cmdline); + SET_BOOLEAN_FIELD(obj, cls, statusOpenRedirect, status.status_open_redirect); + SET_BOOLEAN_FIELD(obj, cls, statusMagicMount, status.status_magic_mount); + SET_BOOLEAN_FIELD(obj, cls, statusSusSu, status.status_sus_su); return obj; } -NativeBridgeNP(getFullVersion, jstring) { - char buff[255] = { 0 }; - get_full_version((char *) &buff); - return GetEnvironment()->NewStringUTF(env, buff); -} - +// dynamic sign NativeBridge(setDynamicSign, jboolean, jint size, jstring hash) { if (!hash) { LogDebug("setDynamicSign: hash is null"); @@ -376,15 +365,11 @@ NativeBridgeNP(getDynamicSign, jobject) { return NULL; } + jobject obj = CREATE_JAVA_OBJECT("com/sukisu/ultra/Natives$DynamicSignConfig"); jclass cls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$DynamicSignConfig"); - jmethodID constructor = GetEnvironment()->GetMethodID(env, cls, "", "()V"); - jobject obj = GetEnvironment()->NewObject(env, cls, constructor); - jfieldID sizeField = GetEnvironment()->GetFieldID(env, cls, "size", "I"); - jfieldID hashField = GetEnvironment()->GetFieldID(env, cls, "hash", "Ljava/lang/String;"); - - GetEnvironment()->SetIntField(env, obj, sizeField, (jint)config.size); - GetEnvironment()->SetObjectField(env, obj, hashField, GetEnvironment()->NewStringUTF(env, config.hash)); + SET_INT_FIELD(obj, cls, size, (jint)config.size); + SET_STRING_FIELD(obj, cls, hash, config.hash); LogDebug("getDynamicSign: size=0x%x, hash=%.16s...", config.size, config.hash); return obj; @@ -396,41 +381,35 @@ NativeBridgeNP(clearDynamicSign, jboolean) { return result; } +// Get a list of active managers NativeBridgeNP(getManagersList, jobject) { - struct manager_list_info info; - bool result = get_managers_list(&info); + struct manager_list_info managerListInfo; + bool result = get_managers_list(&managerListInfo); if (!result) { - LogDebug("getManagersList: failed to get managers list"); + LogDebug("getManagersList: failed to get active managers list"); return NULL; } - jclass cls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$ManagersList"); - jmethodID constructor = GetEnvironment()->GetMethodID(env, cls, "", "()V"); - jobject obj = GetEnvironment()->NewObject(env, cls, constructor); + jobject obj = CREATE_JAVA_OBJECT("com/sukisu/ultra/Natives$ManagersList"); + jclass managerListCls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$ManagersList"); - jfieldID countField = GetEnvironment()->GetFieldID(env, cls, "count", "I"); - jfieldID managersField = GetEnvironment()->GetFieldID(env, cls, "managers", "Ljava/util/List;"); + SET_INT_FIELD(obj, managerListCls, count, (jint)managerListInfo.count); - GetEnvironment()->SetIntField(env, obj, countField, (jint)info.count); + jobject managersList = CREATE_ARRAYLIST(); - jclass arrayListCls = GetEnvironment()->FindClass(env, "java/util/ArrayList"); - jmethodID arrayListConstructor = GetEnvironment()->GetMethodID(env, arrayListCls, "", "()V"); - jobject managersList = GetEnvironment()->NewObject(env, arrayListCls, arrayListConstructor); - jmethodID addMethod = GetEnvironment()->GetMethodID(env, arrayListCls, "add", "(Ljava/lang/Object;)Z"); - - jclass managerInfoCls = GetEnvironment()->FindClass(env, "com/sukisu/ultra/Natives$ManagerInfo"); - jmethodID managerInfoConstructor = GetEnvironment()->GetMethodID(env, managerInfoCls, "", "(II)V"); - - for (int i = 0; i < info.count; i++) { - jobject managerInfo = GetEnvironment()->NewObject(env, managerInfoCls, managerInfoConstructor, - (jint)info.managers[i].uid, - (jint)info.managers[i].signature_index); - GetEnvironment()->CallBooleanMethod(env, managersList, addMethod, managerInfo); + for (int i = 0; i < managerListInfo.count; i++) { + jobject managerInfo = CREATE_JAVA_OBJECT_WITH_PARAMS( + "com/sukisu/ultra/Natives$ManagerInfo", + "(II)V", + (jint)managerListInfo.managers[i].uid, + (jint)managerListInfo.managers[i].signature_index + ); + ADD_TO_LIST(managersList, managerInfo); } - GetEnvironment()->SetObjectField(env, obj, managersField, managersList); + SET_OBJECT_FIELD(obj, managerListCls, managers, managersList); - LogDebug("getManagersList: count=%d", info.count); + LogDebug("getManagersList: count=%d", managerListInfo.count); return obj; } diff --git a/manager/app/src/main/cpp/prelude.h b/manager/app/src/main/cpp/prelude.h index 16a4a2b5..40650e68 100644 --- a/manager/app/src/main/cpp/prelude.h +++ b/manager/app/src/main/cpp/prelude.h @@ -12,6 +12,55 @@ #define NativeBridge(fn, rtn, ...) JNIEXPORT rtn JNICALL Java_com_sukisu_ultra_Natives_##fn(JNIEnv* env, jclass clazz, __VA_ARGS__) #define NativeBridgeNP(fn, rtn) JNIEXPORT rtn JNICALL Java_com_sukisu_ultra_Natives_##fn(JNIEnv* env, jclass clazz) +// Macros to simplify field setup +#define SET_BOOLEAN_FIELD(obj, cls, fieldName, value) do { \ + jfieldID field = GetEnvironment()->GetFieldID(env, cls, #fieldName, "Z"); \ + GetEnvironment()->SetBooleanField(env, obj, field, value); \ +} while(0) + +#define SET_INT_FIELD(obj, cls, fieldName, value) do { \ + jfieldID field = GetEnvironment()->GetFieldID(env, cls, #fieldName, "I"); \ + GetEnvironment()->SetIntField(env, obj, field, value); \ +} while(0) + +#define SET_STRING_FIELD(obj, cls, fieldName, value) do { \ + jfieldID field = GetEnvironment()->GetFieldID(env, cls, #fieldName, "Ljava/lang/String;"); \ + GetEnvironment()->SetObjectField(env, obj, field, GetEnvironment()->NewStringUTF(env, value)); \ +} while(0) + +#define SET_OBJECT_FIELD(obj, cls, fieldName, value) do { \ + jfieldID field = GetEnvironment()->GetFieldID(env, cls, #fieldName, "Ljava/util/List;"); \ + GetEnvironment()->SetObjectField(env, obj, field, value); \ +} while(0) + +// Macros for creating Java objects +#define CREATE_JAVA_OBJECT(className) ({ \ + jclass cls = GetEnvironment()->FindClass(env, className); \ + jmethodID constructor = GetEnvironment()->GetMethodID(env, cls, "", "()V"); \ + GetEnvironment()->NewObject(env, cls, constructor); \ +}) + +// Macros for creating ArrayList +#define CREATE_ARRAYLIST() ({ \ + jclass arrayListCls = GetEnvironment()->FindClass(env, "java/util/ArrayList"); \ + jmethodID constructor = GetEnvironment()->GetMethodID(env, arrayListCls, "", "()V"); \ + GetEnvironment()->NewObject(env, arrayListCls, constructor); \ +}) + +// Macros for adding elements to an ArrayList +#define ADD_TO_LIST(list, item) do { \ + jclass cls = GetEnvironment()->GetObjectClass(env, list); \ + jmethodID addMethod = GetEnvironment()->GetMethodID(env, cls, "add", "(Ljava/lang/Object;)Z"); \ + GetEnvironment()->CallBooleanMethod(env, list, addMethod, item); \ +} while(0) + +// Macros for creating Java objects with parameter constructors +#define CREATE_JAVA_OBJECT_WITH_PARAMS(className, signature, ...) ({ \ + jclass cls = GetEnvironment()->FindClass(env, className); \ + jmethodID constructor = GetEnvironment()->GetMethodID(env, cls, "", signature); \ + GetEnvironment()->NewObject(env, cls, constructor, __VA_ARGS__); \ +}) + #define LogDebug(...) __android_log_print(ANDROID_LOG_DEBUG, "KernelSU", __VA_ARGS__) #endif diff --git a/manager/gradle/libs.versions.toml b/manager/gradle/libs.versions.toml index 5c2b4fd1..becff361 100644 --- a/manager/gradle/libs.versions.toml +++ b/manager/gradle/libs.versions.toml @@ -1,27 +1,27 @@ [versions] accompanist-drawablepainter = "0.37.3" agp = "8.11.0" -gson = "2.11.0" -kotlin = "2.1.20" -ksp = "2.1.20-2.0.0" -compose-bom = "2025.05.01" -lifecycle = "2.9.0" -navigation = "2.9.0" +gson = "2.13.1" +kotlin = "2.1.21" +ksp = "2.1.21-2.0.1" +compose-bom = "2025.06.01" +lifecycle = "2.9.1" +navigation = "2.9.1" activity-compose = "1.10.1" kotlinx-coroutines = "1.10.2" coil-compose = "2.7.0" -compose-destination = "2.1.0" +compose-destination = "2.2.0" sheets-compose-dialogs = "1.3.0" markdown = "4.6.2" -webkit = "1.13.0" +webkit = "1.14.0" appiconloader-coil = "1.5.0" parcelablelist = "2.0.1" libsu = "6.0.0" apksign = "1.4" cmaker = "1.2" -compose-material = "1.8.2" +compose-material = "1.8.3" compose-material3 = "1.3.2" -compose-ui = "1.8.2" +compose-ui = "1.8.3" documentfile = "1.1.0" mmrl = "2bb00b3c2b" @@ -81,7 +81,7 @@ sheet-compose-dialogs-input = { group = "com.maxkeppeler.sheets-compose-dialogs" markdown = { group = "io.noties.markwon", name = "core", version.ref = "markdown" } -lsposed-cxx = { module = "org.lsposed.libcxx:libcxx", version = "27.0.12077973" } +lsposed-cxx = { module = "org.lsposed.libcxx:libcxx", version = "29.0.13599879-beta2" } androidx-documentfile = { group = "androidx.documentfile", name = "documentfile", version.ref = "documentfile" }