计算机 络
Java基础
Android
数据结构与算法
Framework
性能优化
开源库源码/原理
Kotlin
Flutter
C/C++/音视频
不过Android是真的内卷啊,内容是真多,配合知识体系还丢了点面试题作为参考,并且也把自己学习过程中的大佬笔记放了上来,说不定对大家也有帮助呢?
以上基本涵盖Android整个知识体系。
目前的Android领域方向主要有:
应用开发
IoT
Framework
性能优化
游戏
音视频
跨端
逆向安全
后续内容巨量干货预警!!!建议收藏的同时不要忘记点赞评论支持一下~
Android知识体系
后面就是面试题的整理,以及复习笔记相关内容,有需要的朋友们也可以直接私信我【面试】我发你领取地址
计算机 络
各层结构和功能,以及都有哪些协议
TCP三次握手和四次挥手
TCP,UDP协议的区别
在浏览器中输入url地址 >> 显示主页的过程
状态码概括
HTTP短连接和长连接
Cookie的作用是什么?和Session有什么区别
URI和URL有什么区别
HTTP和HTTPS的区别
Java基础
面试过程中,BATJ这些大公司都要求有扎实的Java语言基础,掌握虚拟机底层原理,这一个部分就是Android开发中最常用的Java相关知识。
重点:序列化、注解、泛型、反射、多线程、动态代理、并发、类加载机制、Android虚拟机原理剖析、dex运行机制、Android内存
面试题如下:
注解
注解的分类和底层实现原理
自定义注解
泛型
你可以把List传递给一个接受List参数的方法吗?
Array中可以用泛型吗?
Java中List和原始类型List之间的区别?
反射
什么是反射
反射机制的相关类
反射中如何获取Class类的实例
如何获取一个类的属性对象 & 构造器对象 & 方法对象
Class.getField和getDeclaredField的区别,getDeclaredMethod和getMethod的区别
反射机制的优缺点
Jvm
Jvm的内存模型,每个里面都保存的什么
类加载机制的几个阶段加载、验证、准备、解析、初始化、使用、卸载
对象实例化时的顺序
类加载器,双亲委派及其优势
垃圾回收机制
多线程
Java中创建线程的方式,Callable,Runnable,Future,FutureTask
线程的几种状态
谈谈线程死锁,如何有效的避免线程死锁?
如何实现多线程中的同步
synchronized和Lock的使用、区别,原理;
volatile,synchronized和volatile的区别?为何不用volatile替代synchronized?
锁的分类,锁的几种状态,CAS原理
为什么会有线程安全?如何保证线程安全
sleep()与wait()区别,run和start的区别,notify和notifyall区别,锁池,等待池
Java多线程通信
为什么Java用线程池
Java中的线程池参数,共有几种
复习内容主要是这个:
Android知识
这部分主要是Android基础以及UI,还有动画、事件分发机制、嵌套滑动机制这些知识点,近几年热门的Jetpack现在基本是属于必问的问题了,Jetpack Compose个人建议先了解,如果有需要可以随时深入研究,目前大部分应该是属于加分项(反正几乎没有被问到,问到的基本是试探对新技术的敏感性),实际面试公司不同略有差异。
重点是原理(手动狗头)
Activity
Activity的启动流程
onSaveInstanceState(),onRestoreInstanceState的掉用时机
activity的启动模式和使用场景
Activity A跳转Activity B,再按返回键,生命周期执行的顺序
横竖屏切换,按home键,按返回键,锁屏与解锁屏幕,跳转透明Activity界面,启动一个 Theme 为 Dialog 的 Activity,弹出Dialog时Activity的生命周期
onStart 和 onResume、onPause 和 onStop 的区别
Activity之间传递数据的方式Intent是否有大小限制,如果传递的数据量偏大,有哪些方案
Activity的onNewIntent()方法什么时候会执行
显示启动和隐式启动
scheme使用场景,协议格式,如何使用
ANR 的四种场景
onCreate和onRestoreInstance方法中恢复数据时的区别
activty间传递数据的方式
跨App启动Activity的方式,注意事项
Activity任务栈是什么
有哪些Activity常用的标记位Flags
Activity的数据是怎么保存的,进程被Kill后,保存的数据怎么恢复的
Service
service 的生命周期,两种启动方式的区别
Service启动流程
Service与Activity怎么实现通信
IntentService是什么,IntentService原理,应用场景及其与Service的区别
Service 的 onStartCommand 方法有几种返回值?各代表什么意思?
bindService和startService混合使用的生命周期以及怎么关闭
BroadcastReceiver
广播的分类和使用场景
广播的两种注册方式的区别
广播发送和接收的原理
本地广播和全局广播的区别
ContentProvider
什么是ContentProvider及其使用
ContentProvider,ContentResolver,ContentObserver之间的关系
ContentProvider的实现原理
ContentProvider的优点
Uri 是什么
View绘制
View绘制流程
MeasureSpec是什么
子View创建MeasureSpec创建规则是什么
自定义Viewwrap_content不起作用的原因
在Activity中获取某个View的宽高有几种方法
为什么onCreate获取不到View的宽高
View#post与Handler#post的区别
Android绘制和屏幕刷新机制原理
Choreography原理
什么是双缓冲
为什么使用SurfaceView
什么是SurfaceView
View和SurfaceView的区别
SurfaceView为什么可以直接子线程绘制
SurfaceView、TextureView、SurfaceTexture、GLSurfaceView
getWidth()方法和getMeasureWidth()区别
invalidate() 和 postInvalidate() 的区别
Requestlayout,onlayout,onDraw,DrawChild区别与联系
LinearLayout、FrameLayout 和 RelativeLayout 哪个效率高
LinearLayout的绘制流程
自定义 View 的流程和注意事项
自定义View如何考虑机型适配
自定义控件优化方案
invalidate怎么局部刷新
View加载流程(setContentView)
View事件分发
View事件分发机制
view的onTouchEvent,OnClickListerner和OnTouchListener的onTouch方法 三者优先级
onTouch 和onTouchEvent 的区别
ACTION_CANCEL什么时候触发
事件是先到DecorView还是先到Window
点击事件被拦截,但是想传到下面的View,如何操作
如何解决View的事件冲突
在 ViewGroup 中的 onTouchEvent 中消费 ACTION_DOWN 事件,ACTION_UP事件是怎么传递
Activity ViewGroup和View都不消费ACTION_DOWN,那么ACTION_UP事件是怎么传递的
同时对父 View 和子 View 设置点击方法,优先响应哪个
requestDisallowInterceptTouchEvent的调用时机
RecycleView
RecyclerView的多级缓存机制,每一级缓存具体作用是什么,分别在什么场景下会用到哪些缓存
RecyclerView的滑动回收复用机制
RecyclerView的刷新回收复用机制
RecyclerView 为什么要预布局
ListView 与 RecyclerView区别
RecyclerView性能优化
Viewpager&Fragment
Fragment的生命周期 & 结合Activity的生命周期
Activity和Fragment的通信方式, Fragment之间如何进行通信
为什么使用Fragment.setArguments(Bundle)传递参数
FragmentPageAdapter和FragmentStatePageAdapter区别及使用场景
Fragment懒加载
ViewPager2与ViewPager区别
Fragment嵌套问题
WebView
如何提高WebView加载速度
WebView与 js的交互
WebView的漏洞
JsBridge原理
动画
动画的类型
补间动画和属性动画的区别
ObjectAnimator,ValueAnimator及其区别
TimeInterpolator插值器,自定义插值器
TypeEvaluator估值器
Bitmap
Bitmap 内存占用的计算
getByteCount() & getAllocationByteCount()的区别
Bitmap的压缩方式
LruCache & DiskLruCache原理
如何设计一个图片加载库
有一张非常大的图片,如何去加载这张大图片
如果把drawable-xxhdpi下的图片移动到drawable-xhdpi下,图片内存是如何变的。
如果在hdpi、xxhdpi下放置了图片,加载的优先级。如果是400800,10801920,加载的优先级。
Window&WindowManager
什么是Window
什么是WindowManager
什么是ViewRootImpl
什么是DecorView
Activity,View,Window三者之间的关系
DecorView什么时候被WindowManager添加到Window中
Jetpack
LiveData为什么可以自动取消订阅,如何避免内存泄漏?
LiveData设置相同的值,会不会回调?
LiveData有什么坑?如何实现LiveDataBus?
Jetpack MVVM 下的页面通信怎么做?
LiveData “数据倒灌” 是什么情况,如何解决?
其他
JNI
NDK
MVC MVP MVVM原理和区别?
可以说一下MVC->MVP->MVVM演进过程吗?
低版本SDK如何实现高版本api?
异性屏的适配
Jetpack Compose了解过吗?
参考复习内容主要是:
如果需要我的复习资料借鉴学习,可以顺手帮我点赞评论一下,直接私信我【面试】获得领取方式
数据结构与算法
在很多人看来,数据结构与算法这一类的东西没什么用,日常工作实践中都不常用,所以很容易忽视部分内容,但是在很多公司看来,尤其是BATJ等一线大厂,数据结构和算法这种东西确实最有用,而且经常在笔试和面试中出现。
这部分也属于通用的能力,不管是前端后端客户端都是重点中的重点,技术更新迭代快,语言层出不穷,但是数据结构,算法,计算机原理这类的东西没有变。引用罗翔教授的一句话“天变地变,道义不变”
数组与矩阵
数组中重复的数字
二维数组中的查找
替换空格
顺时针打印矩阵
第一个只出现一次的字符位置
栈队列堆
用两个栈实现队列
包含 min 函数的栈
栈的压入、弹出序列
最小的 K 个数
数据流中的中位数
字符流中第一个不重复的字符
滑动窗口的最大值
双指针
和为 S 的两个数字
和为 S 的连续正数序列
翻转单词顺序列
左旋转字符串
链表
从尾到头打印链表
在 O(1) 时间内删除链表节点
删除链表中重复的结点
链表中倒数第 K 个结点
链表中环的入口结点
反转链表
合并两个排序的链表
复杂链表的复制
两个链表的第一个公共结点
树
重建二叉树
二叉树的下一个结点
树的子结构
二叉树的镜像
对称的二叉树
从上往下打印二叉树
把二叉树打印成多行
按之字形顺序打印二叉树
二叉搜索树的后序遍历序列
二叉树中和为某一值的路径
二叉搜索树与双向链表
序列化二叉树
二叉查找树的第 K 个结点
二叉树的深度
平衡二叉树
树中两个节点的最低公共祖先
贪心思想
剪绳子
股票的最大利润
二分查找
旋转数组的最小数字
数字在排序数组中出现的次数
分治
数值的整数次方
搜索
矩阵中的路径
机器人的运动范围
字符串的排列
排序
调整数组顺序使奇数位于偶数前面
把数组排成最小的数
数组中的逆序对
动态规划
斐波那契数列
矩形覆盖
跳台阶
变态跳台阶
连续子数组的最大和
礼物的最大价值
最长不含重复字符的子字符串
丑数
n 个骰子的点数
构建乘积数组
数学
数组中出现次数超过一半的数字
圆圈中最后剩下的数
从 1 到 n 整数中 1 出现的次数
位运算
二进制中 1 的个数
数组中只出现一次的数字
其它
打印从 1 到最大的 n 位数
正则表达式匹配
表示数值的字符串
数字序列中的某一位数字
把数字翻译成字符串
扑克牌顺子
求 1+2+3+…+n
不用加减乘除做加法
把字符串转换成整数
这部分建议一个字“刷”,经常刷《剑指Offer》+ LeetCode,建议《剑指Offer》全部刷完,LeetCode主要是强化、开阔我们的算法思想
题外话:因为这部分被刷下来的简历不少……
Framework
Framework始终穿插在 App 整个研发生命周期中,不管是从 0 到 1 的建立阶段,还是从 1 到 N 打磨阶段,都离不开Framework
像掉帧监控,函数插桩,慢函数检测,ANR 监控,启动监控,都需要对 Framework 有比较深入的了解,才能知道怎么去做监控,利用什么机制去监控,函数插桩插到哪里,反射调用该反射哪个类哪个方法哪个属性……
另外 Framework 作为 Android 框架层,为 App 提供了众多 API 去调用 ,但是很多机制都是 Framework 包装好了给 App 来用的,如果不知道这些机制的原理,那么很难去在这基础上做优化。
Framework 知识广泛应用在Android各个领域中,重要性显而易见。
Framework是Android开发的深水区,也是衡量一个Android程序员能力高低的标准
Binder
Android中进程和线程的关系,区别
为何需要进行IPC,多进程通信可能会出现什么问题
Android中IPC方式有几种、各种方式优缺点
为何新增Binder来作为主要的IPC方式
什么是Binder
Binder的原理
Binder Driver 如何在内核空间中做到一次拷贝的?
使用Binder进行数据传输的具体过程
Binder框架中ServiceManager的作用
什么是AIDL
AIDL使用的步骤
AIDL支持哪些数据类型
AIDL的关键类,方法和工作流程
如何优化多模块都使用AIDL的情况
使用 Binder 传输数据的最大限制是多少,被占满后会导致什么问题
Binder 驱动加载过程中有哪些重要的步骤
系统服务与bindService启动的服务的区别
Activity的bindService流程
不通过AIDL,手动编码来实现Binder的通信
Handler
Handler的实现原理
子线程中能不能直接new一个Handler,为什么主线程可以
主线程的Looper第一次调用loop方法,什么时候,哪个类
Handler导致的内存泄露原因及其解决方案
一个线程可以有几个Handler,几个Looper,几个MessageQueue对象
Message对象创建的方式有哪些 & 区别?
Message.obtain()怎么维护消息池的
Handler 有哪些发送消息的方法
Handler的post与sendMessage的区别和应用场景
handler postDealy后消息队列有什么变化,假设先 postDelay 10s, 再postDelay 1s, 怎么处理这2条消息
MessageQueue是什么数据结构
Handler怎么做到的一个线程对应一个Looper,如何保证只有一个MessageQueue
ThreadLocal在Handler机制中的作用
HandlerThread是什么 & 好处 &原理 & 使用场景
IdleHandler及其使用场景
消息屏障,同步屏障机制
子线程能不能更新UI
为什么Android系统不建议子线程访问UI
Android中为什么主线程不会因为Looper.loop()里的死循环卡死
MessageQueue#next 在没有消息的时候会阻塞,如何恢复?
Handler消息机制中,一个looper是如何区分多个Handler的
当Activity有多个Handler的时候,怎么样区分当前消息由哪个Handler处理
处理message的时候怎么知道是去哪个callback处理的
Looper.quit/quitSafely的区别
通过Handler如何实现线程的切换
Handler 如何与 Looper 关联的
Looper 如何与 Thread 关联的
Looper.loop()源码
MessageQueue的enqueueMessage()方法如何进行线程同步的
MessageQueue的next()方法内部原理
子线程中是否可以用MainLooper去创建Handler,Looper和Handler是否一定处于一个线程
ANR和Handler的联系
系统启动
android系统启动流程
SystemServer,ServiceManager,SystemServiceManager的关系
孵化应用进程这种事为什么不交给SystemServer来做,而专门设计一个Zygote
Zygote的IPC通信机制为什么使用socket而不采用binder
AMS
ActivityManagerService是什么?什么时候初始化的?有什么作用?
ActivityThread是什么?ApplicationThread是什么?他们的区别
Instrumentation是什么?和ActivityThread是什么关系?
ActivityManagerService和zygote进程通信是如何实现的
ActivityRecord、TaskRecord、ActivityStack,ActivityStackSupervisor,ProcessRecord
ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系
手写实现简化版AMS
WMS
什么是WMS
WMS是如何管理Window的
IWindowSession是什么,WindowSession的创建过程是怎样的
WindowToken是什么
WindowState是什么
Android窗口大概分为几种?分组原理是什么
Dialog的Context只能是Activity的Context,不能是Application的Context
App应用程序如何与SurfaceFlinger通信的
View 的绘制是如何把数据传递给 SurfaceFlinger 的
共享内存的具体实现是什么
relayout是如何向SurfaceFlinger申请Surface
什么是Surface
多看!多想!永远就是多看、多想,最重要的是学会看源码,而不仅仅是学会源码
给大家几个小建议:
-
看不懂的多读:刚开始看源码一定是晦涩难懂的,很难坚持。不过一定要强迫自己去看,看不懂的地方多读几遍,Framework的代码也是代码,不少晦涩难懂的代码如果一步一步串联起来,或者是站在整体去看,一切就都顺理成章了
-
不重要的少读:先站在整体读代码,这个时期所有的细节代码都是不重要的;后期可以参考大佬学习的路线,当你能懂得一部分再继续往下读的时候,慢慢就可以分辨出哪些是不重要的部分
-
边读边思考:一定要带着问题去阅读源码,这段代码是什么意思?为什么这里需要这么做?这样的实现优雅还是俗套?有没有更好的实现办法?如果让你来写,会怎么写?长此以往便能够形成自身的理解,而不是看 上博客人云亦云。
-
不是所有的都需要思考:Framework的代码也是由程序员写的,有百读不厌的精华,自然也会有不合理的地方,也会有食之无味的。我们在读源码的过程不需要对着每一段代码都问个十万个为什么。同一个问题通常有很多种解决方案,当时的设计者选择目前这种实现,有兼容问题有历史原因,还有它自己的理解,不是所有的实现在现在看来都是很好的实现,所以,追问这些问题很多时候都没有意义,不要过度解读。
-
记得做笔记:记下自己在现阶段自己的理解,当你更进一步的时候回头再看当初的理解,想想哪里是对的,哪里又有问题。就像是让你现在看过去自己写的代码~
这部分主要参考:
如果需要我的复习资料借鉴学习,可以顺手帮我点赞评论一下,直接私信我【面试】获得领取方式
性能优化
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!