2017-08-31 89 views
1

未執行任何與SPen相關的SDK庫,內存泄漏發生在AppCompatActivity擴展類上。 以下事件序列通常會觸發內存泄漏:Samsung Note 3:按下SPen側按鈕後活動內存泄漏

  1. 用戶按側按鈕,激活Air Command工具。
  2. 沒有點擊任何Air Command工具的圖標,側面按鈕再次被點擊。
  3. 屏幕旋轉,在這種情況下會導致活動被銷燬並重新啓動。
  4. 通過Android Studio執行Java堆轉儲會顯示被銷燬的活動導致的內存泄漏。
  5. 分析器指示活動mContext變量被包類引用:com.samsung.android.smartclip.SpenGestureManager。這很可能導致活動內存泄漏。

會不會有什麼辦法可以清除參考由SpenGestureManager類舉行的mContext變量的存在?這應該有望讓垃圾收集器清除已銷燬的活動。

以下設備/ Android版本中檢測到這個問題(三星Galaxy Note 3個二重奏):

  • 型號:SM-N9002
  • 的Android版本:4.4.2(奇巧)
  • 基帶版本:N9002ZNUFNK1
  • ROM版本:SVA ROM SM-N9002 9.0

同樣的申請於三星Galax的測試y注意10.1設備,它似乎沒有此內存泄漏問題。

回答

1

正如你可以從LeakCanary's sources看到的那樣,這是一個衆所周知的內存泄漏。

SpenGestureManager有一個靜態的mContext字段,該字段泄露對活動的引用。是的,一個STATIC mContext字段。

我認爲可以使用反射來解決。這是一段應該工作的代碼:

 

    // Perform an if-check to see whether this is a Samsung device 
    Class clazz = Class.forName("com.samsung.android.smartclip.SpenGestureManager"); 
    Field mContext = clazz.getDeclaredField("mContext"); 
    mContext.setAccessible(true); 
    mContext.set(null, null); 
 
+1

雖然:'getDeclaredField(「modifiers」)'似乎會拋出'NoSuchFieldException',你的方法似乎工作得很好。不過,我從手機的framework2.jar包中反編譯了SpenGestureManager.java,並且mContext出現,好像它沒有被聲明爲final。所以我用'mContext.setAccessible(true)'將setFinalStatic()調用替換爲直接調用'mContext.set(null,null)'。內存泄漏現在似乎已經消失。 – Tjaart

+0

@Tjaart,很好,更新了答案。 – azizbekian