关于android:史上最全的Android面试题集锦六

4次阅读

共计 4509 个字符,预计需要花费 12 分钟才能阅读完成。

原文链接: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/

正文完
 0