不少人面试以前,可能没有在互联网公司工做过或者说工做过但年头较短,不知道互联网公司技术面试都会问哪些问题? 再加上可能本身准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨败收场。面试
下述是我收录整理的Android面试题汇总,因为篇幅缘由,在这只把性能优化部分的题目列举出来,后续还会更新其他面试题内容,你们能够关注一下我,及时知晓我更新的知识点,同时这份面试集锦的整理也花费了我不少时间,有须要的朋友能够帮忙转发分享下,点个赞~算法
Android的性能优化,主要是从如下几个方面进行优化的: 稳定(内存溢出、崩溃) 流畅(卡顿) 耗损(耗电、流量) 安装包(APK瘦身) 影响稳定性的缘由不少,好比内存使用不合理、代码异常场景考虑不周全、代码逻辑不合理等,都会对应用的稳定性形成影响。其中最多见的两个场景是:Crash 和 ANR,这两个错误将会使得程序没法使用。因此作好Crash全局监控,处理闪退同时把崩溃信息、异常信息收集记录起来,以便后续分析;合理使用主线程处理业务,不要在主线程中作耗时操做,防止ANR程序无响应发生。canvas
它是Android Studio自带的一个内存监视工具,它能够很好地帮助咱们进行内存实时分析。经过点击Android Studio右下角的Memory Monitor标签,打开工具能够看见较浅蓝色表明free的内存,而深色的部分表明使用的内存从内存变换的走势图变换,能够判断关于内存的使用状态,例如当内存持续增高时,可能发生内存泄漏;当内存忽然减小时,可能发生GC等,以下图所示。性能优化
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进行内存泄漏的展现。微信
Android Lint Tool 是Android Sutido种集成的一个Android代码提示工具,它能够给你布局、代码提供很是强大的帮助。硬编码会提示以级别警告,例如:在布局文件中写了三层冗余的LinearLayout布局、直接在TextView中写要显示的文字、字体大小使用dp而不是sp为单位,就会在编辑器右边看到提示。网络
卡顿的场景一般是发生在用户交互体验最直接的方面。影响卡顿的两大因素,分别是界面绘制和数据处理。架构
界面绘制:主要缘由是绘制的层级深、页面复杂、刷新不合理,因为这些缘由致使卡顿的场景更多出如今 UI 和启动后的初始界面以及跳转到页面的绘制上。框架
数据处理:致使这种卡顿场景的缘由是数据处理量太大,通常分为三种状况,一是数据在处理 UI 线程,二是数据处理占用 CPU 高,致使主线程拿不到时间片,三是内存增长致使 GC 频繁,从而引发卡顿。编辑器
在Android种系统对View进行测量、布局和绘制时,都是经过对View数的遍从来进行操做的。若是一个View数的高度过高就会严重影响测量、布局和绘制的速度。Google也在其API文档中建议View高度不宜哦过10层。如今版本种Google使用RelativeLayout替代LineraLayout做为默认根布局,目的就是下降LineraLayout嵌套产生布局树的高度,从而提升UI渲染的效率。
布局复用,使用标签重用layout; 提升显示速度,使用延迟View加载; 减小层级,使用标签替换父级布局; 注意使用wrap_content,会增长measure计算成本; 删除控件中无用属性;
过分绘制是指在屏幕上的某个像素在同一帧的时间内被绘制了屡次。在多层次重叠的 UI 结构中,若是不可见的 UI 也在作绘制的操做,就会致使某些像素区域被绘制了屡次,从而浪费了多余的 CPU 以及 GPU 资源。如何避免过分绘制?
布局上的优化。移除 XML 中非必须的背景,移除 Window 默认的背景、按需显示占位背景图片
自定义View优化。使用 canvas.clipRect() 帮助系统识别那些可见的区域,只有在这个区域内才会被绘制。
应用通常都有闪屏页SplashActivity,优化闪屏页的 UI 布局,能够经过 Profile GPU Rendering 检测丢帧状况。
在 Android5.0 之前,关于应用电量消耗的测试即麻烦又不许确,而5.0 以后Google专门引入了一个获取设备上电量消耗信息的API—— Battery Historian。Battery Historian 是一款由 Google 提供的 Android 系统电量分析工具,直观地展现出手机的电量消耗过程,经过输入电量分析文件,显示消耗状况。
最后提供一些可供参考耗电优化的方法:
浮点运算:计算机里整数和小数形式就是按普通格式进行存储,例如102四、3.1415926等等,这个没什么特色,可是这样的数精度不高,表达也不够全面,为了可以有一种数的通用表示法,就发明了浮点数。浮点数的表示形式有点像科学计数法(.×10^),它的表示形式是0.×10^,在计算机中的形式为 .* e ±**),其中前面的星号表明定点小数,也就是整数部分为0的纯小数,后面的指数部分是定点整数。利用这样的形式就能表示出任意一个整数和小数,例如1024就能表示成0.1024×10^4,也就是 .1024e+004,3.1415926就能表示成0.31415926×10^1,也就是 .31415926e+001,这就是浮点数。浮点数进行的运算就是浮点运算。浮点运算比常规运算更复杂,所以计算机进行浮点运算速度要比进行常规运算慢得多。
Wake Lock是一种锁的机制,主要是相对系统的休眠而言的,,只要有人拿着这个锁,系统就没法进入休眠意思就是个人程序给CPU加了这个锁那系统就不会休眠了,这样作的目的是为了全力配合咱们程序的运行。有的状况若是不这么作就会出现一些问题,好比微信等及时通信的心跳包会在熄屏不久后中止网络访问等问题。因此微信里面是有大量使用到了Wake_Lock锁。系统为了节省电量,CPU在没有任务忙的时候就会自动进入休眠。有任务须要唤醒CPU高效执行的时候,就会给CPU加Wake_Lock锁。你们常常犯的错误,咱们很容易去唤醒CPU来工做,可是很容易忘记释放Wake_Lock。
在Android 5.0 API 21 中,google提供了一个叫作JobScheduler API的组件,来处理当某个时间点或者当知足某个特定的条件时执行一个任务的场景,例如当用户在夜间休息时或设备接通电源适配器链接WiFi启动下载更新的任务。这样能够在减小资源消耗的同时提高应用的效率。
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 寻找资源。
代码混淆。使用IDE 自带的 proGuard 代码混淆器工具 ,它包括压缩、优化、混淆等功能。 资源优化。好比使用 Android Lint 删除冗余资源,资源文件最少化等。 图片优化。好比利用 PNG优化工具 对图片作压缩处理。推荐目前最早进的压缩工具Googlek开源库zopfli。若是应用在0版本以上,推荐使用 WebP图片格式。 避免重复或无用功能的第三方库。例如,百度地图接入基础地图便可、讯飞语音无需接入离线、图片库Glide\Picasso等。 插件化开发。好比功能模块放在服务器上,按需下载,能够减小安装包大小。 可使用微信开源资源文件混淆工具——AndResGuard。通常能够压缩apk的1M左右大。
冷启动 在启动应用时,系统中没有该应用的进程,这时系统会建立一个新的进程分配给该应用;
热启动 在启动应用时,系统中已有该应用的进程(例:按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性能优化部分的面试题目,后续还会更新其他面试题内容,你们能够关注一下我,及时知晓我更新的知识点,同时这份面试集锦的整理也花费了我不少时间,有须要的朋友能够帮忙转发分享下,点个赞~
Android架构师之路很漫长,一块儿共勉吧!