从简历上先看学历专业和工作年线,根据面试者的实际项目着手,问些与专业相关的知识,推荐一个知识点从表面逐渐深挖,观察这个人是否真是参与项目,同时了解对一个知识的理解程度、学习能力和思路是否清晰。
面试问题总结
-
View的Touch事件分发如何?
-
基础:ViewGroup和View的事件分发
-
深入:系统如何将事件分发到ViewGroup?
-
View的绘制流程
-
Android的消息驱动机制
-
初级:Handler、MessageQueue、Looper、Message关系,用法、内存泄露case&解决、子线程创建Looper
-
中级:Java层源码分析、ThreadLocal作用、高级用法(IdleQueue、BlockCanary)
-
高级:Native层如何实现的、IO多路复用epoll
-
-
描述 AsyncTask 的实现原理以及使用的注意事项
-
Activity 的四种 Launch Mode
-
Service 的两种启动方式,不同点
-
简述线程状态转换过程, InterrupttedException 触发流程。 描述几种线程池的用法。Sleep和wait区别
-
设计模式介绍:比如适配器模式、工厂模式、单例模式,手写单例模式代码(静态内部类>懒汉>饿汉)。
-
可以结合Android源码说设计模式
-
单例注意线程安全、volatile、代码风格
-
网络方面:Http中GET和POST区别、DNS解析作用
-
简述 Java GC 机制。引申问题: (要点: Root Object/标记清除)
-
软引用、弱引用、强引用的区别?
-
内部类与静态内部类的区别? 要点:内部类隐藏持有外部类。 静态内部类没有
-
与引用计数的区别. 要点: 循环引用
-
架构方面:MVC、MVP、MVVM介绍,优缺点
-
架构的试用场合是什么
-
Model层什么作用?如果有多个数据来源如何设计?
-
还了解过其他的架构么?
-
HTTPS为什么安全?如果想获取通信的内容,该怎么做?
-
内存 要点: 谁持有谁释放等、MAT工具使用、常见内存泄露的badcase及解决方案
-
网络 要点: 请求方式的选择、缓存、包体积压缩、图片格式选择、网络协议(Socket 或 WebSocket 或 Http2 加分) 等
-
电量 要点: 降低 IO、设备访问频率等
-
ANR、卡顿 要点:trace日志查看
主要看面试者是否真有实际解决经验、常用工具、总结的经验和方法论
-
为什么会有线程不安全的现象?如何实现线程安全?常见的线程安全数据结构有哪些?锁的分类有哪些?
-
内存模型
-
HashMap、HashTable、Vector、ArrayList、ConcurrentHashMap(*)
-
重入锁、分段锁、公平/非公平、读写锁 等。 对应到代码中用过哪些?
-
volatile使用场景、作用
-
Context原理以及不同的种类间的区别?画UML图表述之间的关系
-
Binder的优势?
为什么性能好? 要点:共享内存、一次拷贝
安全 要点:如何进行权限控制?
加分项:以一个具体的Service服务来讲Binder
-
简析一两个开源项目
看面试者因为什么学习开源代码(技术兴趣?解决问题?),学习的深度如何,最终有什么产出(转化为项目应用?做了二次优化?)
-
一个SDK 的设计和实现
要点:问题分析&拆解、模块拆分、扩展性、易用性、架构涉及
-
简述 ClassLoader 双亲委派机制,为什么这么做?
-
简述 AMS 原理。
-
要点: 系统对 Activity 和 Service 的管理过程,比如以Activity启动流程为例进行说明
-
APK 编译构建过程 & Gradle 命令 & Gradle 插件实现方式
-
插件化原理
-
实现插件化需要解决的技术难点:类加载、四大组件生命周期、资源隔离、构建环境
-
Hook技术
-
重构经验 & 性能调优经验
面试者主导的项目重构或者一个完整的性能优化经历(发现问题&解决方案、如何分步执行、推动上线、实现解决问题的闭环)
-
UnitTest
-
一个APP 的分层架构
另一种纬度问题分类
-
View的touch事件分发
-
初级:ViewGroup/View的分发流程,三个关键函数
-
中级:如果遇到事件冲突该如何解决?改查方法论
-
高级:事件是如何分发到ViewGroup上的? Activity - >window ->decorview - >Viewgroup ,那谁分发给Activity的?
-
-
View的绘制流程
-
初级:3个关键函数
-
中高级:更加细致的从源码角度说3个函数分被是如何被触发的
-
-
抽象类和接口有什么异同点?考察点:除了规则上的区别外,主要考察设计**的区别
-
从Android源码里你都看到了哪些设计模式? 写一个你自己常用的单例模式
-
描述一下线程的状态装换流程?sleep、wait、yield的之间有什么不同?
-
造成内存泄漏的原因是什么?你总结了哪些造成内存泄漏的case?都如何解决的呢?
-
软引用、弱引用、强引用有什么不同?
-
分别描述一下MVC、MVP、MVVM架构?还知道其他的架构么?
-
描述一下Handler、Looper、MessageQueue、Message之间的关系和作用,系统是如何实现消息驱动的阻塞与唤醒机制呢?
-
描述一下ClassLoader的双亲委派原则?为什么要采用这种方式?
-
用两个栈 模拟 队列的特性, 只需要写出出队和入队函数
-
快速排序的实现,时间&空间复杂度
-
字符串反转算法