Android大厂面试题
本文于 1290 天之前发表,文中内容可能已经过时。
京1:
- butterknife原理,R2文件?
- Handler异步消息,同步屏障?同步消息?looper.perpare()何时创建?message.obtain()?
- Vsync,垂直同步信号?
- UI滑动渲染优化?
- 内存泄漏?leakcarray原理?
- oom的条件?
- 开辟多个线程导致oom?
- bitmap的存储形式在系统中的存储?存储在哪?
- 布局优化?LinearLayout draw几次?
- IPC机制,binder机制的理解?为什么使用线程池?(一个服务端对多个客户端)
- flutter渲染机制?flutter的树?
京2:
- 移动端自动化开发
- EventBus原理?优点?缺点?切换线程的方式
- ViewModel+LiveData
- 音箱和手机的差异化?android版本,厂商room,客户群体不同
- apk瘦身?
- 启动优化的时间检测?启动器优化方式
- 组件化?如何设计一个组件
小米1:
Activity的生命周期?activityA在下拉框的时候的生命周期?(不变化)onDestory有立即执行吗?
activity启动后在最后一帧绘制在哪?
android启动打点?AOP?启动优化?开启一个线程?AMS,反射?如何对函数进行插桩?
ASM对.class文件修改,生成.dex文件前搞定,在.class和.dex文件转化中间作修改
leakcanary原理?自己如何做内存泄漏器?各个函数之间的耗时情况?
亮点?有向无环图?contentprovider的初始化?
Handler内存泄漏的原因?怎么处理?handler持有Activity强引用,messageQueue持有handler的强引用
view的绘制?dispatchDraw()和onDraw()的执行顺序?
如果绘制一个圆,保证这个圆的中间不被绘制?cavas进行裁剪,画布上就缺一块,则子view绘制不上
view的事件分发?如果dispatch返回true,会拦截到onInterrcept和onTouch
bitmap的优化?bitmap的大小的计算?2x的大小图片放大1x的图片中,bitmap会变大
线程池?阻塞的处理?exectue和submit的区别,如何捕获线程池错误(ThreadFactory)
生产者消费者通知?
线程同步?加锁,Sychronized,ReentrantLock
Hashmap,hash值计算?为什么这么计算?arraymap和hashmap?
数组和链表的区别?
https加密形式
小米2面:
- 启动优化?bitmap预加载?如何更快加载图片?还有别的什么优化?
- Glide的into方法是怎么执行的,如何显示到imageView中的?
- Glide的加载流程?fragment如何绑定?imageView正在加载,再次加载另一个图片,具体会执行什么?
- Android启动流程?Activity启动流程?
- ViewModel?LiveData的理解 ?mvvm的理解?
- 网络请求异步框架?线程池?
- 链表反转(逆置)
Yy1:
okhttp io的方式?okio,java中io的方式?责任链模式?连接池复用?
Glide的缓存结构?为什么要用activieResource?
EventBus的简述?字节码=.class文件,注解方式?
RecyclerView缓存形式?
MotionLayout的内部原理
Mvvm需要注意什么?内存泄漏?持有view的引用
leakCanary原理,gc间隔=5s,在idleHandler中使用延迟5s的操作,大概是主线程闲置后在等待5s中进行验证后执行gc?Fragment怎么监听内存泄漏的?fragmentManager.registerFragmentLifecycleCallbacks中检测
apk瘦身?so库合并
先把所有要打包的库编译生成静态库,然后使用如下命令把它们合并成一个*.so:
1
gcc -shared -o c.so -Wl,--whole-archive a.a b.a -Wl,--no-whole-archive
启动优化?其他的优化框架,
线程,进程,协程?时间分片?协程是怎么做的?那个io?
handler机制?子线程中如何使用handler?handler中的Looper.prepareMain和Looper.prepare的区别?主线程永不退出,死循环?同步屏障?
Yy2:
- 音频协议?
- 协程,进程,线程的区别?
- mvvm?组件化?
- websocket协议和http协议的区别?
- butterknife原理?注解的三种形式?
- 动态代理的方式?2中?动态代理的关联?
- 类型擦出?范性?
- 类加载过程?类什么时候初始化?静态类的初始化过程?
- 编译器优化?
- GCroot?栈溢出?(递归)
- java异常有几种?可以捕获oom异常吗?可以,在bitmap中如果触发oom可以进行try catch
- 动画?差值器,估值器?
- 二叉树之字形打印
581:
组件化ARouter框架原理?
编译时注解生成类文件,存储全局路由管理,通过反射创建对象。
如果是Activity,通过Intent进行跳转传参,Fragment,BroadCastReceiver,Service等都是通过反射创建对象的
LiveData,viewModel机制,如何绑定生命周期,viewModel中持久化是怎么做的,LiveData中的粘性事件
粘性事件是通过版本号控制的,当进入active状态后,会比对version版本,进行订阅者的通知
Activity的启动过程
RecyclerView机制
Handler机制
java中锁的机制,volatile的可见性怎么理解?Synchronized怎么理解?自旋锁怎么理解?ReentrantLock怎么理解?
kotlin中的协程?
kotlin中协程通过挂起函数来实现协程的处理,使用CPS变换,suspend
每个挂起函数都会被编译为Continuation ,将函数体编译为状态机
ASM
flutter理解?fish-redux的分层?数据流向?
view—–>action—->effect—–>reducer—–>store—–>view
58 2:
- 项目相关。。。
36012:
Fragment切换,add和replace,复用的问题?
Fragment可见性准确保证?
Fragment构造传参的劣势?
在Activity异常退出重建Fragment的时候,会执行Fragment的无参构造方法,如果通过setArguments进行传递参数,Activity在构造Fragment时会通过反射午餐构造实力
内联优化?
aapt1和aapt2的区别
aapt1进行全量编译
aapt2进行差量编译
垃圾加载的GC root
LRU算法怎么实现的
java中的容器有哪些?线程安全的有哪些?
Vector 与ArrayList几乎相同,但是线程安全
Stack 继承自Vector
CopyOnWriteArrayList 写实拷贝
ConcurrentLinkedQueue 基础链表同步队列
LinkedBlockingQueue
HashTable
ConcurrentHashMap
58 3:
- 对排序?
- http请求过程,https的过程
- 数组和链表的区别
- 栈中调用方法的过程
- LRU算法的实现
美团 1:
携程 1:
快手 1:
知乎 1:
- Activity的生命后期
- onConfigurationChanged?其他回掉时机?onSaveInstanceState回调?分屏?
- ARouter?
- Fragment的生命周期?onCreateView可以返回null吗?
- fragment怎么初始化?fragment为什么不推荐携带参数?androidx中提供fragment传参?Fragment重建?
- viewModel持久化?viewmodel重建?可以存储Bundle?
- java内存模型?volatile原理?可见性,非原子性,禁止指令重排
- 组件化开发?
- 二叉树镜像?
知乎 2:
- mvvm的理解
- 离开公司的原因
- 未来的方向,2c方向,架构方向
- 架构师主要负责,技术选型
- 为什么选择知乎?
- 知乎界面的分析+选型+排期
- 你的优势,为什么给你发offer?
- android启动器?线程池选型?
- 大文件查找方案?
- 整数的逆置,头和尾是0的情况排除