leakcanary内存泄漏:此篇有加了内存泄漏的apk demo
概括:
·用Android studio写一个demo
·配置leakcanary
·加入内存泄漏代码片段
·安装apk 验证结果
·源码地址
一、android studio创建项目demo
1.不多写这一步了,正常按指示填写即可,不需要什么配置类的东西

2.创建打开后,先布局一个登录页面
打开路径:app-main-res-layout 或者到java下的mainActivity文件activity_main ,ctr+右击进去也可以定位到这个页面
Desgi:直观可以看到ui
text:用xml的方式布局页面

3.xml的方式布局一个登录页面(复制粘贴进去即可)
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tableLayout1"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:gravity="center"
> //第一行
<TableRow
android:id="@+id/tableRow1"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"> <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户名:"
android:textSize="30px"
/> <EditText
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="200px"
android:textSize="30px"
/>
</TableRow> //第二行
<TableRow
android:id="@+id/tableRow2"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"> <TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密 码:"
android:textSize="30px"
/> <EditText
android:id="@+id/pass"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="200px"
android:textSize="30px"
android:inputType="textPassword"
/>
</TableRow> //第三行
<TableRow
android:id="@+id/tableRow3"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"> <Button
android:id="@+id/Login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登 录"
android:textSize="30px"
android:onClick="Check"
/> </TableRow> </TableLayout>
4.页面现在有了,在MainActivity文件写一个事件和加入内存泄漏的片段
MainActivity路径:app-java-包下面的java文件如下
@内存泄漏加在了onCreate下面,理论上打开app会出现泄漏,如果出现不了就多操作打开app试下
@这里有个小问题,如果你没有操作上面的步骤直接用源码apk,泄漏后会报错是因为没有开启存储权限
package com.example.dutest.dutest; import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
EditText name; //用户名
EditText pass; //密码
//内存泄漏
private static TestResource mResource = null;// @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
//内存泄漏
if(mResource == null){
mResource = new TestResource();
mResource = new TestResource();
mResource = new TestResource();
mResource = new TestResource(); }// name = (EditText) findViewById(R.id.name); //获取用户名
pass = (EditText) findViewById(R.id.pass); //获取密码
} public void Check(View view) {
String mname = "du";
String mpass = "du";
String user = name.getText().toString().trim();
String pwd = pass.getText().toString().trim();
if (user.equals(mname) && pwd.equals(mpass)) {
Toast.makeText(this,
"密码正确", Toast.LENGTH_SHORT).show();
if(mResource == null){
mResource = new TestResource();
}
} else {
Toast.makeText(this,
"密码错误", Toast.LENGTH_SHORT).show(); }
}
//内存泄漏
class TestResource {
//
}// }
这样就写好一个apk的demo了,下面需要对demo配置leakcanary
二、配置leakcanary
1.android studio打开源码app的build.gradle中加入配置如下:
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'

2.自定义Application用来安装leakcanary
在app-src-java-com.xxx.项目下新建ExampleApplication类文件
package com.example.dutest.dutest; import android.app.Application;
import com.squareup.leakcanary.LeakCanary;
import android.support.v7.app.AppCompatActivity; //import com.squareup.leakcanary.RefWatcher; public class ExampleApplication extends Application { // private RefWatcher mRefWatcher; @Override
public void onCreate() {
super.onCreate();
LeakCanary.install(this);
} }
2.把自定义的ExampleApplication注册androidManifest.xml(l路径:../app-src-main同级的文件)
只要加这个android:name=".ExampleApplication"即可,如下图

3.使用android studio打开生成debug包到手机

4.验证内存泄漏
1.打包后桌面可见到:

2.打开apk(注意需要授予apk储存权限)打开apk的界面会出现内存泄漏,出现leakcanary会提示,如果没有提示尝试多次打开退出app操作

三、源码
git地址
2.用android stuido打开build debug包
3.打开包在指定路径下直接安装apk,如下图:

