性能优化
Luckie stone
Android应用开发。
展开
-
Android内存优化之OOM
Android的内存优化是性能优化中很重要的一部分,而避免OOM又是内存优化中比较核心的一点。这是一篇关于内存优化中如何避免OOM的总结性概要文章,内容大多都是和OOM有关的实践总结概要。理解错误或是偏差的地方,还请多包涵指正,谢谢!(一)Android的内存管理机制Google在Android的官网上有这样一篇文章,初步介绍了Android是如何管理应用的进程与内存分配:http://d...转载 2018-02-09 08:55:04 · 433 阅读 · 0 评论 -
Android自实现百分比布局
在开发中,组件布局是大家每日开发必须要面对的工作,对于Android来说提供五种常用布局,分别是:LinearLayout(线性布局) TableLayout(表格布局) RelativeLayout(相对布局) AbsoluteLayout(绝对布局) FrameLayout(框架布局) 但是,开发中如果可以按照百分比的方式进行界面布局,将会对我们的适配工作带来许多便利。前...转载 2018-08-19 07:27:45 · 1497 阅读 · 1 评论 -
Android性能优化第(二)篇---Memory Monitor检测内存泄露
上篇说了一些性能优化的理论部分,主要是回顾一下,有了理论,小平同志又讲了,实践是检验真理的唯一标准,对于内存泄露的问题,现在通过Android Studio自带工具Memory Monitor 检测出来。性能优化的重要性不需要在强调,但是要强调一下,我并不是一个老司机,嘿嘿!没用过这个工具的,请睁大眼睛。如果你用过,那么就不用在看这篇博客了。先看一段会发生内存泄露的代码public cl...转载 2018-08-06 06:37:52 · 298 阅读 · 0 评论 -
Android性能优化第(三)篇---MAT比Menmery Monitor更强大
- GC回收对可回收对象的判定 什么样的对象是可以被回收的? 当然是GC发现通过任何referencechain(引用链)无法访问某个对象的时候,该对象即被回收。名词GC Roots正是分析这一过程的起点,例如JVM自己确保了对象的可到达性(那么JVM就是GC Roots),所以GCRoots就是这样在内存中保持对象可到达性的,一旦不可到达,即被回收。通常GC Roots是一个在current...转载 2018-08-06 06:37:58 · 175 阅读 · 0 评论 -
Android性能优化第(四)篇---Allaction Tracing追踪内存分配的轨迹
Allaction Tracing是追踪内存分配的工具,可以很直观的看到某个操作是如何一步步分配的。废话不多说,贴一下代码,我对这段代码进行内存分配追踪。public class LoginActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstance...转载 2018-08-06 06:38:16 · 255 阅读 · 0 评论 -
Android性能优化第(五)篇---Android UI渲染机制
优化性能一般从渲染,运算与内存,电量三个方面进行,今天开始说聊一聊Android的渲染机制,我们要知道Android系统每隔16ms就重新绘制一次Activity,也就是说,我们的应用必须在16ms内完成屏幕刷新的全部逻辑操作,即每一帧只能停留16ms,渲染机制说完之后,然后在说如何去优化UI。1、为什么是16ms16ms意味着1000/60hz,相当于60fps。这是因为人眼与大脑之间的...转载 2018-08-06 06:38:23 · 304 阅读 · 0 评论 -
Android性能优化第(六)篇---TraceView 分析图怎么看
TraceView是什么,TraceView 是 Android 平台特有的数据采集和分析工具,主要用做热点分析,找出最需要优化的点。TraceView 从代码层面分析性能问题,针对每个方法来分析,比如当我们发现我们的应用出现卡顿的时候,我们可以来分析出现卡顿时在方法的调用上有没有很耗时的操作,通过TraceView,可以得到两种数据。 - 单次执行最耗时的方法 - 执行次数最多的方法...转载 2018-08-06 06:38:31 · 624 阅读 · 0 评论 -
Android性能优化第(七)篇---StrickMode严苛模式检测耗时与内存问题
StrictMode意思为严格模式,是用来检测程序中违例情况的开发者工具。使用一般是场景是检测主线程中本地磁盘和网络读写等耗时的操作。注意这个StrictMode是在Anroid2.3以后引入的。严格模式主要检测两大问题,一个是线程策略,即TreadPolicy,另一个是VM策略,即VmPolicy。线程策略(ThreadPolicy)检测的内容有1、自定义的耗时调用 使用detectCu...转载 2018-08-06 06:38:43 · 361 阅读 · 0 评论 -
Android性能优化第(八)篇---App启动速度优化上
应用的启动速度缓慢这是很多开发者都遇到的一个问题,比如启动缓慢导致的黑屏,白屏问题,大部分的答案都是做一个透明的主题,或者是做一个Splash界面,但是这并没有从根本上解决这个问题。那么如何从根本上解决这个问题或者做到一定程度的缓解?一、应用的启动方式1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会首先会创建一个新的进程分配给该应用,这种启动方式就是冷启动。2、热启动:当启动...转载 2018-08-06 06:38:50 · 4074 阅读 · 0 评论 -
Android性能优化第(九)篇---App启动速度优化之启动页设计
如果经过第一轮的优化之后,还是不满意的话,一般我们是做个启动页,因为启动页一般View的数量比较少,业务逻辑比较简单,启动就不太费劲。一、设计思路常规启动页设计思路通常点击桌面就会执行,Application中的逻辑,这部分的逻辑优化技巧在上篇介绍过,然后会跳入启动页SplashActivity,通常展示一个图片和logo,然后2或3秒后,并且SplashActivity里面可以去做一些...转载 2018-08-06 06:38:56 · 539 阅读 · 0 评论 -
Android性能优化第(十)篇---布局优化
我们知道Android系统每隔16ms就重新绘制一次Activity,如果没有完成就会有丢帧的现象。为了减轻UI绘制的负担,有必要把Layout编写的一些注意事项总结一下。首先说一下< include/>,< merge/>,ViewStub,如果对这部分清楚的朋友可以跳过。1、< include/>重用比如我们要写一个TitleBar(title_...转载 2018-08-06 06:39:04 · 174 阅读 · 0 评论 -
Android性能优化第(十 一)篇---卡顿分析,正确评测流畅度
一、FPS评测应用流畅度不准确说到应用的流畅度,都会想到FPS,系统获取FPS的原理是:手机屏幕显示的内容是通过Android系统的SurfaceFLinger类,把当前系统里所有进程需要显示的信息合成一帧,然后提交到屏幕上进行显示,FPS就是1秒内SurfaceFLinger提交到屏幕的帧数。用FPS来评测一个应用是否真的卡顿存在两个问题。 - 有的时候FPS很低,APP看起来却很流畅; ...转载 2018-08-07 06:29:32 · 1527 阅读 · 0 评论 -
携程移动端 UI 界面性能优化实践
UI 卡顿原理和原因人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯,其帧率通常为 24fps;那么,用手机当然也需要感知屏幕操作的连贯性(尤其是动画过渡),所以在手机领域 Android/iOS 索性就把达到这种流畅的帧率规定为 60fps。基于上面的背景,我们开发 App 的帧率性能目标就是保持在 60fps(16ms/帧),即我们在进行 Ap...转载 2018-08-19 07:27:22 · 1512 阅读 · 0 评论 -
Android性能优化典范之多线程篇
本文涉及的内容有:多线程并发的性能问题,介绍了 AsyncTask,HandlerThread,IntentService 与 ThreadPool 分别适合的使用场景以及各自的使用注意事项,这是一篇了解 Android 多线程编程不可多得的基础文章,清楚的了解这些 Android 系统提供的多线程基础组件之间的差异以及优缺点,才能够在项目实战中做出最恰当的选择。1. Threading Pe...原创 2018-08-30 06:58:07 · 814 阅读 · 0 评论 -
ANR问题该如何分析?
ANR问题,相信是每位开发日常都会遇到的问题,对于这类问题的分析,按照官方的推荐,或网络博客的总结思路能解决一定的问题,但是多数时候大家的困惑就是应用本逻辑很简单,耗时很短或应用堆栈完全正常,或者或处于空闲状态,可系统为什么就认为接收者发生ANR了呢?下面我将用几个实例从不同角度分析导致ANR产生的Root Case。也希望对大家以后分析该类问题有一定参考价值。ANR分类,含如下几种类型:...转载 2018-12-18 07:26:36 · 690 阅读 · 0 评论 -
App启动页面优化
1.1 问题描述出现问题描述android app启动页面黑屏的问题,android开发app启动时若没有做特殊处理的话,会出现一瞬间的白屏现象。即使你启动页界面就加载一个布局,不做其他耗时处理,貌似也会出现一瞬间的白屏问题。注意,有些地方也称黑屏,主要是看你给app设置的style样式。当从桌面 Launcher 的小图标点击冷启动一个 App 的时候,程序需要进行一些基本的初始化操作,...转载 2019-05-11 16:28:59 · 155 阅读 · 0 评论 -
使用ArrayMap优化Android App
当我们需要存储健->值这样的数据类型时,脑海里想到的第一个数据类型应该是HashMap。然后开始肆无忌惮的使用它,而从不考虑它带来的性能影响。使用HashMap时,Android Studio会发出警告,提示你使用ArrayMap来代替,但是通常被我们忽略了。既然Android推荐了ArrayMap,那我们应该优先考虑使用它而不是HashMap。下面简单对比下HashMap和Arra...转载 2018-12-18 07:24:45 · 394 阅读 · 0 评论 -
Android严苛模式StrictMode使用详解
StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的。举个例子来说,如果开发者在UI线程中进行了网络操作或者文件系统的操作,而这些缓慢的操作会严重影响应用的响应能力,甚至出现ANR对话框。为了在开发中发现这些容易忽略的问题,我们使用StrictMode,系统检测出主线程违例的情况并做...转载 2019-07-03 07:17:05 · 991 阅读 · 0 评论 -
Android性能优化第(一)篇---基本概念
让理论先行,理论指导实践。性能优化的重要性不想再强调,我是个新手,要开始开车了,阅读本文你会弄清楚或者再次回顾以下问题。1、java的内存区域如何划分? 2、java中的引用有哪些?如何运用? 3、什么是内存泄露?内存泄露发生的场景有哪些? 4、Garbage Collector(垃圾回收器)什么是垃圾,什么是非垃圾?看到这,如果你觉得有必要了解一下,请往下读,否则press back...转载 2018-08-06 06:37:45 · 246 阅读 · 0 评论 -
Android App卡顿分析,以及使用Choreographer进行帧率统计监测
1、背景:卡顿是最影响App用户体验的原因之一。卡顿造成的原因多种多样,简单列举一下 1、布局层级过多,设置无用的背景色,布局中添加了多种不必要的背景色,导致view绘制的时候多次绘制,引起卡顿 2、布局太复杂,嵌套过多,例如RelativeLayout 相比LinearLayout,可以有效减少布局层级,层级太复杂,会影响view的measure时间,进而造成卡顿。 3、内存使用...转载 2018-08-05 06:41:14 · 3378 阅读 · 0 评论 -
Stetho的介绍
官方地址:http://facebook.github.io/stetho/GitHub地址:https://github.com/facebook/stethoRelease包下载地址:https://github.com/facebook/stetho/releases介绍:Stetho是Facebook推出的一款使用Chrome来调试Android Application的工具...原创 2018-06-27 22:41:19 · 3476 阅读 · 1 评论 -
APP启动时白屏/黑屏
原因剖析我们正常开发中会在Activity的onCreate()方法中调用setContentView(View)设置该Activity的显示布局,那么问题就来了,既然我们设置了布局,为什么启动的时候还会白屏或者黑屏而不是显示我set的布局呢?下面就带领大家一起来剖析一下原因。当打开一个Activity时,如果这个Activity所属Application还没有在运行,系统会为这个Acti...转载 2018-06-18 06:21:18 · 1541 阅读 · 0 评论 -
使用@IntDef @StringDef替代enum
为什么要使用枚举举一个例子,例如我们要为一个bean赋值一个person的性别属性,因为性别只有男女,所以我们通常的做法是定义两个整型int,来区分“男女”性别public class SexTest{private final int MAN = 101, WOMEN = 102;private int sex;//设置性别public void setSex(int sex)...转载 2018-06-18 06:20:04 · 1037 阅读 · 0 评论 -
LeakCanary 中文使用说明
什么是内存泄露一些对象有着有限的生命周期。当这些对象所要做的事情完成了,我们希望他们会被回收掉。但是如果有一系列对这个对象的引用,那么在我们期待这个对象生命周期结束的时候被收回的时候,它是不会被回收的。它还会占用内存,这就造成了内存泄露。持续累加,内存很快被耗尽。比如,当 Activity.onDestroy 被调用之后,activity 以及它涉及到的 view 和相关的 bitm...转载 2018-05-10 11:30:06 · 288 阅读 · 0 评论 -
SortedList
SortedList是什么?源码头注释如下:A Sorted list implementation that can keep items in order and also notify for changes in the list。翻译: 一个有序列表(数据集)的实现,可以保持ItemData都是有序的,并(自动)通知列表(RecyclerView)(数据集)中的更改。...转载 2018-03-14 12:47:48 · 487 阅读 · 0 评论 -
DiffUtil
一 概述DiffUtil是support-v7:24.2.0中的新工具类,它用来比较两个数据集,寻找出旧数据集-》新数据集的最小变化量。 说到数据集,相信大家知道它是和谁相关的了,就是我的最爱,RecyclerView。 就我使用的这几天来看,它最大的用处就是在RecyclerView刷新时,不再无脑mAdapter.notifyDataSetChanged()。 以前无脑mAdapte...转载 2018-03-14 12:38:15 · 1731 阅读 · 0 评论 -
Android百分比布局
Android提供了Android-percent-support这个库,支持百分比布局,在一定程度上可以解决屏幕适配的问题。他提供了两种布局:PercentRelativeLayout和PercentFrameLayout。支持的属性:layout_widthPercentlayout_heightPercentlayout_marginPercentlayout_mar...转载 2018-06-18 06:20:11 · 366 阅读 · 0 评论 -
android里面layer-list中的inset和clip到底有什么作用
Inset Drawable:用于通过指定的间距把图片插入到XML中,它在View需要比自身小的背景时常用。有些像padding的作用。例子: 第一步:drawable文件中建立inset_drawable.xml <?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schema...转载 2018-03-08 08:49:45 · 3698 阅读 · 0 评论 -
内存泄露检测工具LeakCanary
LeakCanaryAndroid 和 Java 内存泄露检测。“A small leak will sink a great ship.” - Benjamin Franklin千里之堤, 毁于蚁穴。 -- 《韩非子·喻老》 demo一个非常简单的 LeakCanary demo: https://github.com/liaohuqiu/leakcanar...转载 2018-07-25 06:08:08 · 225 阅读 · 0 评论 -
浅谈Android性能优化方案
先给大家介绍一下UC公司的性能优化指标以及部分方案: 一、性能优化六项指标: 性能、内存、稳定性、流量、电量、安装包大小; 二、背景 ---- Android程序卡顿产生原因: 1、Android系统低效 --渲染线程、同步接口、广播机制 :没...转载 2018-07-25 06:08:22 · 185 阅读 · 0 评论 -
Android Drawable之level-list使用简介
在Android开发中,有时候需要对一个ImageView设置很多不同图片以表示某种应用状态,比如,典型的是手机的信号强度从强到弱有多种状态图;wifi有解锁和未解锁状态,解锁和未解锁状态的图标也是很多种。如果每次都一一的通过ImageView设置图片的src来达到这一目的,实在是太过于繁琐,且维护和管理起来不便。因此,引入ImageView的setImageLevel和level-list实现这...转载 2018-08-22 06:41:33 · 561 阅读 · 0 评论 -
Android百分比布局
Android官方的android-percent-support库,可以实现百分比布局。它提供了两个类PercentRelativeLayout、PercentFrameLayout,通过名字就可以看出,这是继承自FrameLayout和RelativeLayout两个布局类。我们使用这两个类,可以设置的属性有:layout_widthPercent、layout_heightPerc...转载 2018-08-21 06:27:20 · 2271 阅读 · 0 评论 -
Android 开发常用技巧
1、防止按钮快速点击的工具类:private static final int MIN_DELAY_TIME= 1000; // 两次点击间隔不能少于1000ms private static long lastClickTime; public static boolean isFastClick() { boolean flag = true; ...转载 2018-08-21 06:27:44 · 193 阅读 · 0 评论 -
Android 通过 shape 实现三角形气泡效果
需要实现 UI 给出的下面两种图中带三角形气泡的效果:如果使用 .9 图,一方面会增加安装包体积,另一方面,拉伸后可能变形。将气泡分解可知,气泡由 正/倒三角形 和 圆角长方形 组成,于是可以通过组合来形成三角形气泡的效果。正三角形的 triangle_up.xml 如下:<?xml version="1.0" encoding="utf-8"?><lay...转载 2018-08-20 06:34:30 · 11113 阅读 · 1 评论 -
Android 画三角形shape
<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@+id/shape_id"><!-- 正三角 -->转载 2018-08-20 06:34:05 · 9686 阅读 · 0 评论 -
SparseLongArray 和 LongSparesArray 的区别
SparseArray 是 Android 平台特有的,引入 SparseArray 的目的是替代 HashMap 从而节省内存空间,其用法与 HashMap很类似。由 SparseArray 又可以派生出 SparseLongArray 和 LongSparesArray。要说 SparseLongArray 和 LongSparesArray 的区别,先来说一下 SparseArray。 ...转载 2018-08-21 06:28:51 · 383 阅读 · 0 评论 -
深入理解Java:SimpleDateFormat安全的时间格式化
想必大家对SimpleDateFormat并不陌生。SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调试的问题,因为 DateFormat 和 SimpleDateFormat 类不都是线程安全的,在多线程环境下调用 format() 和 parse() 方法应该使用同步代码来避免问题。下面我们通过一...转载 2018-08-20 06:35:57 · 190 阅读 · 0 评论 -
Android 帧动画OOM问题优化
普通实现实现一个帧动画,最先想到的就是用animation-list将全部图片按顺序放入,并设置时间间隔和播放模式。然后将该drawable设置给ImageView或Progressbar就OK了。首先创建帧动画资源文件drawable/anim.xml,oneshot=false为循环播放模式,ture为单次播放;duration为每帧时间间隔,单位毫秒。<animation-...转载 2019-10-10 06:59:31 · 693 阅读 · 0 评论