From 75597cdb70721a677d2bdc9be580553160e704ed Mon Sep 17 00:00:00 2001 From: James Chen Date: Wed, 4 Sep 2024 15:09:43 +0800 Subject: [PATCH] Fix memory leak for android platform. --- .../java/src/com/cocos/lib/CocosActivity.java | 15 ++++++++++++ .../java/src/com/cocos/lib/CocosHelper.java | 24 +++++++++++++++++-- .../src/com/cocos/lib/CocosLocalStorage.java | 2 ++ .../src/com/cocos/lib/CocosSensorHandler.java | 5 ++++ .../src/com/cocos/lib/CocosVideoHelper.java | 12 ++++++++-- .../src/com/cocos/lib/CocosWebViewHelper.java | 9 +++++++ 6 files changed, 63 insertions(+), 4 deletions(-) diff --git a/native/cocos/platform/android/java/src/com/cocos/lib/CocosActivity.java b/native/cocos/platform/android/java/src/com/cocos/lib/CocosActivity.java index bd27d9f10a3..55e93a24ba9 100644 --- a/native/cocos/platform/android/java/src/com/cocos/lib/CocosActivity.java +++ b/native/cocos/platform/android/java/src/com/cocos/lib/CocosActivity.java @@ -137,7 +137,22 @@ protected void onDestroy() { CocosHelper.unregisterBatteryLevelReceiver(this); CocosAudioFocusManager.unregisterAudioFocusListener(this); CanvasRenderingContext2DImpl.destroy(); + CocosHelper.destroy(); GlobalObject.destroy(); + CocosWebViewHelper.resetStaticVariables(); + CocosSensorHandler.resetStaticVariables(); + + mVideoHelper.destroy(); + mSurfaceView.setOnTouchListener(null); + mSurfaceView.getHolder().removeCallback(this); + + mRootLayout.removeAllViews(); + mRootLayout = null; + + mSensorHandler = null; + mWebViewHelper = null; + mVideoHelper = null; + mSurfaceView = null; } @Override diff --git a/native/cocos/platform/android/java/src/com/cocos/lib/CocosHelper.java b/native/cocos/platform/android/java/src/com/cocos/lib/CocosHelper.java index 382b24dfc04..bcfe7dc0315 100644 --- a/native/cocos/platform/android/java/src/com/cocos/lib/CocosHelper.java +++ b/native/cocos/platform/android/java/src/com/cocos/lib/CocosHelper.java @@ -78,7 +78,7 @@ public class CocosHelper { // =========================================================== private static Vibrator sVibrateService; - private static BatteryReceiver sBatteryReceiver = new BatteryReceiver(); + private static BatteryReceiver sBatteryReceiver = null; public static final int NETWORK_TYPE_NONE = 0; public static final int NETWORK_TYPE_LAN = 1; @@ -98,6 +98,13 @@ public void addTask(Runnable runnable) { sTaskQ.add(runnable); } } + + public void clearTasks() { + synchronized (readMtx) { + sTaskQ.clear(); + } + } + public void runTasks(){ Queue tmp; synchronized (readMtx) { @@ -135,12 +142,18 @@ public void setBatteryLevelByIntent(Intent intent) { } static void registerBatteryLevelReceiver(Context context) { + if (sBatteryReceiver == null) { + sBatteryReceiver = new BatteryReceiver(); + } Intent intent = context.registerReceiver(sBatteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); sBatteryReceiver.setBatteryLevelByIntent(intent); } static void unregisterBatteryLevelReceiver(Context context) { - context.unregisterReceiver(sBatteryReceiver); + if (sBatteryReceiver != null) { + context.unregisterReceiver(sBatteryReceiver); + sBatteryReceiver = null; + } } //Run on game thread forever, no matter foreground or background @@ -197,6 +210,13 @@ public static void init() { } } + public static void destroy() { + sVibrateService = null; + sInited = false; + sTaskQOnGameThread.clearTasks(); + sForegroundTaskQOnGameThread.clearTasks(); + } + public static float getBatteryLevel() { return sBatteryReceiver.sBatteryLevel; } diff --git a/native/cocos/platform/android/java/src/com/cocos/lib/CocosLocalStorage.java b/native/cocos/platform/android/java/src/com/cocos/lib/CocosLocalStorage.java index 79fdb0d1a1d..2bb57fe30a9 100644 --- a/native/cocos/platform/android/java/src/com/cocos/lib/CocosLocalStorage.java +++ b/native/cocos/platform/android/java/src/com/cocos/lib/CocosLocalStorage.java @@ -53,8 +53,10 @@ public static boolean init(String dbName, String tableName) { } public static void destroy() { + mDatabaseOpenHelper = null; if (mDatabase != null) { mDatabase.close(); + mDatabase = null; } } diff --git a/native/cocos/platform/android/java/src/com/cocos/lib/CocosSensorHandler.java b/native/cocos/platform/android/java/src/com/cocos/lib/CocosSensorHandler.java index a32746e982b..114a7608221 100644 --- a/native/cocos/platform/android/java/src/com/cocos/lib/CocosSensorHandler.java +++ b/native/cocos/platform/android/java/src/com/cocos/lib/CocosSensorHandler.java @@ -58,6 +58,11 @@ public CocosSensorHandler(final Context context) { mSensorHandler = this; } + public static void resetStaticVariables() { + mSensorHandler = null; + mEnableSensor = false; + } + // =========================================================== // Getter & Setter // =========================================================== diff --git a/native/cocos/platform/android/java/src/com/cocos/lib/CocosVideoHelper.java b/native/cocos/platform/android/java/src/com/cocos/lib/CocosVideoHelper.java index 676c3191e7a..0495b0c4a3f 100644 --- a/native/cocos/platform/android/java/src/com/cocos/lib/CocosVideoHelper.java +++ b/native/cocos/platform/android/java/src/com/cocos/lib/CocosVideoHelper.java @@ -48,7 +48,6 @@ public class CocosVideoHelper { private Activity mActivity = null; private static SparseArray sVideoViews = null; static VideoHandler mVideoHandler = null; - private static Handler sHandler = null; CocosVideoHelper(Activity activity, FrameLayout layout) { @@ -57,7 +56,16 @@ public class CocosVideoHelper { mVideoHandler = new VideoHandler(this); sVideoViews = new SparseArray(); - sHandler = new Handler(Looper.myLooper()); + } + + public void destroy() { + if (mVideoHandler != null) { + mVideoHandler.removeCallbacksAndMessages(null); + mVideoHandler = null; + } + videoEventListener = null; + mLayout = null; + mActivity = null; } private static int videoTag = 0; diff --git a/native/cocos/platform/android/java/src/com/cocos/lib/CocosWebViewHelper.java b/native/cocos/platform/android/java/src/com/cocos/lib/CocosWebViewHelper.java index 43debe9ef8e..adf17aa99c0 100755 --- a/native/cocos/platform/android/java/src/com/cocos/lib/CocosWebViewHelper.java +++ b/native/cocos/platform/android/java/src/com/cocos/lib/CocosWebViewHelper.java @@ -56,6 +56,15 @@ public CocosWebViewHelper(FrameLayout layout) { CocosWebViewHelper.webViews = new SparseArray(); } + public static void resetStaticVariables() { + sLayout = null; + if (sHandler != null) { + sHandler.removeCallbacksAndMessages(null); + sHandler = null; + } + webViews = null; + } + private static native boolean shouldStartLoading(int index, String message); private static native void didFinishLoading(int index, String message); private static native void didFailLoading(int index, String message);