leakcanary内存泄漏:此篇有加了内存泄漏的apk demo的更多相关文章
- Android内存管理(5)*官方教程:Logcat内存日志各字段含义,查看当前内存快照,跟踪记录内存分配,用adb查看内存情况时各行列的含义,捕获内存快照的3种方法,如何让程序暴漏内存泄漏的方法
Investigating Your RAM Usage In this document Interpreting Log Messages 内存分析日志中各消息的含 ...
- [Android 性能优化系列]内存之基础篇--Android怎样管理内存
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...
- [Android 性能优化系列]内存之提升篇--应用应该怎样管理内存
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...
- JVM内存管理——总结篇
JVM内存管理--总结篇 自动内存管理--总结篇 内存划分及作用 常见问题 内存划分及作用 程序计数器 线程私有.字节码行号指示器. 执行Java方法,计数器记录的是字节码指令地址:执行本地(Nati ...
- 鸿蒙内核源码分析(内存主奴篇) | 皇上和奴才如何相处 | 百篇博客分析OpenHarmony源码 | v10.04
百篇博客系列篇.本篇为: v10.xx 鸿蒙内核源码分析(内存主奴篇) | 皇上和奴才如何相处 | 51.c.h .o 前因后果相关篇为: v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 ...
- 【多线程与高并发原理篇:3_java内存模型】
1. 概述 Java 内存模型即 Java Memory Model,简称 JMM.从抽象的角度来看,JMM 定义了线程和主内存之间的抽象关系,线程之间的共享变量存储在主内存中,每个线程都有一个私有的 ...
- Oracle内存组件理论篇一
目标 1.SGA结构 2.PGA结构 1.SGA Shared pool 1).共享池是对SQL.PL/SQL程序进行语法分析.编译.执行的内存区域. 在执行SELECT * FROM emp语句时, ...
- Tomcat 内存与优化篇
Tomcat 内存与优化一.Tomcat 运行环境介绍 1.Tomcat 本身无法直接在计算机上运行,需要依赖硬件基础上的操作系统和Java虚拟机: 2.Java 程序启动时JVM都会分配一个初始内存 ...
- [并发编程] -- 内存模型(针对JSR-133内存模型)篇
并发编程模型 1.两个关键问题 1)线程之间如何通信 共享内存程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信 消息传递程之间没有公共状态,线程之间必须通过发送消息来显式进行通信 2) ...
随机推荐
- c++ 的学习 第3集-默认参数
1.默认参数的意思就是 予以形参默认值 2. C++允许函数设置默认参数,在调用时可以根据情况省略实参.规则如下: 默认参数只能按照右到左的顺序 如果函数同时有声明.实现,默认参数只能放在函数声 ...
- Loj#2769-「ROI 2017 Day 1」前往大都会【最短路树,斜率优化】
正题 题目链接:https://loj.ac/p/2769 题目大意 给出\(n\)个点\(m\)条地铁线路,每条线路是一条路径. 求\(1\)到\(n\)的最短路且在最短路径的情况下相邻换乘点的距离 ...
- Node.js躬行记(12)——BFF
BFF字面意思是服务于前端的后端,我的理解就是数据聚合层.我们组在维护一个后台管理系统,会频繁的与数据库交互. 过去为了增删改查会写大量的对应接口,并且还需要在Model.Service.Router ...
- PHP审计之POP链挖掘
PHP审计之POP链挖掘 前言 续上文中的php反序列化,继续来看,这个POP的挖掘思路.在其中一直构思基于AST去自动化挖掘POP链,迫于开发能力有限.没有进展,随后找到了一个别的师傅已经实现好的项 ...
- Java基础之(一):JDK的安装以及Notepad++的下载
从今天开始就开始我的Java的学习了,学习Java前需要做一些前期的准备工作.好了,现在我们先一起来安装JDK. JDK的安装 JDK下载链接:JDK 下载电脑对应的版本,同意协议 双击安装JDK 将 ...
- Linux基本命令 和 Regex 正则表达式
Linux基本命令 和 Regex 正则表达式 Regex 基本语法 常用匹配规则 [aeiouAEIOU] # 从中随机选择一个 [0-9]{4} # 从中选择4个 .* # 匹配任意字符 \w # ...
- AES解密尾部出现乱码问题
说明 在使用AES解密的时候我发现解密出来的字符串尾部一直都有乱码 解决方案 尾部字符串的ascii码就是删除位索引 具体代码: cryptor = AES.new('AES_KEY'.encode( ...
- django 1.11.16之环境搭建
django版本:django1.11.16 windows环境 python 3.6.3 !!!可先安装虚拟环境在进行环境搭建 1.安装django:pip install django= ...
- 【c++ Prime 学习笔记】第2章 变量和基本类型
2.1 基本内置类型 基本数据类型包含了算术类型(arithmetic type)和空类型(void) 算数类型,包含了字符.整型数.布尔值和浮点数 空类型,不对应具体的值 2.1.1 算术类型 算术 ...
- Android构建工具--AAPT2源码解析(一)
一.什么是AAPT2 在Android开发过程中,我们通过Gradle命令,启动一个构建任务,最终会生成构建产物"APK"文件.常规APK的构建流程如下: (引用自Google官方 ...