5 longlong2015

尚未进行身份认证

暂无相关简介

等级
TA的排名 9w+

Android踩坑经验-View.post获取宽高及子线程调用更新UI原理解析

解决两个问题:1:view post为什么能获取宽高?2:子线程执行时为什么可以更新主线程UI?Android开发中,在Acivity的onCreate方法中通过控件的getMeasureHeight/getHeight或者getMeasureWidth/getWidth方法获取到的宽高大小都是0,这个问题比较常见,因为在onCreate方法执行时,View还没有measure,比较常见的方...

2019-03-26 18:00:04

Android踩坑经验-View post方法不执行

View.post()方法在android7.0之前,在view没有attachToWindow的时候调用该方法可能失效,尤其异步线程,如在onCreate,onBindViewHolder时调用view.post方法,可能会不生效,在异步线程view.post方法不执行的情况居多。建议使用Handler post方法代替。看下Android 7.0之前的源码,以4.4版本代码为例:publi...

2019-03-26 17:58:22

Android踩坑经验-Finalize TimeoutException原因及解决方案

调用栈信息:背景知识:FinalizerDamemon和FinalizerWatchdogDaemonFinalizerDamemon析构守护线程,重写了finalize的对象,在创建时会新建一个FinalizerReference,这个对象是强引用类型,封装了override finalize()的对象,下面直接叫原对象。原对象没有被其他对象引用时(FinalizeReference除外...

2019-03-26 17:56:40

Android踩坑经验-优化APK大小时不可轻易删除/META-INF目录

在优化APK大小时,往往会删除无用资源,重复资源等,有些童鞋可能看到META-INF文件夹下都是声明信息,签名信息等,因此感觉除了签名信息外,其他信息可随意删除,但其实不然。META-INF文件夹主要存放的配置信息,签名信息,service注册信息,文件列表如下:重点有MANIFEST.MF,CERT.RSA,CERT.SF三个文件和services,proguard文件夹:MANIFES...

2019-03-26 17:53:47

Android踩坑经验-notifyDataSetChanged列表不刷新问题分析

本文主要阐述在使用RecyclerView中遇到notifyDataSetChanged列表不刷新问题,表现是:列表滑动时,notifyDataSetChanged可以正常刷新界面,但Fragment切换Tab后,再次滑动RecycleView,列表不刷新。通过打断点调试,发现数据请求没有问题,每次滑动到底部时自动请求数据,在数据集上添加网络数据,通过打断点信息可得到size由20变为40,数据...

2019-03-26 17:49:59

Android踩坑经验--App启动时间正确统计姿势

在这里讨论的是指冷启动,热启动不在讨论范围内。如何正确衡量App的启动时间,一般有以下几种方法:AMS日志分析法,录屏分帧法,代码埋点法,logicat分析法等,本文重点阐述最常用的AMS日志分析法,录屏分帧法,代码埋点法,重点阐述代码埋点法的正确姿势。1:AMS日志分析法adb shell am start -w package_name/activity_name输出结果如下:$ ad...

2019-03-26 17:45:46

Android踩坑经验--RecycleView Adapter缓存问题

项目中遇到一个问题,先看现象:发现在一个屏幕上,会出现显示格式不一致问题,比较诡异,同一个布局文件,为什么绘制出来显示效果不一样呢?RecycleView item的显示,主要是onCreateViewHolder和onBindViewHolder两个方法,看下方法调用情况:发现在滑动的时候,并没有执行onCreateViewHolder,而是执行的onBindViewHolder,只有...

2019-03-26 17:40:29

Android内存优化(四)系统级别的内存回收策略优化--process reclaim

曾经反编译过某厂商的framework代码,结合厂商机器的表现,发现了进程内存管理的部分逻辑,记录如下:之前一直怀疑某厂商的AMS.updateOomAdjLocked()方法中,添加了进程管理逻辑,结果是进程管理的代码还没核实,倒是找到了运行时proc reclaim逻辑,在反编译的AMS.updateOomAdjLocked​()方法中,发现以下逻辑: try {...

2018-10-08 23:25:29

Android内存优化(三)Java Heap内存分析之MAT使用及其二次开发

MAT作为Android Java内存分析的利器,功能十分强大,通常可用此工具发现内存泄漏问题,内存异常问题,网上的帖子非常之多。分析过程大概如下:1:安装MAT工具2:生成hprof文件adb shell am dumpheap /data/local/tmp/.hprof3:hprof-conv转换一下直接生成的hprof文件打开会有诸多问题,需要sdk工具转换一下4:MAT打开...

2018-10-08 22:38:46

Android内存优化(二)系统进程之logd的native memory优化

最近的测试发现,C1 logd进程内存占用比Mate9 logd进程内存占用大很多,详细数据如下: 内存最大值(KB) 内存最小值(KB) 内存平均值(KB) C1 39794 21985 39353 Mate9 2804 ...

2018-06-18 22:31:04

Android内存优化(二)之Bitmap的内存申请与回收(Android N和O的对比)

在Android O上大面积的爆了以下这段trace,开始怀疑是出现了native内存泄漏问题,但经分析后发现是Android N和Android O在处理Bitmap的内存存储不同导致的问题,并不是内存泄漏~ trace如下(待补充):内存申请 由于Bitmap构造方法不是public的,使用Bitmap时,一般都是使用BitmapFactory的decode操作,以BitmapFact...

2018-06-18 21:56:47

Android内存优化(二)之如何分析native heap

首先先来看一下实际中我们看到的nativeheap(我临时dump的com.android.settings进程的nativeheap):AndroidNativeHeapDumpv1.0Totalmemory:17898619Allocationrecords:32501Backtracesize:16z1sz585216num...

2018-06-01 17:07:13

Android内存优化(二)之获取native heap文件过程

获取某个进程native heap的方法大致分为两个步骤: 1:配置两个属性,上一篇博客中有介绍,具体操作如下: adb shell stop adb shell setprop libc.debug.malloc.program app_process adb shell setprop libc.debug.malloc.options backtrace ...

2018-06-01 16:00:28

Android内存优化(二)之malloc debug简单介绍与初始化工作

简单介绍mallocdebug工具,源码中有这么一段解释(在malloc_debug目录下有README.md):Whenmallocdebugisenabled,itworksbyaddingashimlayerthatreplacesthenormalallocationcalls.Thereplacedcallsare:*`malloc...

2018-04-22 19:01:34

Android内存优化(二)之Native内存泄露检测工具malloc debug基础篇

google 有个debug工具malloc debug,可以用于检测native内存泄露,我们都知道,分配内存的方式有许多,为什么要选malloc_debug?而不是calloc_debug等呢~原因在native世界,我们经常用到的语言就是C语言和C++语言,首先看下C语言的内存分配:C语言的内存分配方式在C语言中,分配内存方式主要有三种: <1>从静态存...

2018-04-08 20:19:55

Android内存优化(一)之AsyncTask内存泄露使用WeakReference修复不生效

近期有个业务报了一个好Bug,按照常规的内存泄漏修复方案修复后依然不生效~ 具体如下: 最开始测试出AsyncTask的内存泄露,然后按照内存泄露修复方案修复(static+weakreference+cancel),但依然有内存泄露GC ROOT thread java.lang.Thread. (named ‘AsyncTask #125’)references com.miui....

2018-03-29 14:33:51

Android内存优化(一)之FinalizerDaemon和FinalizerWatchDog多线程内存泄露案例

前期有一个内存泄露case跟多线程相关,简单记录如下:问题描述跑一晚上的内存测试后,会出现很多的内存泄露,泄露trace如下In *********:2.0.0:2.* ************.editor.photo.app.PhotoEditor has leaked:* GC ROOT static java.lang.Daemons$FinalizerDaemon...

2018-03-08 17:33:23

Android内存优化(一)之Android常见的Java层内存泄露场景及合理的修复方案

首先解释下内存泄露: 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 内存泄露分为永久性泄露和临时性泄露.永久性泄露是指只要泄露出现,泄露的内存永远不会回收,此种情况一般问题比较严重,一旦发现,需快速解决.临时性泄露是指泄露场景出现后,在在未来的某段时间...

2018-02-12 10:45:01

Android内存优化(一)之Java层内存泄露监测工具原理(Leakcanary)

近期时间相对宽裕一些,把相关的知识点整理下放到博客~ 封装的Java层内存泄露监测工具主要基于开源的leakcanary project,下面对Leakcanary原理浅析 Leakcanary简介Leakcanary工具是用来检测Java层内存泄露的工具,严格的说是检测Activty的内存泄露(监测的是Activity的onDestroy方法,后面会提这一点),能帮助我们发现很多隐藏的内...

2018-01-06 17:01:48

GraphicsStatsService常见的几个问题带来的思考

最近有一部分工作涉及到此服务,有几个问题: 1:为什么会有两个相同的package 2:进程挂掉后再重启,为什么Since不变 3:有没有3个Package相同的情况 4:Since值什么时候改变 我们先从宏观角度看代码,再具体解释几个问题: Android系统中GraphicsStatsService服务是用来汇总卡顿数据的,通过adb shell dumpsys graph

2017-07-20 23:48:36

查看更多

勋章 我的勋章
    暂无奖章