文章目录
1. Dalvik 和 ART 的区别?
- Dalvik 每次运行都需要把字节码即时编译成机器码(JIT);ART 会在安装时把字节码预编译成机器码,使其成为真正的本地应用。
- ART 占用空间比Dalvik 大,大约(10%~20%),用空间换时间。
- ART 不用每次运行都重新编译(AOT),减少cpu使用频率,降低能耗。
JVM 基于栈,Dalvik 基于寄存器。
.dex文件–>AOT预编译–>.oat文件–>在ART上运行
2. Bitmap 优化?
通过BitmapFactory.options
- inPreferredConfig 设置图片解码后的格式,如ARGB_8888 和 RGB_565。其中ARGB_8888 是8+8+8+8=32,一个像素占用 4 个字节。RGB_565 是 5+6+5=16,一个像素占用 2 个字节。
- inSimpleSize 设置图片的采样率进行图片的缩放显示。如值为 2 ,表示长宽均为原来的 1/2,整个图片占用内存的面积为原来的 1/4。inSimpleSize 只能设置为 2 的幂。
三级缓存?
内存缓存–>本地缓存–>网络获取 另外要注意 Bitmap 的复用问题。
3. Bundle 用来传递数据,为什么不用 HashMap取代?
Bundle 内部用的 ArrayMap,这其实用ArrayMap和HashMap 的比较。
- ArrayMap 适合在小数据量时操作,数据量大时性能会退化;HashMap 使用数组+链表,在数据量少的时候Entry[] 会占用更大的内存。而bundle 场景是小数据量。
- 使用 intent携带数据的话,需要的基本类型和序列化类型。bundle 使用 Parcelable,HashMap 是使用 Serializable。
4. 广播和EventBus的区别?
- 广播是四大组件之一,EventBus是开源框架;
- 广播不能执行耗时操作,超过10s会ANR;
- 广播耗资源,EventBus比较轻量;
- 广播容易获取Context和intent;
- EventBus切换线程方便;
- 广播可以跨进程, EventBus不可以;
5. 什么是 SurfaceView?
- 子线程绘制
是View的子类,是一个专门用来做频繁绘制的View的子类,它的绘制操作是在子线程中进行的,所以频繁绘制不会造成阻塞线程,用于处理频繁绘制和长时间绘制效果好。如相机,游戏,视频。
子线程涉及到事件同步问题,需要有一个event queue来保存touch event,类似handler。
- 双缓冲模式
一个后台缓冲区,一个前台缓冲区。本质就是后台线程绘制,UI线程渲染。
6. 什么是Activity,Window,view?
- Activity 是四大组件之一,存放view的容器;
- Window是一个抽象类,PhoneWindow是实现类,Activity的setContentView 实际上是调用的PhoneWindow的方法;
- View 是一个视图对象;
大概的包含关系:Activity–>PhoneWindow–>DecorView–>TitleView + ContentView
7. ClassLoader 原理是什么?
java类加载器有下面几种:
- BootClassLoader 用于加载Android Framework 层 class 文件。
- PathClassLoader 用于 android 应用程序类加载器。可以加载指定的dex、以及 jar、zip、apk 中的 classes.dex。
- DexClassLoader 加载指定的dex、以及 jar、zip、apk 中的 classes.dex。跟上面的区别只是构造参数不同,多了一个dex优化之后的路径。
双亲委托机制:
某个类加载器在加载类时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务或者没有父类加载器时,才自己去加载。
8. Java 的回收机制?如何减少oom?
GC判断对象的存活是通过可达性分析算法来进行。
在java中,可作为GC Roots的对象包括:
- 方法区:类静态属性的对象;
- 方法区: 常量的对象;
- 虚拟机栈中的对象;
- 本地方法栈 JNI 中的对象;
Java回收机制如何减少oom的概率?
- 尽可能少的发生内存泄漏;
- 尽可能不在循环内申请内存;
- 尽可能不在调用次数多的函数中申请内存;
9. 什么是ANR?如何避免ANR?
App长时间无响应,就叫ANR。
- 前台服务,超时时间为 20s;
- 后台服务,超时时间为 200s;
- 前台广播,超时时间为 10s;
- 后台广播,超时时间为 60s;
- ContentProvider,超时时间为 10s;
- 输入事件分发,超时时间为 5s;
如何避免ANR发生?
- 主线程避免耗时操作。比如过度复杂的 UI 绘制,网络操作,文件 IO 操作;
- 避免主线程跟工作线程发生锁的竞争,减少系统耗时 Binder 的调用,谨慎使用 sharePreference,注意主线程执行 provider query 操作。