虽然马上就要金三银四了,面试的人应该不少,写这篇文章的目的主要是梳理下知识,能对复习有点帮助就行,本文主要针对Android知识体系相关,涉及的内容有:
- 计算机网络
- Java基础
- Android
- 数据结构与算法
- Framework
- 性能优化
- 开源库源码/原理
- Kotlin
- Flutter
- C/C++/音视频
不过Android是真的内卷啊,内容是真多,配合知识体系还丢了点面试题作为参考,并且也把自己学习过程中的大佬笔记放了上来,说不定对大家也有帮助呢?
以上基本涵盖Android整个知识体系。
有人对自己的能力感觉受限也正常,由于Android体系本身内容比较多,本文也只是整理下,没必要全部都关注,只是目前的一个趋势而已。
目前的Android领域方向主要有:
- 应用开发
- IoT
- Framework
- 性能优化
- 游戏
- 音视频
- 跨端
- 逆向安全
后续内容巨量干货预警!!!建议收藏的同时不要忘记点赞评论支持一下~
Android知识体系
后面就是面试题的整理,以及复习笔记相关内容,相关的一些知识点解析都已经做了收录整理上传至公号中: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了解过吗?
参考复习内容主要是:
如果需要我的复习资料借鉴学习,可以顺手帮我点赞评论一下,前往公号中:Android开发之家,自行访问查阅。
数据结构与算法
在很多人看来,数据结构与算法这一类的东西没什么用,日常工作实践中都不常用,所以很容易忽视部分内容,但是在很多公司看来,尤其是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的代码也是由程序员写的,有百读不厌的精华,自然也会有不合理的地方,也会有食之无味的。我们在读源码的过程不需要对着每一段代码都问个十万个为什么。同一个问题通常有很多种解决方案,当时的设计者选择目前这种实现,有兼容问题有历史原因,还有它自己的理解,不是所有的实现在现在看来都是很好的实现,所以,追问这些问题很多时候都没有意义,不要过度解读。
- 记得做笔记:记下自己在现阶段自己的理解,当你更进一步的时候回头再看当初的理解,想想哪里是对的,哪里又有问题。就像是让你现在看过去自己写的代码~
这部分主要参考:
如果需要我的复习资料借鉴学习,可以顺手帮我点赞评论一下,前往公号中:Android开发之家,自行访问查阅。
性能优化
想要搞清楚性能优化,那么必须对各种底层原理有着深度的了解,对各种 case非常丰富的经验;很多朋友经常遇到措手不及的问题,大多是因为对出现问题的情况和处理思路模糊不清,导致此原因就是因为没有彻底搞懂底层原理。
像常见的启动优化、UI渲染优化、崩溃优化、内存优化、卡顿优化、存储优化、网络优化、耗电优化、多线程并发优化、安装包优化,**每一个都是深水区,**也是衡量一个程序员能力高低的标准。
在大厂面试环节,性能优化基本是必问项,你可以展示出个人实力。一旦你进入大厂,对性能优化了解越多,你能够做的事情就越多,产出也会越多,而且可以持续不断的去做。
- 你们做了哪些稳定性方面的优化?
- 性能稳定性是怎么做的?
- 业务稳定性如何保障?
- 如果发生了异常情况,怎么快速止损?
- 启动优化是怎么做的?
- 是怎么异步的,异步遇到问题没有?
- 启动优化有哪些容易忽略的注意点?
- 版本迭代导致的启动变慢有好的解决方式吗?
- 如果提高启动速度,设计一个延迟加载框架或者 sdk 的方法和注意的问题
- 你们内存优化项目的过程是怎么做的?
- 你做了内存优化最大的感受是什么?
- 如何检测所有不合理的地方?
- 如何避免内存抖动?(代码注意事项)
- 你在做布局优化的过程中用到了哪些工具?
- 布局为什么会导致卡顿,你又是如何优化的?
- 做完布局优化有哪些成果产出?
- 你是怎么做卡顿优化的?
- 你是怎么样自动化的获取卡顿信息?
- 卡顿的一整套解决方案是怎么做的?
- TextView setText 耗时的原因,对 TextView 绘制层源码的理解?
- 优化一个列表页面的打开速度和流畅性如何做
- APP瘦身是怎么做的?
- 设计一个网络优化方案,针对移动端弱网环境。
- APP电量优化是怎么做的?
- 提高 app 安全性的方法?
- 安卓的 app 加固如何做?
- 安卓的混淆原理是什么
- 为什么 WebView 加载会慢呢?
- 如何优化自定义 View
- FC(Force Close)什么时候会出现?
- Java 多线程引发的性能问题,怎么解决?
- TraceView 的实现原理,分析数据误差来源。
- mmap + native 日志优化?
对App进行性能优化,**是一个系统性的工程,对工程师的技术广度和技术深度都有所要求。**一个简单的应用,它不仅包含了应用代码本身,还和虚拟机、存储、网络等紧密相关,线上应用一旦出现了性能问题,需要我们从多方面去考虑。
真正的分水岭是对底层原理的理解。
这部分参考复习内容主要是:
开源库源码/原理
现在Android面试中,对于各种框架的源码都会刨根问题,从而判断候选人的技术底蕴与技术边界。但是很多开发者在日常开发过程中习惯直接CV,对各种框架的源码都没有过深入研究,甚至是常用框架都不了解原理,在面试时被一通爆锤,简历被刷就是意料之中了。
-
Okhttp源码流程,线程池
-
说说 Okhttp 请求复用与缓存方式
-
Okhttp拦截器,addInterceptor 和 addNetworkdInterceptor区别
-
OkHttp 连接池复用原理
-
OkHttp 责任链模式如何运行的?
-
Dispatcher 分发流程
-
Retrofit核心实现原理?
-
如果让你实现Retrofit的某些核心功能,你会考虑怎么去实现?
-
怎么更好的处理Retrofit工具类中将拦截到401状态码?
-
为什么用Glide,而不选择其它图片加载框架?
-
Glide怎么绑定生命周期
-
Glide缓存机制,内存缓存,磁盘缓存
-
有看过Glide的源码吗?跟其它图片框架相比有哪些优势?
-
假如不用开源库,需要你自己写一个图片加载框架,你会考虑哪些方面的问题,说说大概的思路。
-
LruCache原理
-
LeakCanary弱引用,源码流程
-
介绍一下 EventBus 以及它的优点
-
为什么要使用 EventBus 来替代广播呢?
-
EventBus 是如何做到发送粘性消息的?
-
说下 EventBus 的原理
-
什么是模块化
-
什么是组件化
-
组件化优点和方案
-
组件独立调试
-
组件间通信
-
Aplication动态加载
-
ARouter原理
-
插件化的优势
-
插件化框架对比
-
插件化流程
-
插件化类加载原理
-
插件化资源加载原理
-
插件化Activity加载原理
-
热修复和插件化区别
-
热修复原理
这部分参考复习内容主要是:
如果需要我的复习资料借鉴学习,可以顺手帮我点赞评论一下,前往公号中:Android开发之家,自行访问查阅。
Kotlin
经过官方主推,目前不少公司也纷纷迁移至Kotlin,也是未来的一个趋势。此前也问过不少同行,大多表示越用越香,面试时出现的频率也是越来越高。
- 说一下使用kotlin的三大好处。
- 解释一下extension函数。
- kotlin中的null safety是什么意思?
- 为什么kotlin跟Java具有互相的操作性?
- 在kotlin中是否存在三元条件操作符?
- 在kotlin中如何声明一个变量?
- 在kotlin中有多少构造函数?
- kotlin支持哪种编程类型?
- 说一下kotlin中对Java.io.file的的扩展方法。
- 在kotlin中如何处理null异常?
- 有哪些特点, kotlin有,但是Java没有?
- 解释一下kotlin中数据类的作用。
- 我们能把Java代码转成kotlin代码吗?
- kotlin允许macros吗?
- 说一下kotlin类的缺省行为。
- kotlin是否支持原始数据类型?
- 什么是range操作符?
- kotlin对标准的Java库和类提供额外的功能吗?
- kotlin中的抽象有什么作用?
- 在kotlin中如何比较两个字符串?
Flutter
可以不用,但最好要了解,跨端技术深受企业宠爱,对于降低成本提升效率有很大的帮助,之前网上有扒过Flutter的使用情况,很多大厂APP都或多或少的使用了Flutter。特定的岗位会非常重视,不过大多数情况都是作为加分项出现。
- flutter为什么既要支持运行时编译又要支持运行前编译
- dart传参的基本方式
- 都了解过哪些跨平台技术并聊一下其优缺点
- Flutter生命周期介绍
- 说一下你了解的一些dart语法规范
- js了解多少
- final与const区别,
- with关键字的作用
- ?、??、??=三者的区别
- 如何捕捉异常,同步异步
- Map如何转Modal
- stateless和stateful的区别,为什么根Widget要使用stateless,
- 如何在启动图消失之前初始化信息
- Provider的使用,
- 使用GestureDetector碰到的坑
- flutter的两种路由方式
- 如何使用Controller调用子节点的方法
- 动画及自定义动画
- 如何做全局路由
- flutter项目如何抓包
- 聊一聊flutterboost的使用场景
- 如何将Flutter 模块嵌入纯Native项目,及都需要注意哪些事项
- 如何维护一个路由栈
- 说下Widgets、RenderObjects 和 Elements的关系
- Flutter 是如何与原生Android、iOS进行通信的?
- 设计一个日志系统
- flutter项目的性能优化
- Flutter里的各种key
- 了解过持续化集成不
- 设计一个性能监控系统
- flutter的通信原理
- flutter渲染原理
- 事件循环
C/C++/音视频
很多开发者都知道Android音视频开发这个概念,音视频开发不仅需要掌握图像、音频、视频的基础知识,并且还需要掌握如何对它们进行采集、渲染、处理、传输等一系列的开发和应用,因此,音视频开发是一门涉及到很多内容的领域。
随着5G的普及,市场对于音视频人才的需求越来越大,招聘音视频岗位薪资亦是水涨船高,大致能比同层级应用开发高出30%,也是未来一个非常有潜力的领域。
- 列举一些音频编解码常用的实现方案。
- 叙述MPEG视频基本码流结构
- 叙述AMR基本码流结构
- 预测编码的基本原理是什么
- 常见的数字音频编码文件格式有哪些,并简述其特点
- 说说对FFmpeng的了解
- Android中播放视频音频的方式有哪些?
- Android中播放网络地址视频有哪些出色的开源库?
- 流媒体服务器了解吗?
- 谈谈你对编码格式的理解。
- 视频硬解码和软解码的区别?
- MediaPlayer和SoundPool区别
Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的。只能通过一点点的学习和积累把这块的知识串联积累起来。
这部分参考复习内容主要是:
最后
整理这些,一部分算是总结,一部分也是属于自己的学习以及巩固,马上金三银四了,兄弟们加油!
如果需要我的复习资料借鉴学习,可以顺手帮我点赞评论一下,前往公号中:Android开发之家,自行访问查阅。