From 129b7cf6b494c59040680beb6d22c8df5d5b0146 Mon Sep 17 00:00:00 2001 From: SherlockChiang Date: Fri, 12 Dec 2025 18:42:17 +0800 Subject: [PATCH] Trying to fix Gson circular reference issue --- .../com/xiaomi/xmsf/utils/ConvertUtils.java | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/push/src/main/java/com/xiaomi/xmsf/utils/ConvertUtils.java b/push/src/main/java/com/xiaomi/xmsf/utils/ConvertUtils.java index 6672d9d9..32946cdd 100644 --- a/push/src/main/java/com/xiaomi/xmsf/utils/ConvertUtils.java +++ b/push/src/main/java/com/xiaomi/xmsf/utils/ConvertUtils.java @@ -57,6 +57,23 @@ public boolean shouldSkipField(FieldAttributes f) { @Override public boolean shouldSkipClass(Class clazz) { + // 1. 排除所有 Android Context 和 View 相关的类 + if (clazz.getName().startsWith("android.content.Context") || + clazz.getName().startsWith("android.view.") || + clazz.getName().startsWith("android.app.")) { + return true; + } + // 2. 排除所有与 Binder/IPC 相关的类,它们通常导致循环 + if (clazz.getName().startsWith("android.os.IBinder") || + clazz.getName().startsWith("android.os.Parcelable$Creator")) { + return true; + } + // 3. 排除所有线程相关的类,如 Looper/Handler + if (clazz.getName().startsWith("android.os.Handler") || + clazz.getName().startsWith("android.os.Looper")) { + return true; + } + return false; } }) @@ -82,9 +99,30 @@ public static JsonElement toJson(Intent intent) { if (intent == null) { return JsonNull.INSTANCE; } + // 在 toJson(Intent intent) 方法中,修改 GsonBuilder: Gson gson = new GsonBuilder() - .registerTypeAdapterFactory(new BundleTypeAdapterFactory()) - .create(); + .registerTypeAdapterFactory(new BundleTypeAdapterFactory()) + // 添加新的 ExclusionStrategy + .setExclusionStrategies(new ExclusionStrategy() { + @Override + public boolean shouldSkipField(FieldAttributes f) { + // 排除 Intent 内部可能引起问题的字段,例如 mPackage + if (f.getName().equals("mContext") || f.getName().equals("mIBinder")) { + return true; + } + return false; + } + + @Override + public boolean shouldSkipClass(Class clazz) { + // 排除 Intent 对象本身 (如果被外部调用序列化 Intent 时) + if (clazz.equals(Intent.class)) { + return true; + } + return false; + } + }) + .create(); JsonObject json = new JsonObject(); json.add("action", gson.toJsonTree(intent.getAction())); if (intent.getExtras() != null) {