原文链接:https://blog.csdn.net/xiangzhihong8/java/article/details/96280254
7、性能优化
Android的性能优化,次要是从以下几个方面进行优化的:
稳固(内存溢出、解体)
晦涩(卡顿)
耗损(耗电、流量)
安装包(APK瘦身)
影响稳定性的起因很多,比方内存应用不合理、代码异样场景考虑不周全、代码逻辑不合理等,都会对利用的稳定性造成影响。其中最常见的两个场景是:Crash 和 ANR,这两个谬误将会使得程序无奈应用。所以做好Crash全局监控,解决闪退同时把解体信息、异样信息收集记录起来,以便后续剖析;正当应用主线程解决业务,不要在主线程中做耗时操作,避免ANR程序无响应产生。
(一)稳固——内存优化
(1)Memory Monitor 工具:
它是Android Studio自带的一个内存监督工具,它能够很好地帮忙咱们进行内存实时剖析。通过点击Android Studio右下角的Memory Monitor标签,关上工具能够看见较浅蓝色代表free的内存,而深色的局部代表应用的内存从内存变换的走势图变换,能够判断对于内存的应用状态,例如当内存继续增高时,可能产生内存透露;当内存忽然缩小时,可能产生GC等,如下图所示。
(2)LeakCanary工具:
LeakCanary是Square公司基于MAT开发的一款监控Android内存透露的开源框架。其工作的原理是:
监测机制利用了Java的WeakReference和ReferenceQueue,通过将Activity包装到WeakReference中,被WeakReference包装过的Activity对象如果被回收,该WeakReference援用会被放到ReferenceQueue中,通过监测ReferenceQueue外面的内容就能查看到Activity是否可能被回收(在ReferenceQueue中阐明能够被回收,不存在透露;否则,可能存在透露,LeakCanary是执行一遍GC,若还未在ReferenceQueue中,就会认定为透露)。
如果Activity被认定为泄露了,就抓取内存dump文件(Debug.dumpHprofData);之后通过HeapAnalyzerService.runAnalysis进行剖析内存文件剖析;接着通过HeapAnalyzer (checkForLeak—findLeakingReference—findLeakTrace)来进行内存透露剖析。最初通过DisplayLeakService进行内存透露的展现。
(3)Android Lint 工具:
Android Lint Tool 是Android Sutido种集成的一个Android代码提醒工具,它能够给你布局、代码提供十分弱小的帮忙。硬编码会提醒以级别正告,例如:在布局文件中写了三层冗余的LinearLayout布局、间接在TextView中写要显示的文字、字体大小应用dp而不是sp为单位,就会在编辑器左边看到提醒。
(二)晦涩——卡顿优化
卡顿的场景通常是产生在用户交互体验最间接的方面。影响卡顿的两大因素,别离是界面绘制和数据处理。
界面绘制:次要起因是绘制的层级深、页面简单、刷新不合理,因为这些起因导致卡顿的场景更多呈现在 UI 和启动后的初始界面以及跳转到页面的绘制上。
数据处理:导致这种卡顿场景的起因是数据处理量太大,个别分为三种状况,一是数据在解决 UI 线程,二是数据处理占用 CPU 高,导致主线程拿不到工夫片,三是内存减少导致 GC 频繁,从而引起卡顿。
(1)布局优化
在Android种系统对View进行测量、布局和绘制时,都是通过对View数的遍从来进行操作的。如果一个View数的高度太高就会重大影响测量、布局和绘制的速度。Google也在其API文档中倡议View高度不宜哦过10层。当初版本种Google应用RelativeLayout代替LineraLayout作为默认根布局,目标就是升高LineraLayout嵌套产生布局树的高度,从而进步UI渲染的效率。
布局复用,应用标签重用layout;
进步显示速度,应用提早View加载;
缩小层级,应用标签替换父级布局;
留神应用wrap_content,会减少measure计算成本;
删除控件中无用属性;
(2)绘制优化
适度绘制是指在屏幕上的某个像素在同一帧的工夫内被绘制了屡次。在多层次重叠的 UI 构造中,如果不可见的 UI 也在做绘制的操作,就会导致某些像素区域被绘制了屡次,从而节约了多余的 CPU 以及 GPU 资源。如何防止适度绘制?
布局上的优化。移除 XML 中非必须的背景,移除 Window 默认的背景、按需显示占位背景图片
自定义View优化。应用 canvas.clipRect() 帮忙零碎辨认那些可见的区域,只有在这个区域内才会被绘制。
(3)启动优化
利用个别都有闪屏页SplashActivity,优化闪屏页的 UI 布局,能够通过 Profile GPU Rendering 检测丢帧状况。
(三)节俭——耗电优化
在 Android5.0 以前,对于应用电量耗费的测试即麻烦又不精确,而5.0 之后Google专门引入了一个获取设施上电量耗费信息的API—— Battery Historian。Battery Historian 是一款由 Google 提供的 Android 零碎电量剖析工具,直观地展现出手机的电量耗费过程,通过输出电量剖析文件,显示耗费状况。
最初提供一些可供参考耗电优化的办法:
(1)计算优化。算法、for循环优化、Switch…case代替if…else、避开浮点运算。
浮点运算:计算机里整数和小数模式就是按一般格局进行存储,例如1024、3.1415926等等,这个没什么特点,然而这样的数精度不高,表白也不够全面,为了可能有一种数的通用表示法,就创造了浮点数。浮点数的示意模式有点像迷信计数法(.×10***),它的示意模式是0.*****×10,在计算机中的模式为 .*** e ±**),其中后面的星号代表定点小数,也就是整数局部为0的纯小数,前面的指数局部是定点整数。利用这样的模式就能示意出任意一个整数和小数,例如1024就能示意成0.1024×10^4,也就是 .1024e+004,3.1415926就能示意成0.31415926×10^1,也就是 .31415926e+001,这就是浮点数。浮点数进行的运算就是浮点运算。浮点运算比惯例运算更简单,因而计算机进行浮点运算速度要比进行惯例运算慢得多。
(2)防止 Wake Lock 使用不当。
Wake Lock是一种锁的机制,次要是绝对零碎的休眠而言的,,只有有人拿着这个锁,零碎就无奈进入休眠意思就是我的程序给CPU加了这个锁那零碎就不会休眠了,这样做的目标是为了全力配合咱们程序的运行。有的状况如果不这么做就会呈现一些问题,比方微信等及时通信的心跳包会在熄屏不久后进行网络拜访等问题。所以微信外面是有大量应用到了Wake_Lock锁。零碎为了节俭电量,CPU在没有工作忙的时候就会主动进入休眠。有工作须要唤醒CPU高效执行的时候,就会给CPU加Wake_Lock锁。大家常常犯的谬误,咱们很容易去唤醒CPU来工作,然而很容易遗记开释Wake_Lock。
(3)应用 Job Scheduler 治理后台任务。
在Android 5.0 API 21 中,google提供了一个叫做JobScheduler API的组件,来解决当某个工夫点或者当满足某个特定的条件时执行一个工作的场景,例如当用户在夜间劳动时或设施接通电源适配器连贯WiFi启动下载更新的工作。这样能够在缩小资源耗费的同时晋升利用的效率。
(四)安装包——APK瘦身
(1)安装包的组成构造
assets文件夹。寄存一些配置文件、资源文件,assets不会主动生成对应的 ID,而是通过 AssetManager 类的接口获取。
res。res 是 resource 的缩写,这个目录寄存资源文件,会主动生成对应的 ID 并映射到 .R 文件中,拜访间接应用资源 ID。
META-INF。保留利用的签名信息,签名信息能够验证 APK 文件的完整性。
AndroidManifest.xml。这个文件用来形容 Android 利用的配置信息,一些组件的注册信息、可应用权限等。
classes.dex。Dalvik 字节码程序,让 Dalvik 虚拟机可执行,个别状况下,Android 利用在打包时通过 Android SDK 中的 dx 工具将 Java 字节码转换为 Dalvik 字节码。
resources.arsc。记录着资源文件和资源 ID 之间的映射关系,用来依据资源 ID 寻找资源。
(2)缩小安装包大小
代码混同。应用IDE 自带的 proGuard 代码混同器工具 ,它包含压缩、优化、混同等性能。
资源优化。比方应用 Android Lint 删除冗余资源,资源文件起码化等。
图片优化。比方利用 PNG优化工具 对图片做压缩解决。举荐目前最先进的压缩工具Googlek开源库zopfli。如果利用在0版本以上,举荐应用 WebP图片格式。
防止反复或无用性能的第三方库。例如,百度地图接入根底地图即可、讯飞语音无需接入离线、图片库Glide\Picasso等。
插件化开发。比方功能模块放在服务器上,按需下载,能够缩小安装包大小。
能够应用微信开源资源文件混同工具——AndResGuard。个别能够压缩apk的1M左右大。
7.1、冷启动与热启动
参考链接:https://www.jianshu.com/p/03c...
冷启动
在启动利用时,零碎中没有该利用的过程,这时零碎会创立一个新的过程调配给该利用;
热启动
在启动利用时,零碎中已有该利用的过程(例:按back键、home键,利用尽管会退出,然而该利用的过程还是保留在后盾);
区别
冷启动:零碎没有该利用的过程,须要创立一个新的过程调配给利用,所以会先创立和初始化Application类,再创立和初始化MainActivity类(包含一系列的测量、布局、绘制),最初显示在界面上。 热启动: 从已有的过程中来启动,不会创立和初始化Application类,间接创立和初始化MainActivity类(包含一系列的测量、布局、绘制),最初显示在界面上。
冷启动流程
Zygote过程中fork创立出一个新的过程; 创立和初始化Application类、创立MainActivity; inflate布局、当onCreate/onStart/onResume办法都走完; contentView的measure/layout/draw显示在界面上。
冷启动优化
缩小在Application和第一个Activity的onCreate()办法的工作量; 不要让Application参加业务的操作; 不要在Application进行耗时操作; 不要以动态变量的形式在Application中保留数据; 缩小布局的复杂性和深度
点击下方链接收费获取Android进阶材料:
https://shimo.im/docs/tXXKHgdjPYj6WT8d/