性能测试工具 内存泄露配置 (优化版)

Heyniu · 2016年09月13日 · 最后由 Heyniu 回复于 2017年07月26日 · 3650 次阅读

传送门

专项:Android 内存泄露实践分析

为什么要优化

  • 痛点:

    • leakcanary 结合 monkey 时,会点到删除按钮,导致检测到的内存泄露被删除,前功尽弃。
  • 解决方案:

    • 考虑屏蔽删除按钮操作

获取 leakcanary

  • github 搜索 leakcanary
  • 项目 clone 到本地
  • 打开项目

修改 leakcanary

  • 打开 DisplayLeakActivity 文件,找到删除按钮对应的代码,搜索setOnClickListener()定位
  • 注释删除按钮方法,并添加提示(操作被拒绝)
  • 共发现 3 处调用删除方法(重复的代码未贴出)
actionButton.setOnClickListener(new View.OnClickListener() {
          @Override public void onClick(View v) {
//            deleteVisibleLeak();
            Toast.makeText(DisplayLeakActivity.this, "Operating rejected!", Toast.LENGTH_SHORT).show();
          }
        });

actionButton.setOnClickListener(new View.OnClickListener() {
          @Override public void onClick(View v) {
//            deleteAllLeaks();
            Toast.makeText(DisplayLeakActivity.this, "Operating rejected!", Toast.LENGTH_SHORT).show();
          }
        });

编译 leakcanary

  • 编译 leakcanary-android 项目
  • 编译 leakcanary-analyzer 项目
  • 编译 leakcanary-watcher 项目
  • 得到 3 个 aar 文件
  • copy 到项目 libs 文件夹目录下

配置 leakcanary

  • build.gradle 添加依赖
compile(name: 'leakcanary-android-debug', ext: 'aar')
    compile(name: 'leakcanary-analyzer-debug', ext: 'aar')
    compile(name: 'leakcanary-watcher-debug', ext: 'aar')
    compile 'com.squareup.haha:haha:2.0.3'

运行 leakcanary

  • monkey 再也删不掉检测到的内存泄露了
  • 如果想删除可以到 SD 卡内删除

伸手党

百度云盘

20160930 最新解决方案,强烈推荐

只需改动一处,上面的修改太麻烦

refWatcher = LeakCanary.install(this);
LeakCanaryInternals.setEnabled(this, DisplayLeakActivity.class, false);

泄露信息需要手动配置上传服务器,或者从 sd 卡拉回来

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 12 条回复 时间 点赞
Heyniu #12 · 2016年09月13日 Author

@testsina 你需要的

也可以在删除方法里面加些删除之前保存文件的方法

@heyniu 有 qq 么……

#4 楼 @kasi 335827476

请问一下,你的网盘分享里面是关于 leakcanary 所涉及到的打成的 jar 包么?,之前也研究过一阵子,但是苦于网上用的这个东西都是基于 androidstudio + gradle 做的,关于 eclipse 的很少,而且也是基于 maven 管理的,好像没有完整的 leakcanary.jar

@heyniu 好的,谢谢

真心不错。

😂 或许可以将每次的获取的信息上传到自定义平台中或上传到指定的文件夹中。附上资料:http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/

LeakCanaryInternals.setEnabled(this, DisplayLeakActivity.class, false);
请问日志是在哪个目录下

Heyniu #12 · 2017年07月26日 Author
summe 回复

leaks 应用里面有泄漏堆栈

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册