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) {