月度归档:2020年01月

Android MessageQueue中的同步屏障

Message中有一个方法叫Message.setAsynchronous,表示发送异步消息,然而他需要插入同步屏障才能生效,那什么是同步屏障呢?

一般来说,Message如果按顺序进行发送的,并不是设置delay的话,运行都是同步的,然而在某些特殊时期,为了提高某个消息的优先级,防止中途插入的Message导致任务调度延迟,会使用异步Message,当调用postSyncBarrier之后,之后的任意同步消息都不再执行,期间只能执行异步消息,直到移除了同步屏障。

插入屏障:MessageQueue.postSyncBarrier

往链表里插入了一个奇怪的msg,他的target为null

消息循环:MessageQueue.next

遍历消息,也就是忽略所有非异步消息,只取出异步消息 查看更多

android 内存泄漏分析

一、使用android studio profile分析

android studio 相比mat来说优势在于可以分析native内存的大小,例如Bitmap等,而mat不能分析native内存。

这里以android studio 3.42为例 ,方法如下

第一步、选择右上角profile app


第二步、选择 运行设备

第三步、点击中间的memory区域,让左上角出现dump 按钮

第四部、点击左上角区域的gc按钮,然后点击dump按钮

第五步、找出其中内存较大的实例或者对象较多的实例(这里选用bitamp)

简单说明一下这里的参数

Allocations: 表示这个类实例有多少个,实例越多占用的内存越大

Shallowsize:表示这个类仅仅自身占用的内存大小,不包含引用的对象和native的大小

NativeSize :表示这个对象native的内存大小

retainedsize:表示这个对象+引用对象+native对象的大小,分析内存泄漏时,可以从这里入手

另外:点击以上各个参数可以按照参数来进行排序

第六步,选择需要查看的对象

下面显示的是reference,上面显示的是对象的详细信息

depth表示引用链的深度,当对象比较多的时候,尤其是发现对象是被一个链表引用,可以通过,选择最浅的depth来找到节点 查看更多

Android获得当前时刻每个线程的调用栈

有时候app出现异常,但是没有发生anr,比如某个重要工作线程hang住了此时怎么快速定位呢

大家都知道anr的时候会生成trace文件,如何在不发生anr的时候也生成trace文件呢

答案很简单可以通过adb shell kill -3 +pid

执行后可以看到打印了

I/art: Wrote stack traces to ‘/data/anr/traces.txt’

值得注意的是 虽然执行的是kill 命令

但是kill -3并不会导致 进程挂掉,而是仅仅打印调用栈

在有事故现场的情况下 非常好用!!

更多内容请查看大佬博客

http://gityuan.com/2017/07/09/android_debug/