2019 年阿里 Android 面试必问:Java+ 性能优化,android 编程实战
一、Java 篇
1.多线程并发;
sleep 和 wait 区别
join 的用法
线程同步:synchronized 关键字等
线程通信
线程池
手写死锁
2.Java 中的引用方式,及各自的使用场景 3.HashMap 的源码 4.GC(垃圾回收)是什么?如何工作的?回收算法有哪些 5.Error 和 Exception 区别?6.反射和注解了解吗?项目中有使用过吗?7.网络相关:
http 状态码
http 与 https 的区别?https 是如何工作的?
8.Java 中 LRUCache 是如何实现的(源码角度)?为什么要用 LinkedHashmap?9.设计模式:
手写单例,volitate 关键字的原理
手写生产者消费者模式
项目中都使用过哪些设计模式?
编码常遵循的设计原则:单一职责、开闭原则、里氏替换等
10.ArrayList 和 LinkedList 区别?
二、Android
1.源码相关:
Activity 启动过程
事件分发源码,以及由此衍生的事件拦截如何实现
消息机制:Handler 源码(结合 Looper、MessageQueue),以及取不到消息时会怎样?
View.post 为什么可以拿到宽高?
2.自定义 View;
流程:onMeasure, onLayout, onDraw
onMeasure 中的 MeasureSpec 是如何计算的?
3.Dalvik 运行的是自定义的.dex 字节码格式。4.如何捕获应用全局异常?5.Service 是使用,bind 和 start 的区别?6.Android 中的 IPC 机制有哪些?(接着往下问)7.属性动画源码?8.大图加载 9.ANR 如何定位,如何分析?(trace 日志)10.项目中使用了哪些开源库?挑一个说说源码?11.MVC 和 MVP 区别?12.Activity:
A 启动 B,生命周期是怎么走的?(注意区分 B 是否是透明的)
启动模式
13.AsyncTask 原理?
三、性能优化
1.Android UI 适配;
字体使用 sp,使用 dp,多使用 match_parent,wrap_content,weight
图片资源,不同图片的的分辨率,放在相应的文件夹下可使用百分比代替。
2.app 优化:(工具:Hierarchy Viewer 分析布局 工具:TraceView 测试分析耗时的)3.App 启动优化 4.布局优化(尽量不要过于复杂的嵌套。可以使用,,)5.响应优化;;
Android 系统每隔 16ms 会发出 VSYNC 信号重绘我们的界面(Activity)
页面卡顿的原因:(1)过于复杂的布局.(2)UI 线程的复杂运算(3)频繁的 GC
导致频繁 GC 有两个原因:(-1)、内存抖动, 即大量的对象被创建又在短时间内马上被释放.(2)、瞬间产生大量的对象会严重占用内存区域。
6.内存优化:参考内存泄露和内存溢出部分
7.电池使用优化(使用工具:Batterystats & bugreport);
优化网络请求
定位中使用 GPS, 请记得及时关闭
8.网络优化(网络连接对用户的影响:流量,
电量,用户等待)可在 Android studio 下方 logcat 旁边那个工具 Network Monitor 检测
API 设计:App 与 Server 之间的 API 设计要考虑网络请求的频次, 资源的状态等. 以便 App 可以以较少的请求来完成业务需求和界面的展示.
Gzip 压缩:使用 Gzip 来压缩 request 和 response, 减少传输数据量, 从而减少流量消耗.
图片的 Size:可以在获取图片时告知服务器需要的图片的宽高, 以便服务器给出合适的图片, 避免浪费.
网络缓存:适当的缓存, 既可以让我们的应用看起来更快, 也能避免一些不必要的流量消耗.
9.图片优化;
对图片本身进行操作。尽量不要使用 setImageBitmap、setImageResource、BitmapFactory.decodeResource 来设置一张大图,因为这些方法在完成 decode 后,最终都是通过 java 层的 createBitmap 来完成的,需要消耗更多内存.
图片进行缩放的比例,SDK 中建议其值是 2 的指数值,值越大会导致图片不清晰。
不用的图片记得调用图片的 recycle()方法
四、NDK 和前沿技术 1.谈谈你对 JNI 和 NDK 的理解;
JNI 是 Java Native Interface 的缩写,即 Java 的本地接口。
目的是使得 Java 与本地其他语言(如 C/C++)进行交互。
JNI 是属于 Java 的,与 Android 无直接关系。
NDK 是 Native Development Kit 的缩写,是 Android 的工具开发包。
作用是更方便和快速开发 C/C++ 的动态库,并自动将动态库与应用一起打包到 apk。
NDK 是属于 Android 的,与 Java 无直接关系。总结:
评论