From b8a230c99aa7f35de3e0ad61566ab922e5263d61 Mon Sep 17 00:00:00 2001 From: huajiqaq Date: Tue, 10 Feb 2026 17:44:33 +0800 Subject: [PATCH] Add native init state and null-safe URI handling Introduce native core initialization state (isNativeCoreInitialized / setNativeCoreInitialized) in NativeCoreBridge and use it when initializing MMKV to better track / log init status. Adjust initializeMmkvForPrimaryNativeLibrary to use the new API and set the flag via setter. Update LogUtils to consult the native init state before gating logs, preventing premature log suppression. Make WePkgDispatcher null-safe for getUri to avoid NPEs, and add a comment in MmkvConfigManagerImpl highlighting that MMKV must be initialized before use. --- .../wekit/config/MmkvConfigManagerImpl.java | 1 + .../sdk/protocol/listener/WePkgDispatcher.kt | 3 +- .../wekit/loader/core/NativeCoreBridge.java | 90 +++++++++---------- .../moe/ouom/wekit/util/log/LogUtils.java | 3 +- 4 files changed, 46 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/moe/ouom/wekit/config/MmkvConfigManagerImpl.java b/app/src/main/java/moe/ouom/wekit/config/MmkvConfigManagerImpl.java index 7642600..287231f 100644 --- a/app/src/main/java/moe/ouom/wekit/config/MmkvConfigManagerImpl.java +++ b/app/src/main/java/moe/ouom/wekit/config/MmkvConfigManagerImpl.java @@ -368,6 +368,7 @@ public Set> entrySet() { protected MmkvConfigManagerImpl(@NonNull String name) { mmkvId = Objects.requireNonNull(name, "name"); + // 调用前需要等待模块mmkv初始化完毕 mmkv = MMKV.mmkvWithID(name, MMKV.MULTI_PROCESS_MODE); file = new File(MMKV.getRootDir(), name); } diff --git a/app/src/main/java/moe/ouom/wekit/hooks/sdk/protocol/listener/WePkgDispatcher.kt b/app/src/main/java/moe/ouom/wekit/hooks/sdk/protocol/listener/WePkgDispatcher.kt index c79a5fb..fa26364 100644 --- a/app/src/main/java/moe/ouom/wekit/hooks/sdk/protocol/listener/WePkgDispatcher.kt +++ b/app/src/main/java/moe/ouom/wekit/hooks/sdk/protocol/listener/WePkgDispatcher.kt @@ -32,7 +32,8 @@ class WePkgDispatcher : ApiHookItem(), IDexFind { val v0Var = param.args[1] ?: return@hookBefore val originalCallback = param.args[2] ?: return@hookBefore - val uri = XposedHelpers.callMethod(v0Var, "getUri") as String + // 有时 getUri 返回 null + val uri = (XposedHelpers.callMethod(v0Var, "getUri") ?: "null") as String val cgiId = XposedHelpers.callMethod(v0Var, "getType") as Int try { val reqWrapper = XposedHelpers.callMethod(v0Var, "getReqObj") diff --git a/app/src/main/java/moe/ouom/wekit/loader/core/NativeCoreBridge.java b/app/src/main/java/moe/ouom/wekit/loader/core/NativeCoreBridge.java index 4b04803..6bae59c 100644 --- a/app/src/main/java/moe/ouom/wekit/loader/core/NativeCoreBridge.java +++ b/app/src/main/java/moe/ouom/wekit/loader/core/NativeCoreBridge.java @@ -1,22 +1,17 @@ package moe.ouom.wekit.loader.core; -import static moe.ouom.wekit.util.io.FileUtils.copyFile; - import android.annotation.SuppressLint; import android.content.Context; import androidx.annotation.NonNull; import com.tencent.mmkv.MMKV; import java.io.File; -import java.io.IOException; import moe.ouom.wekit.host.HostInfo; -import moe.ouom.wekit.util.io.FileUtils; import moe.ouom.wekit.util.log.WeLogger; public class NativeCoreBridge { static { - // it will be an UnsatisfiedLinkError if first load.. System.loadLibrary("dexkit"); System.loadLibrary("wekit"); } @@ -31,69 +26,66 @@ private NativeCoreBridge() { public static void initNativeCore() { Context context = HostInfo.getApplication(); - // init mmkv initializeMmkvForPrimaryNativeLibrary(context); } /** - * Load native library and initialize MMKV + * 检查本地核心库是否已初始化 + * @return true 如果已成功初始化,false 如果未初始化 + */ + public static boolean isNativeCoreInitialized() { + return sPrimaryNativeLibraryInitialized; + } + + /** + * 设置本地核心库初始化状态 + * @param initialized true表示已初始化,false表示未初始化 + */ + public static void setNativeCoreInitialized(boolean initialized) { + sPrimaryNativeLibraryInitialized = initialized; + if (initialized) { + WeLogger.i("Native core initialization status set to: initialized"); + } else { + WeLogger.w("Native core initialization status set to: not initialized"); + } + } + + /** + * 加载本地库并初始化MMKV * - * @param ctx Application context - * @throws LinkageError if failed to load native library + * @param ctx 应用上下文 */ @SuppressLint("SdCardPath") public static void initializeMmkvForPrimaryNativeLibrary(@NonNull Context ctx) { - if (sPrimaryNativeLibraryInitialized) { + if (isNativeCoreInitialized()) { return; } - File filesDir = null; - - File[] externalDirs = ctx.getExternalMediaDirs(); + // 获取微信的files目录 + File appFilesDir = ctx.getFilesDir(); + String packageName = ctx.getPackageName(); - if (externalDirs != null && externalDirs.length > 0) { - filesDir = externalDirs[0]; - } - - if (filesDir == null) { - filesDir = ctx.getFilesDir(); - } + WeLogger.i("Initializing NativeCoreBridge for package: " + packageName); - File mmkvDir = new File(filesDir, "wekit_mmkv"); + File mmkvDir = new File(appFilesDir, "mmkv"); + // 不存在就创建mmkv目录 if (!mmkvDir.exists()) { - mmkvDir.mkdirs(); + boolean created = mmkvDir.mkdirs(); + WeLogger.i("Created mmkv directory: " + created); } - // MMKV requires a ".tmp" cache directory, we have to create it manually - File cacheDir = new File(mmkvDir, ".tmp"); - if (!cacheDir.exists()) { - cacheDir.mkdir(); - } + // 初始化 MMKV + String mmkvRootPath = mmkvDir.getAbsolutePath(); + String initializedPath = MMKV.initialize(ctx, mmkvRootPath); - File oldDir = new File(ctx.getFilesDir(), "wekit_mmkv"); - if (oldDir.exists() && oldDir.isDirectory()) { - File[] files = oldDir.listFiles(); - if (files != null) { - for (File src : files) { - if (!src.isFile()) continue; - File dest = new File(mmkvDir, src.getName()); - if (!dest.exists()) { - try { - copyFile(src, dest); - WeLogger.i("Copy config file: " + src.getName()); - } catch (IOException e) { - WeLogger.e(e); - } - } - } - } - FileUtils.deleteFile(oldDir); - } - MMKV.initialize(ctx, "/data/data/com.tencent.mm/files/mmkv"); + WeLogger.i("MMKV initialized at: " + initializedPath); + + // 创建必要的 MMKV 实例 MMKV.mmkvWithID("global_config", MMKV.MULTI_PROCESS_MODE); MMKV.mmkvWithID("global_cache", MMKV.MULTI_PROCESS_MODE); - sPrimaryNativeLibraryInitialized = true; - } + setNativeCoreInitialized(true); + WeLogger.i("NativeCoreBridge initialization complete"); + } } diff --git a/app/src/main/java/moe/ouom/wekit/util/log/LogUtils.java b/app/src/main/java/moe/ouom/wekit/util/log/LogUtils.java index c4a3eda..a10c90d 100644 --- a/app/src/main/java/moe/ouom/wekit/util/log/LogUtils.java +++ b/app/src/main/java/moe/ouom/wekit/util/log/LogUtils.java @@ -10,6 +10,7 @@ import de.robv.android.xposed.XposedBridge; import moe.ouom.wekit.config.WeConfig; +import moe.ouom.wekit.loader.core.NativeCoreBridge; import moe.ouom.wekit.util.io.FileUtils; import moe.ouom.wekit.util.io.PathTool; @@ -99,7 +100,7 @@ public static void addError(String TAG, String Description, Throwable e) { private static void addLog(String fileName, String Description, Object content, boolean isError) { try { - if (!WeConfig.getDefaultConfig().getBooleanOrFalse(PrekEnableLog)){ + if (NativeCoreBridge.isNativeCoreInitialized() && !WeConfig.getDefaultConfig().getBooleanOrFalse(PrekEnableLog)){ return; } } catch (Exception e) {