2020Android 面经,历时一个半月,斩获 3 个大厂 offer,移动端开发工程师面试题
①AMS 是如何确认 Application 启动完成的?关键条件是什么(zygote 返给 AMS 的 pid;应用的 ActivityThread#main 方法中会向 AMS 上报 Application 的 binder 对象)?
②Application#constructor、Application#onCreate、Application#attach 他们的执行顺序(132)。Activity 和 Service 呢?
startActivity 的具体过程。
Activity#setContentView 的具体过程。
①PhoneWindow 是何时创建的,它的作用是什么?
②setContentView 中传递的资源文件是如何变成 View 对象的?
③布局文件对应的 View 对象是添加到哪里的?
④Activity 的布局是何时显示出来的?
⑤ViewRootImpl 是何时初始化的?它的作用是什么?
⑥Choreography 了解么?作用是什么?
Surface 的作用是什么?它是何时初始化的?View 绘制的数据是如何显示到屏幕上的?
Handler 机制:
①应用层,消息的发送、接收、获取和处理;消息是如何存储的?延时消息一定准时么?是如何保证延时时间的?Handler#dispatchMessage 细节,如何使用?
②Handler 的 Framework 层。Looper#loop 方法为何不会导致 ANR?nativePollOnce 细节。eventfd 和 epoll 机制了解么?
③IdleHandler 了解么?合适调用?如何使用?靠谱么?
④handler 里面消息有几种?普通消息、同步消息、消息屏障。如何使用?如何区分普通消息和异步消息?
⑤如何实现给 Handler 发送一个 Runnable,又不通过 Handler#post(Runnable run)这个 API?(Message#obj 属性,或者通过反射设置 Message#callback 属性)
⑥Message#obtain 实现细节了解么?为何要池化?最大限制容量是多少?
ThreadLocalMap 的实现。
View 绘制流程
①onMeasure、onLayout、onDraw
②MeasureSpec 为何如此设计?
③子 View 的 LayoutParams 来源。ViewGroup#addView(view)这种添加 view 的方式,没有给子 View 设置 LayoutParams,那么 LayoutParams 是谁设置的?
④onMeasure 和 onLayout 为何会执行两次或多次?
⑤View#draw 方法细节。
⑥View 绘制这一块遇到过什么问题么?如何解决的。
自定义 View 有哪几种方式?注意事项。你对自定义属性如何理解?
事件分发。滑动冲突如何解决,具体在哪个方法里面解决?如何判断滑动方向?
动画
Apk 打包流程。R 文件最终会生成什么文件?aapt 的作用是什么?
LocalBroadcastReceiver,为何比 BroadCastReceiver 速度快,LocalBroadcastReceiver 的实现。
RecyclerView 的缓存。RecyclerView 的优势是哪些?都用它做过什么功能?
讲下 leakCanary 原理。为什么不用虚引用?引用队列里面存的是什么?内存数据是如何 dump 出来的?
讲下 OkHttp 的实现。拦截器的顺序,网络拦截器和普通拦截器有什么区别?它的线程池是怎样的?如何管理的?
glide 的三级缓存如何做的?
rxjava 的原理。rxjava 的线程切换如何实现的?map 和 flatmap 操作符区别;zip 和 merge 操作符区别。
ArrayMap 和 SparseArray 的作用和实现细节。
组件化和模块化的区别。
mvp、mvvm。
jetpack 组件。
gradle 中 task 的生命周期。
插件化原理。
热修复原理。
##3、Android 性能优化
启动速度优化。冷启动、温启动、热启动了解么。
内存优化
卡顿优化
网络优化
数据库优化
内存泄漏优化
包体积优化
##4、http 相关
描述一个完整的网络请求流程。
TCP 和 UDP 区别,三次握手与四次挥手的细节;为何建立链接需要三次,断开链接却需要四次。
http 和 https 区别。https 的链接过程?
断线续传如何实现。大图分段上传如何实现。关键步骤
分段下载如何实现。
请求重试机制如何实现。
##5、设计模式
你熟悉哪些设计模式?请举例说明。为何选用这个设计模式。
策略模式和桥接模式的区别
##6、kotlin
说一下 kotlin 的优缺点。let 和 with 的区别
扩展函数
kotlin 的 lateinit 和 by lazy 的区别
构造函数有哪几种
协程
##7、flutter
flutter 的 isolate
flutter 的优势和劣势
flutter 的 channel 通信方式有哪几种?
flutter 的包体积优化
flutter 中 State 的生命周期,didUpdateWidget 方法何时调用
##8、项目相关
选一个你最熟悉的项目讲解下。
讲一下你的技术栈
你最自豪的项目或者片段
你最擅长哪些部分
你的上份工作经历中,最大的收获是什么?
你的职业规划
1、滴滴
一面
1、View 绘制流程。onMeasure、onLayout、onDraw。
2、竖向的 TextView 如何实现。TextView 文字描边效果如何实现。
3、事件分发。冲突解决。
4、动画
5、RecyclerView 的特点和缓存
6、SparseArray 和 ArrayMap。具体实现原理和特性
7、说一下 kotlin 的优缺点。let 和 with 的区别
8、接口和抽象类的区别,接口中可以有属性
么?
9、用过哪些设计模式?策略模式和桥接模式的区别
10、多线程如何实现?有哪些方式?
11、线程池的参数
12、你如何自己实现一个 LRUCache?Android 里面的 LRUCache 是如何实现的?
13、synchronized 和 volatile 的区别?为何不用 volatile 替代 synchronized?类锁和对象锁互斥么?
14、gcroot 的类型
15、jvm 的运行时数据结构。栈帧中会有什么异常?方法区里面存放的是什么数据?
16、动态代理的实现。
17、Gradle 的实现,gradle 中 task 的生命周期。
18、Aop、AspectJ、ASM 了解么
19、组件化和模块化的区别。ARouter 的缺点。
20、MVP、MVVM 的优缺点,jetpack 中的组件
21、okhttp 源码。
22、glide 缓存
23、你对 flutter 的理解
二面
1、react 的单向数据流
2、redux 的状态管理,如何实现的?关键角色有哪些?
3、flutter 的 channel 通信有哪几种?你用的哪种?插件你如何实现的?
4、flutter 的包体积优化
5、自定义 View 的关键步骤,注意事项,你的理解
6、MeasureSpec 讲一下
7、包体积优化
8、混淆的步骤和原理
9、module 间的资源文件 merge 后,生成过多的 R 文件,处理过么?如何处理?
10、Bitmap 内存大小,注意事项,如何优化
11、启动速度优化
12、glide 中对 Bitmap 做了哪些操作?三级缓存?为何在有了内存缓存后,还要持有 ActivityRef 这个呢?
13、gradle 声明周期,task,插件
14、注解:Source 和 Class、Runtime 注解的区别
15、卡顿优化
16、内存泄漏检测及优化
17、RecyclerView 的缓存,局部刷新用过么?
18、List 的滑动卡顿如何优化
19、Activity 中的 Window 的初始化和显示过程
20、Application 中可以显示 Dialog 么?为什么?
21、泛型擦除,为何会有擦除?擦除的时机。通配符。
下面这段代码有问题么?有什么问题?为何会有这个问题?
List<? extends Object> list = new ArrayList<>();
list.add(123);
Object obj = list.get(0);
22、synchronized 的同步原语
23、锁的几种状态
24、Android 热修复原理,tinker 的 patch 文件如何生成,patch 文件是全部加载 dex 文件首部么?
25、插件化原理
26、两个用单链表表示的大数相加,求他们的和。单链表元素的值为 0~9。
三面
1、选一个你的项目讲一下
2、技术选型是如何做的
3、优化内存
4、上传的重试机制
5、OOM 和内存泄漏
6、包体积优化
7、你最擅长的点
8、你的职业规划
##2、新浪
一面
1、封装的 Adapter 讲解。
2、自定义 View:支持换行的尾部标签的实现。
3、IdleHandler 调用时机
4、Bitmap 内存计算规则
5、glide 默认 Bitmap 的 Config 配置是 ARGB_8888 么?
6、下面这段代码有什么异常?如何解决?
private final ArrayMap<String, Boolean> mBlackFirstFrame = new ArrayMap<>();
public boolean getFlag(String key) {
return mBlackFirstFrame.get(key);
}
7、下面这段代码会有什么问题?如何解决?
public static class Person implements Serializable {
private One one;
private Two two;
}
public static class One implements Serializable {
}
public static class Two {
}
8、Java 为何会有线程安全问题?如何解决?
二面
1、vue 的 binding 原理
2、flutter 中 isolate 的原理。
3、promise 的原理
4、讲一下你的技术栈
5、讲下 OOM 原理
6、讲下 ANR
7、linux 中进程间通信的方式,Android 为何会自己搞一个?
8、Java 中进程间共享的数据是放在 JVM 那个分区的?Java 中主进程和子进程间的通信,通过哪块内存区域?
9、Facebook 的 litho 了解过么?flexbox 用过么?
10、热修复用的什么方案?
11、代码质量如何控制?
12、app 质量如何控制?
13、你做过的最烂的一件事是什么?最好、最自豪的一件呢?
##3、京东物流
一面
1、模块化,组件化,开发中要点有哪些。组件间如何去除强依赖。
2、Android11 有没有适配
3、flutter 中 State 的生命周期,didUpdateWidget 方法何时调用
4、包体积如何优化
二面
1、上家公司期间你的技术亮点,期间遇到什么问题,如何解决的,原理深挖。
2、View 的绘制流程。MeasureSpec,关键方法,
3、LRU 如何实现的?LinkedHashMap 如何实现的?LinkedHashMap 是否线程安全?如何实现线程安全?有序还是无序?
4、ThreadLocal 干嘛的?用法和原理。
5、HashMap 讲一下,数据结构、hash 过程、扩容、加载因子为何是 0.75 等。
6、Handler 讲一下。Message#what 的不同值,会影响 Message 在 MessageQueue 中的顺序么?
7、讲下 Java 的双亲委派
8、插件化和热更新原理
9、讲一下锁,synchronized 和 Lock。CAS 原理
10、事件分发
三面
1、对 vue 的掌握程度
2、现有项目情况
3、包体积优化细节
4、画现有项目的架构图
5、后端交互过程中有遇到什么难以解决的问题么?如何解决的。
6、讲下你觉得最好或者最自豪的项目
四面
1、讲下 hashmap;链表转红黑树的限制为何是 8;红黑树的时间复杂度;红黑树转链表的限制为何是 6;current hashmap 在所有情况下都是线程安全的吗?hashtable 呢?
2、synchronized 实现。非静态方法 A 和 B 在同一个类中,方法 A 用 synchronized 修饰,当 A 方法因为多线程请求有线程阻塞在对象锁上的时候,B 方法的访问受不受影响?
3、既然泛型有编译期类型擦除,那么运行时无法获取到具体类型;而反射能在运行时获取到 Class 的类型;它们一个获取不到,一个可以获取到,这不就是矛盾么?请解释下细节。
4、在同一个手机上,如果把 drawable-xxhdpi 下的图片移动到 drawable-xhdpi 下,图片内存是如何变的,解释原理。如果在 drawable-hdpi、drawable-xxhdpi 下放置了图片,但是手机是 xhdpi 的,会优先加载哪个,加载优先级是怎样的?如果是 400_800,1080_1920 这种呢,会如何查找?xhdpi 和 400*800 同时存在时,会如何查找?布局文件呢?
5、图片内存优化;
6、Handler 机制。MessageQueue 中的 Message 是如何排列的?Msg 的 runnable 对象可以外部设置么,比如说不用 Handler#post 系列方法(反射可以实现);
7、application 中持有静态的用户信息,有何缺点?如何改进?
8、mvp 和 mvvm,jetpack
一面
1、组件化
2、mvp 优缺点,mvvm
3、kotlin
4、单例的几种实现方式:DCL、enum,静态内部类。还有饿汉式。懒汉式的使用场景:占用内存大、延迟初始化
5、jvm:运行时数据分区;类加载过程;GCRoot,垃圾回收算法。
6、hashmap。hash 冲突时给链表插入数据,1.7 头插法,1.8 尾插法。
7、ArrayMap 和 SparseArray 的区别,实现。
8、泛型:为何会有协变和逆变,PECS 规则。
9、kotlin 泛型:out 和 in.
10、Handler。Looper.loop( )为何不会阻塞进程。
11、自定义 View 的几种方式。onMeasure、onLayout、onDraw 方法都何时需要重写。自定义属性的作用。
12、事件分发,多点触碰处理,是在 onTouchEvent 方法里面。
13、网络优化,网络监控。
14、网络分层架构,https 的连接过程,tcp 和 udp 的区别。
15、blog 相关。
16、滑动窗口的最大值。
二面
1、滑动冲突如何解决?有几种方式?具体从哪个事件开始拦截?在哪里拦截?比如双层 ViewPager 嵌套的滑动冲突如何解决。
2、事件分发的具体流程。
3、Activity#setContentView 中的 xml 文件是如何转化成 View 并显示到 Activity 中的。
①PhoneWindow 是在哪里初始化的?
②LayoutInflater 是如何把 xml 布局文件转换成 View 对象的(反射)?View 树如何生成的?怎么优化?
③为什么会有 R 文件这个映射表?直接使用资源的路径不好么?
④Android 项目中都包含哪些资源?apk 打包流程。apk 解压后都包含哪些资源?R 文件打包后生成的文件是哪种?
⑤dex 文件结构了解过么?为何会有 65535 的限制?mutildex 技术了解么?这项技术的目的是什么?
⑥Window 和 Activity 的对应关系。除了 Activity 还有别的方式显示 Window 出来么?
4、绘制相关:
①requestLayout 调用后,都会调用哪些方法?
②onMeasure、onLayout、onDraw 这三个方法中,哪个最耗时?onMeasure 和 onLayout 呢?
③Choreography 的作用。它的上游和下游各自是哪个。Choreography 发布了订阅消息,同类型的 Callback 还有哪些?这些 Callback 之间的优先级如何?vsync 机制。
④Surface 对象了解么?作用,何时初始化,怎么使用的。
⑤一个 Button 的点击事件中,调用 requestLayout,接下来哪些方法会被调用?
⑥Surface 和 Window 的关系
⑦SurfaceView 的实现
⑧View#draw()方法细节
⑨绘制的数据是如何提交到远端的 SurfaceFlinger
⑩GPU 和 surfaceFlinger 之间的设计思想是什么?surfaceFlinger 具体作用是什么?它对数据做了哪些操作?
?硬件加速了解么?GPU 如何高效绘制?
5、ContentProvider 具体实现。
6、binderService 方法中的回调具体运行在哪个线程?binder 线程池最大线程数是多少?自定义的 Callback 远程调用,运行在哪个线程?为何不是主线程,如果运行在主线程会有哪些问题?
7、hdpi 和 xxhdpi 的手机,分别加载 xhdpi 下的图片,会缩放图片么?如果会缩放,是如何缩放的,像素点是如何补全或者减少的?图片在内存中的大小会如何变化?
8、操作系统:
①讲一下用户态和内核态
②为何会有用户态和内核态划分
9、数据结构:
①二叉树用的多么?哪里用过?
②二叉搜索树、AVL 树,红黑树
③二叉树的使用举例。
④链表和二叉树的区别,优劣势
10、jetpack 组件库使用过么?讲下具体组件
11、函数式编程如何理解?
12、t1、t2、t3 三个线程,如何让三个线程按照顺序依次打印 1-100。手写。
三面
1、悬浮窗如何实现
2、通知的类别
3、为何需要进程保活?如何做?
4、进程优先级
5、Android 为何会使用 binder 来进行进程间通信。
6、oneway 和非 oneway 了解么?举例说明
7、binder 线程池的最大线程个数;binder 线程池中如果满了,对待新来的任务,会如何处理?此时 client 端会是什么效果?
8、ANR 的 log 中关键字是什么?
9、你认为优秀的工作流程是怎样的?
10、讲下你项目的技术栈。
11、你认为好的 app 质量标准,产品标准。
##5、百度
一面
1、js 调用原生有几种方式?
2、大图加载优化,原理。
3、http 消息体讲一下。消息首行的方法有哪几种?
4、http post 请求上传大文件,如何实现?分块上传呢?用到的关键 Header 有哪些?
5、Activity 的 onSaveInstance 方法何时调用?它跟 onPause、onStop 的调用顺序如何?
6、Activity A 启动 Activity B,调用顺序。最后 Activity A 的 onStop 一定会调用么?
7、RecyclerView 的缓存。
8、kotlin 的协程,构造函数。
9、进程间有哪几种通信方式、binder 安全原理、讲下 aidl 内容。
10、binder 是 cs 架构,Server 端的 binder 都是运行在同一个线程里面么?
11、讲下 GC root 的类型。
12、讲下 Handler。
13、讲下你做过的首页优化。
14、讲下 leakCanary 原理,为什么不用虚引用?引用队列里面存的是什么?
15、求单链表的倒数第 n 个结点,时间复杂度为 O(1)的解法。bad case 是哪种?
16、遍历目录及其子目录,使用非递归的方式。
二面
1、讲下 flutter 的项目
2、kotlin 的扩展,属性是否可以扩展,是否可以扩展跟现有方法签名相同的方法
3、讲一下 Activity 的 TaskRecord,也就是四种启动模式。
4、方法内部的匿名内部类,比如说给 View 设置的 OnClickListener,它里面相关调用外部方法的形参,必须使用 final 修饰这个形参,为何?
5、Android 里面进程间通信方式,ContentProvider 可以用 file 实现么?
6、linux 下常见的进程间通信方式,Android 为何自己搞一个 Binder,有何优势?
7、本地广播为何效率高?
8、讲下 synchronized 和 volatile;读写锁和 ReentrantLock,synchronized 和读写锁的区别。
9、布局优化
##6、vipkid
一面
1、项目中有哪些亮点?自定义 View
①获取 TextView 的行数时,StaticLayout 原理
②MotionEvent#offsetLocation 事件转发。
2、讲下 onMeasure 方法:
①如何测量
②测量模式
③入参为什么是 int 类型?
④为什么会多次调用 onMeasure 和 onLayout 方法?
3、讲下事件传递:
①总体流程
②DOWN 事件拦截后,后续事件如何处理?
③dispatchTouchEvent 方法返回 true 后事件如何处理?
4、ActivityA 启动了 ActivityB 后,两个 Activity 的生命周期是怎样的?
5、线程、进程的区别
6、多线程为何不安全
7、synchronized 和 volatile 区别
8、Lock 的实现,以及与 synchronized 的区别
9、GCRoot,举例说明。比如说 Activity 和它的匿名内部类 Handler,分析下引用链,对应的 gcroot 是哪个?
10、图片内存的计算。
①在不影响图片质量的前提下,如何减少内存?
②图片显示不全、变形怎么处理?
11、http 和 https:
①它们的区别:https 多了 tls 层。对称加密和非对称加密。
②具体验证的过程是怎样的?
12、你擅长的领域:
①Handler
②Activity 启动流程:AMS、zygote、ApplicationThread 之间交互;oneway 特性(server 端不阻塞和 client 端串行化),非 oneway 的情况有哪些?
③postDelay(1s)是如何保证 1s 时间执行的?
④Application 启动流程
⑤ContentProvider 启动流程
13、使用 Application#onTrimMemory 优化
14、使用 ActivityLifecycleCallbacks 做了哪些事情?
15、zxing 优化
16、如何提高线上代码质量?
17、你的不足?
18、你的期望
二面
1、直播弹幕如何实现?
2、离职原因,问的很细。
3、以前的 app 的技术深度,知识沉淀,如何成长等
4、之前的不足,如何避免;最自豪的项目或者片段。
5、职业规划
##7、少年得到
一面
1、讲一下项目
2、成员变量和局部变量的区别。为何成员变量需要 jvm 在对象初始话过程中赋默认值?
3、讲下 equals 和 hashcode,他们为何必须一起重写?
4、字符串的 “+” 和 append 操作的区别。避免创建多个 String 对象。
5、泛型和泛型擦除。kotlin 真泛型的实现;泛型中 T 和?的区别,List<?>和 List 有什么区别;泛型里的 super 和 extends 区别;泛型为何会有擦除;擦除的时机;泛型的编译器类型检查。
6、HashMap:数据结构(数组加链表(或者红黑树)),为何这么设计;数组和链表的特性;元素添加的过程;扩容过程中为何不整体复制;链表为什么要转红黑树?
7、HashMap 的替代方案,ArrayMap 和 SparseArray。
8、Parcelable 和 Serializable 本质区别,不要说用法,说原理。
9、Activity 和 Fragment 的生命周期;Fragment#onHiddenChanged 是生命周期方法么?如何触发?
10、Activity 和 Fragment 的通信方式;系统为何会设计 Fragment#setArgument 方法。
11、View 绘制流程;requestLayout 和 invalidate 区别;invalidate 每次都会触发 onDraw 么?View#onLayout 每次会触发么?
评论