dalvik.system.CloseGuard 介绍

3 篇文章 0 订阅
2 篇文章 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
 @Override
    public 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)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值