2020Android 面经,历时一个半月,斩获 3 个大厂 offer,kotlin 语法大全
泛型。
①泛型擦除的原因和效果,擦除的时机。
②为何会有协变和逆变
③通配符。
④PECS
反射。
注解。
①Source 和 Class、Runtime 注解的区别
②注解如何使用
方法内部的匿名内部类使用方法的局部变量时,为何要使用 final 修饰?
##2、Android
启动模式,以及常见用法。
①举例说明
②taskAffinity,allowTaskReparting 的用法。
③有没有遇到哪些诡异的现象?如何解决的?
Activity 生命周期。
①常见生命周期方法
②A 启动 B 的,然后按 back 键,执行了哪些方法?如果是 A 启动 B 的,然后按 home 键呢?
③onSaveInstance 方法调用时机。
Bitmap 内存优化。
①Bitmap 内存如何计算?如何在不改变图片质量的情况下优化?Bitmap 内存复用(Options.inBitmap)
②超大图加载(BitmapRegionDecoder)
③跨进程传递大图(Bundle#putBinder)
xhdpi 的图片分别显示到 hdpi 和 xxhdpi 的手机上,显示的大小和内存是怎样的?
资源文件加载规则。比如说图片存放在 drawable-hdpi 和 drawable-xxhdpi 下,xhdpi 的手机会加载哪张?如果删除掉 drawable-xxhdpi 下的图片呢?
Android 的进程间通信方式。
①Android 为何要自己搞一个 binder,使用 linux 原有的通信方式不行么?(安全、性能好,方便易用)
②binder 通信的内存大小限制。(1M 和 128k)
③binder 的架构(Application、ServiceManager、系统 Service、binder 驱动),以获取系统服务的过程举例分析。
④Application#onCreate 里面可以使用 binder 服务么(可以)?Application 的 binder 机制是何时启动的(zygote 在 fork 好应用进程后,会给应用启动 binder 机制)?binder 机制启动的几个关键步骤。
⑤binder 线程池默认最大数量(15)?
⑥binder 和 AIDL。
⑦oneway。
谈谈你对 Android 中 Context 的理解?四大组件里面的 Context 都来源于哪里。
Application 启动流程。
①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 端会是什么效果?
评论