当前位置: 代码迷 >> 综合 >> dalvik.system.CloseGuard 介绍
  详细解决方案

dalvik.system.CloseGuard 介绍

热度:53   发布时间:2023-12-08 11:51:10.0

CloseGuard is a mechanism for flagging implicit finalizer cleanup of resources that should have been cleaned up by explicit close methods (aka “explicit termination methods” in Effective Java)

CloseGurad提供了一种机制或者说是一个工具类,用来记录资源泄露的场景,比如使用完的资源(比如cursor/fd)没有正常关闭。

可以参考CloseGuard代码注释中提供的demo为需要管理的对象接入监控。接入之后,如果发生资源使用后没有正常关闭,会在finalize方法中触发CloseGuard的warnIfOpen方法,代码如下:

 /*** If CloseGuard is enabled, logs a warning if the caller did not* properly cleanup by calling an explicit close method* before finalization. If CloseGuard is disabled, no action is* performed.*/
public void warnIfOpen() {if (allocationSite == null || !ENABLED) {return;}String message =("A resource was acquired at attached stack trace but never released. "+ "See java.io.Closeable for information on avoiding resource leaks.");REPORTER.report(message, allocationSite);
}

APP端可以利用Hook REPORTER 在来实现客制化的上报提示信息。

/*** Hook for customizing how CloseGuard issues are reported.*/
private static volatile Reporter REPORTER = new DefaultReporter();

可以参考微信开源的matrix io canary模块,代码如下:

//CloseGuardHooker.java
//通过反射hook了dalvik.system.CloseGuard的成员变量REPORTER,利用动态代理为其设置一个代理对象,
//从而实现客制话
fieldREPORTER.set(null, Proxy.newProxyInstance(classLoader,new Class<?>[]{closeGuardReporterCls},new IOCloseLeakDetector(issueListener, sOriginalReporter)));//IOCloseLeakDetector.java@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {MatrixLog.i(TAG, "invoke method: %s", method.getName());if (method.getName().equals("report")) {//插入客制化代码.....

在安卓系统内部已经大量接入了CloseGuard,譬如:

  1. ActivityView.java (core\java\android\app)
  2. Animation.java (core\java\android\view\animation)
  3. ContentProviderClient.java (core\java\android\content)
  4. ContentResolver.java (core\java\android\content)
  5. CursorWindow.java (core\java\android\database)
  6. DisplayEventReceiver.java (core\java\android\view)
  7. InputEventReceiver.java (core\java\android\view)
  8. InputQueue.java (core\java\android\view)
  9. NativeLibraryHelper.java (core\java\com\android\internal\content)
  10. NetworkStats.java (core\java\android\app\usage)
  11. PackageManagerService.java (e:\code\android-source\services\core\java\com\android\server\pm)
  12. ParcelFileDescriptor.java (core\java\android\os)
  13. PdfDocument.java (e:\code\android-source\graphics\java\android\graphics\pdf)
  14. PdfEditor.java (e:\code\android-source\graphics\java\android\graphics\pdf)
  15. PdfRenderer.java (e:\code\android-source\graphics\java\android\graphics\pdf)
  16. SQLiteConnectionPool.java (core\java\android\database\sqlite)
  17. SQLiteConnection.java (core\java\android\database\sqlite)
  18. SQLiteDatabase.java (core\java\android\database\sqlite)
  19. Surface.java (core\java\android\view)
  20. SurfaceControl.java (core\java\android\view)
  21. SystemSensorManager.java (core\java\android\hardware)
  22. UinputBridge.java (e:\code\android-source\services\core\java\com\android\server\tv)
  相关解决方案