从简历上先看学历专业和工作年线,根据面试者的实际项目着手,问些与专业相关的知识,推荐一个知识点从表面逐渐深挖,观察这个人是否真是参与项目,同时了解对一个知识的理解程度、学习能力和思路是否清晰。

面试问题总结

初级

  • 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

  • 抽象类和接口有什么异同点?考察点:除了规则上的区别外,主要考察设计**的区别

  • 从Android源码里你都看到了哪些设计模式? 写一个你自己常用的单例模式

  • 描述一下线程的状态装换流程?sleep、wait、yield的之间有什么不同?

  • 造成内存泄漏的原因是什么?你总结了哪些造成内存泄漏的case?都如何解决的呢?

  • 软引用、弱引用、强引用有什么不同?

  • 分别描述一下MVC、MVP、MVVM架构?还知道其他的架构么?

  • 描述一下Handler、Looper、MessageQueue、Message之间的关系和作用,系统是如何实现消息驱动的阻塞与唤醒机制呢?

  • 描述一下ClassLoader的双亲委派原则?为什么要采用这种方式?

算法题:

  • 用两个栈 模拟 队列的特性, 只需要写出出队和入队函数

  • 快速排序的实现,时间&空间复杂度

  • 字符串反转算法