Android内存优化(六)LeakCanary使用详解
本文首发于微信公众号「后厂技术官」
相关文章Android性能优化系列Java虚拟机系列
1.概述如果使用MAT来分析内存问题,会有一些难度,并且效率也不是很高,对于一个内存泄漏问题,可能要进行多次排查和对比。为了能够简单迅速的发现内存泄漏,Square公司基于MAT开源了LeakCanary。
2.使用LeakCanary首先配置build.gradle:
dependencies { debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.2' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.2'}
接下来在Application加入如下代码。
public class LeakApplication extends Application { @Override public void onCreate() { super. ...
Android解析ActivityManagerService(二)ActivityTask和Activity栈管理
本文首发于微信公众号「后厂技术官」
关联系列Android系统启动流程系列Android应用进程系列Android深入四大组件系列Android深入解析AMS系列
前言关于AMS,原计划是只写一篇文章来介绍,但是AMS功能繁多,一篇文章的篇幅远远不够。这一篇我们接着来学习与AMS相关的ActivityTask和Activity栈管理。
1.ActivityStackActivityStack是一个管理类,用来管理系统所有Activity的各种状态,其内部维护了TaskRecord的列表,因此从Activity任务栈这一角度来说,ActivityStack也可以理解为Activity堆栈。它由ActivityStackSupervisor来进行管理的,而ActivityStackSupervisor在AMS中的构造方法中被创建。frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
public ActivityManagerService(Context system ...
React Native组件(四)TextInput组件解析
相关文章React Native探索系列React Native组件系列
1 概述TextInput组件和Text组件类似,内部都没有使用FlexBox布局,不同的是TextInput组件支持文字的输入,因为支持文字输入, TextInput组件要比Text组件多了一些属性和方法。TextInput组件支持Text组件所有的Style属性,而TextInput组件本身是没有特有的Style属性的。
2 属性TextInput组件支持所有的View组件的属性,除此之外,它还有许多其他属性。
2.1 onChangeText当输入框的内容发生变化时,就会调用onChangeText。index.android.js
import React, {Component} from 'react';import {AppRegistry, StyleSheet, View, TextInput, Button,Alert} from 'react-native';class TextApp extends Com ...
Android内存优化(五)详解内存分析工具MAT
本文首发于微信公众号「后厂技术官」
相关文章Android性能优化系列Java虚拟机系列
前言在这个系列的前四篇文章中,我分别介绍了DVM、ART、内存泄漏和内存检测工具的相关知识点,这一篇我们通过一个小例子,来学习如何使用内存分析工具MAT。
1.概述在进行内存分析时,我们可以使用Memory Monitor和Heap Dump来观察内存的使用情况、使用Allocation Tracker来跟踪内存分配的情况,也可以通过这些工具来找到疑似发生内存泄漏的位置。但是如果想要深入的进行分析并确定内存泄漏,就要分析疑似发生内存泄漏时所生成堆存储文件。堆存储文件可以使用DDMS或者Memory Monitor来生成,输出的文件格式为hpof,而MAT就是来分析堆存储文件的。MAT,全称为Memory Analysis Tool,是对内存进行详细分析的工具,它是Eclipse的插件,如果用Android Studio进行开发则需要单独下载它,下载地址为:http://eclipse.org/mat/,这篇文章MAT的版本为1.6.1。
2.生成hpof文件2.1 准备内存泄漏代码我们需要 ...
《Android进阶之光》勘误
感谢提供勘误信息的读者,正是有了你们,《Android进阶之光》才会变得越来越好。注:小括号中的3印代表第3次印刷会修改的内容,依此类推。没有标注的就是首印和第2次印刷需要修改的内容。目前最新版次:2018年10月 第8印。
第一章
5页,第3、4行,RecyclerView布局添加了无效的属性,去掉第3、4行。
android:divider="#FFB900"android:dividerHeight="1dp"
8页,第15、16行,RecyclerView没有被应用到,去掉第15、16行。
android.support.v7.widget.RecyclerView v=new android.support.v7.widget.RecyclerView(parent.getContext());
8页(4印),倒数8行,mDivider.getIntrinsicHeight() 改为:mDivider.getIntrinsicWidth() 。
9页,第10行,“getItemOffsets方法则用于设置item分割线的 ...
Android解析ActivityManagerService(一)AMS启动流程和AMS家族
本文首发于微信公众号「后厂技术官」
关联系列Android系统启动流程系列Android应用进程系列Android深入四大组件系列
前言此前在Android系统启动流程、应用进程以及深入四大组件这三个系列文章中,都提及到了AMS,但都没有系统的来讲解它,本文就以AMS为主来进行讲解,其中会有一些知识点与这些系列文章有所重合,这里会尽量做到详尽讲解。阅读此文章前,最好阅读相关文章中列出的系列文章,否则我不敢保证这篇文章你能看的懂。
1.概述AMS是系统的引导服务,应用进程的启动、切换和调度、四大组件的启动和管理都需要AMS的支持。从这里可以看出AMS的功能会十分的繁多,当然它并不是一个类承担这个重责,它有一些关联类,这在文章后面会讲到。AMS的涉及的知识点非常多,这篇文章主要会讲解AMS的以下几个知识点:
AMS的启动流程。
AMS与进程启动。
AMS家族。
2.AMS的启动流程AMS的启动是在SyetemServer进程中启动的,在Android系统启动流程(三)解析SyetemServer进程启动过程这篇文章中提及过,这里从SyetemServer的main方法开始讲起:f ...
React Native组件(三)Text组件解析
相关文章React Native探索系列React Native组件系列
前言此前介绍了最基本的View组件,接下来就是最常用的Text组件,对于Text组件的一些常用属性,这篇文章会给出简单的例子以供学习。
1 概述Text组件对应于Android平台的TextView,用来显示文本。无论做什么应用几乎都要使用它,可以说是应用最频繁的组件之一。Text组件的内部使用的并不是flexbox布局,而是文本布局,因此想要使用flexbox设置文字居中是不可能的,解决方案就是在Text组件的外层套一层View,设置View的flexbox,具体的参考2.1节的例子代码。
2 Style属性Text组件支持View组件的所有的Style属性,不了解View组件的Style属性可以查看React Native组件(二)View组件解析这篇文章。
2.1 字体相关 Style属性
Style属性名
取值
说明
fontFamily
enum(‘sans-serif’, ‘serif’,’monospace’,’sans-serif-light’,’sans-serif-thin’,’ ...
Android内存优化(四)解析Memory Monitor、Allocation Tracker和Heap Dump
本文首发于微信公众号「后厂技术官」
相关文章Android性能优化系列Java虚拟机系列
前言要想做好内存优化工作,就要掌握两大部分的知识,一部分是知道并理解内存优化相关的原理,另一部分就是善于运用内存分析的工具。本篇就来介绍内存分析工具:Memory Monitor、Allocation Tracker和Heap Dump的使用方法。
1.Memory Monitor在Android Studio(以下简称AS)中Android Monitor是一个主窗口,它包含了Logcat,、Memory Monitor、CPU Monitor、 GPU Monitor和Network Monitor。其中Memory Monitor可以轻松地监视应用程序的性能和内存使用情况,以便于找到被分配的对象,定位内存泄漏,并跟踪连接设备中正在使用的内存数量。Memory Monitor可以报告出你的应用程序的内存分配情况, 更形象的呈现出应用程序使用的内存。它的作用如下:
实时显示可用的和分配的Java内存的图表。
实时显示垃圾收集(GC)事件。
启动垃圾收集事件。
快速测试应用程序的缓慢是否与 ...
Android深入理解JNI(二)类型转换、方法签名和JNIEnv
本文首发于微信公众号「后厂技术官」
相关文章Android深入理解JNI系列
前言上一篇文章介绍了JNI的基本原理和注册,这一篇接着带领大家来学习JNI的数据类型转换、方法签名和JNIEnv。
1.数据类型的转换首先给出上一篇文章中android_media_MediaRecorder.cpp中的android_media_MediaRecorder_start方法:frameworks/base/media/jni/android_media_MediaRecorder.cpp
static voidandroid_media_MediaRecorder_start(JNIEnv *env, jobject thiz){ ALOGV("start"); sp<MediaRecorder> mr = getMediaRecorder(env, thiz); process_media_recorder_call(env, mr->start(), "java/lang/RuntimeException&q ...
Android进阶三部曲 第一部《Android进阶之光》已出版
勘误帖请点击这里源码地址:https://github.com/henrymorgen/android-advanced-light
由来2016年我开始建立了自己的知识体系,所有的文章都是围绕着这个体系来写,随着这个体系的慢慢成长,开始有很多出版社联系我写书,因为比较看好电子工业出版社,就顺理成章的开始了《Android进阶之光》这本书的编写。写作过程中并没有遇到什么困难,就是书名一直确定不下来,后来受到了《运营之光》的启发,这本书的名字才最终确定下来,寓意就是为Android开发者的进阶之路带来指引和光明。
为什么写这本书官方话这里我就不说了,其实就两点:1.目前市场上的Android进阶书比较少,这本书的出现会帮助很多人。2.对自己是一个挑战,也会带来不少提高,最主要的是养成了持续学习的习惯。
本书的内容本书共分为11章,内容页数却有478页,而且和《Android群英传》一样是大开本,可见本书对知识点并不是泛泛而谈,而是深入的讲解。第1章介绍Android5.0、6.0、7.0的新特性。包括5.0的RecyclerView、6.0的运行时权限机制和7.0的多窗口模式等知识点。 ...
React Native组件(二)View组件解析
相关文章React Native探索系列React Native组件系列
前言了解了RN的组件的生命周期后,我们接着来学习RN的具体的组件。View组件是最基本的组件,也是首先要掌握的组件,这一篇我们来学习View组件。
1.概述View组件是RN中最基本的组件,绝大部分的组件都继承了View组件的属性,所以学习其他组件前,要首先掌握View组件。View组件是一个支持Flexbox布局、样式、一些触摸处理的容器,它可以放到其它的组件里,也可以有任意多个任意类型的子组件。View组件对应着多个平台的视图,比如Android的View以及iOS的UIView。由于View组件的属性非常多,这里主要介绍一些常用的属性。
2.style属性style属性作为组件属性中的一种,它包含了多种属性,这里对它们意义进行讲解。
2.1 FlexboxView组件的Flexbox属性这里就不再介绍了,详细请看React Native探索(四)Flexbox布局详解这一篇文章。正是因为View组件提供了Flexbox属性,因此,继承了View组件的其他组件也都具有Flexbox属性。
2.2 shado ...
设计模式(十六)原型模式
本文首发于微信公众号「后厂技术官」
相关文章设计模式系列
前言公众号有同学留言设计模式,才发现好久没有写设计模式了。关于创建型设计模式只差原型模式没写了,这一篇就来填补这个空缺。
1.原型模式定义原型模式定义定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
原型模式UML图
在原型模式中有如下角色:
Client:客户端角色。
Prototype:抽象原型角色,抽象类或者接口,用来声明clone方法。
ConcretePrototype:具体的原型类,是客户端角色使用的对象,即被复制的对象。
需要注意的是,Prototype通常是不用自己定义的,因为拷贝这个操作十分常用,Java中就提供了Cloneable接口来支持拷贝操作,它就是原型模式中的Prototype。当然,原型模式也未必非得去实现Cloneable接口,也有其他的实现方式。
2.原型模式简单实现原型模式的核心是clone方法,通过该方法进行拷贝,这里举一个名片拷贝的例子。现在已经流行电子名片了,只要扫一下就可以将名片拷贝到自己的名片库中, 我们先实现名片类。
具体的原型类public clas ...
Android内存优化(三)避免可控的内存泄漏
本文首发于微信公众号「后厂技术官」
相关文章Android性能优化系列Java虚拟机系列
前言内存泄漏向来都是内存优化的重点,它如同幽灵一般存于我们的应用当中,有时它不会现身,但一旦现身就会让你头疼不已。因此,如何避免、发现和解决内存泄漏就变得尤为重要。这一篇我们先来学习如何避免内存泄漏。
1.什么是内存泄漏我们知道,每个应用程序都需要内存来完成工作,为了确保Android系统的每个应用都有足够的内存,Android系统需要有效地管理内存分配。当内存不足时,Android运行时就会触发GC,GC采用的垃圾标记算法为根搜索算法, 在Java虚拟机(三)垃圾标记算法与Java对象的生命周期这篇文章中讲到了根搜索算法,如下图所示。从上图看以看出,Obj4是可达的对象,表示它正被引用,因此不会标记为可回收的对象。Obj5、Obj6和Obj7都是不可达的对象,其中Obj5和Obj6虽然互相引用,但是因为他们到GC Roots是不可达的所以它们仍旧会标记为可回收的对象。
内存泄漏就是指没有用的对象到GC Roots是可达的(对象被引用),导致GC无法回收该对象。此时,如果Obj4是一个没有用 ...
Android深入理解JNI(一)JNI原理与静态、动态注册
本文首发于微信公众号「后厂技术官」
前言JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层。这一个系列我们来一起深入学习JNI。
1.JNI概述Android系统按语言来划分的话由两个世界组成,分别是Java世界和Native世界。那为什么要这么划分呢?Android系统由Java写不好吗?除了性能的之外,最主要的原因就是在Java诞生之前,就有很多程序和库都是由Native语言写的,因此,重复利用这些Native语言编写的库是十分必要的,况且Native语言编写的库具有更好的性能。这样就产生了一个问题,Java世界的代码要怎么使用Native世界的代码呢,这就需要一个桥梁来将它们连接在一起,而JNI就是这个桥梁。通过JNI,Java世界的代码就可以访问Native世界的代码,同样的,Native世界的代码也可以访问Java世界的代码。为了讲解JNI我们需要分析系统的源码,在即将出版的《Android进阶之光》的最后一章中我拿MediaPlayer框架做了举例,这里换Media ...
React Native组件(一)组件的生命周期
相关文章React Native探索系列
前言React Native有很多组件比如Image、ListView等等,想要合理的使用组件,首先要先了解组件的生命周期。
1.概述无论你是开发Android还是iOS,对于组件的生命周期一定不陌生,这是开发的基础。同样的React Native的组件也有生命周期,当应用启动,React Native在内存中维护着一个虚拟DOM,组件的生命周期就是指组件初始化并挂载到虚拟DOM为起始,到组件从虚拟DOM卸载为终结。生命周期的方法就是组件在虚拟DOM中不同状态的描述。从上图所示,组件的生命周期分为三个阶段,分别是挂载(mounting)、更新(updating)和卸载(Unmounting),其中挂载和更新阶段都会调用rander方法进行绘制。下面对这三个阶段分别进行讲解。
2.挂载挂载指的是组件的实例被创建并插入到DOM中,挂载会调用如下方法。
constructorconstructor是RN组件的构造方法,它在RN组件被加载前先被调用。当我们的组件继承自React.Component时,需要在构造方法中最先调用super(props)。 ...
Android内存优化(二)DVM和ART的GC日志分析
本文首发于微信公众号「后厂技术官」
相关文章Android性能优化系列Java虚拟机系列
前言在Java虚拟机(三)垃圾标记算法与Java对象的生命周期这篇文章中,提到了Java虚拟机的GC日志。DVM和ART的GC日志与Java虚拟机的日志有较大的区别,这篇文章就对DVM和ART的GC日志进行分析。
1.DVM的GC日志在 DVM 中,每次垃圾收集都会将GC日志打印到 logcat 中,具体的格式为:
D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time>
可以看到DVM的日志共有5个信息,其中GC Reason有很多种,这里将它单独拿出来进行介绍。
引起GC原因GC Reason就是指引起GC原因,有以下几种:
GC_CONCURRENT:当堆开始填充时,并发GC可以释放内存。
GC_FOR_MALLOC:当堆内存已满时,app尝试分配内存而引起的GC,系统必须停止app并回收内 ...