为什么Android开发岗位要求越来越高?

·  阅读 1512

Android现在是越来越不好找工作了,并且未来还会更难,主要原因呢还是太卷,同样是搞搞业务代码,谁更熟练要谁,同样的高工岗,谁对底层原理研究最深要谁

比如下面这些面试题,八股文越熟练越容易通过 Android 面试。

一、Java

  • HashMap原理
  • HashMap中put()如何实现的
  • HashMap中get()如何实现的
  • 为什么HashMap线程不安全
  • HashMap1.7和1.8有哪些区别
  • 解决hash冲突的时候,为什么用红黑树
  • 红黑树的效率高,为什么一开始不用红黑树存储
  • 不用红黑树,用二叉查找树可以吗
  • 为什么阀值是8才转为红黑树
  • 为什么退化为链表的阈值是6
  • hash冲突有哪些解决办法
  • HashMap在什么条件下扩容
  • HashMap中hash函数怎么实现的,还有哪些hash函数的实现方式
  • 为什么不直接将hashcode作为哈希值去做取模,而是要先高16位异或低16位
  • 为什么扩容是2的次幂
  • 链表的查找的时间复杂度是多少
  • 红黑树
  • Java中创建线程的方式,Callable,Runnable,Future,FutureTask
  • 线程的几种状态
  • 谈谈线程死锁,如何有效的避免线程死锁?
  • 如何实现多线程中的同步
  • synchronized和Lock的使用、区别,原理;
  • volatile,synchronized和volatile的区别?为何不用volatile替代synchronized?
  • 锁的分类,锁的几种状态,CAS原理
  • 为什么会有线程安全?如何保证线程安全
  • sleep()与wait()区别,run和start的区别,notify和notifyall区别,锁池,等待池
  • Java多线程通信
  • 为什么Java用线程池
  • Java中的线程池参数,共有几种
  • 注解的分类和底层实现原理
  • 自定义注解
  • 什么是反射
  • 反射机制的相关类
  • 反射中如何获取Class类的实例
  • 如何获取一个类的属性对象 & 构造器对象 & 方法对象
  • Class.getField和getDeclaredField的区别,getDeclaredMethod和getMethod的区别
  • 反射机制的优缺点
  • 什么是泛型擦除?为什么需要泛型擦除?
  • 泛型擦除后retrofit是怎么获取类型的?
  • Gson解析为什么要传入内部类
  • 那些泛型信息会被保留,哪些是真正的擦除了?
  • 为什么Gson解析要传入匿名内部类

二、虚拟机

  • JVM内存模型的理解?
  • GC原理和回收策略
  • JVM跟Art、Dalvik对比
  • GC收集器简介?以及它的内存划分怎么样的?
  • 栈内存和堆内存的区别是什么?
  • JVM调优的常见命令行工具有哪些?JVM常见的调优参数有哪些?
  • jstack,jmap,jutil分别的意义?如何线上排查JVM的相关问题?
  • JVM方法区存储内容是否会动态扩展?是否会出现内存溢出?出现的原因有哪些?
  • 如何解决同时存在的对象创建和对象回收问题?
  • JVM中最大堆大小有没有限制?
  • 如何理解Java的虚函数表?
  • Java运行时数据区域导致内存溢出的原因
  • 对象创建、内存布局,访问定位

三、Android基础

  • 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与Activity怎么实现通信
  • IntentService是什么,IntentService原理,应用场景及其与Service的区别
  • Service 的 onStartCommand 方法有几种返回值?各代表什么意思?
  • bindService和startService混合使用的生命周期以及怎么关闭
  • 如何保证Service不被杀死?
  • 广播的分类和使用场景
  • 广播的两种注册方式的区别
  • 广播发送和接收的原理
  • 本地广播和全局广播的区别
  • 什么是ContentProvider及其使用
  • ContentProvider,ContentResolver,ContentObserver之间的关系
  • ContentProvider的实现原理
  • ContentProvider的优点
  • Uri 是什么
  • Fragment为什么被称为第五大组件
  • 如何切换Fragment(不重新实例化)
  • Fragment的优点
  • Activity和Fragment的区别
  • getFragmentManager、getSupportFragmentManager 、getChildFragmentManager之间的区别?
  • Fragment如何实现类似Activity栈的压栈和出栈效果
  • Fragment的replace和add方法的区别
  • Activity创建Fragment的方式
  • FragmentPageAdapter和FragmentPageStateAdapter的区别
  • Fragment的生命周期
  • Fragment家族常用的API
  • Fragment与Activity的通信方式
  • ViewPager对Fragment生命周期的影响
  • 什么是ANR?如何避免?
  • 横竖屏切换时候Activity的生命周期
  • AsyncTask的缺陷和问题,原理
  • android中进程的优先级?
  • Bunder传递对象为什么需要序列化?Serialzable和Parcelable的区别?
  • Android各版本特性
  • android中有哪几种解析xml的类,官方推荐哪种?它们的原理和区别
  • Android为每个应用程序分配的内存大小是多少?
  • Thread、AsyncTask、IntentService的使用场景与特点
  • 为什么我们能在主线程直接使用 Handler,而不需要创建 Looper ?
  • Handler 里藏着的 Callback 能干什么?
  • 内存泄露怎样查找,怎么产生的内存泄露?
  • 类的初始化顺序依次是?
  • Bitmap 使用时需要注意什么?
  • 强引用置为null,会不会被回收?
  • 如何计算一个Bitmap占用内存的大小,怎么保证加载Bitmap不产生内存溢出?
  • 屏幕适配的处理技巧都有哪些?
  • 断点续传如何实现?

四、高级 UI

  • 绘制流程及其原理
  • Resource原理与机制,UI样式如何加载?
  • UI绘制过程中,如何加载布局文件?
  • QQ消息气泡的实现原理
  • 贝塞尔曲线的原理及使用
  • 事件传递机制
  • 事件冲突解决办法及其类型
  • 属性动画原理
  • 自定义view硬件加速原理和应用
  • 高性能丶页面渲染丶组件业务化

五、Framework

  • Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么?
  • Android系统启动流程
  • Android的Laucher是如何创建的?
  • App的进程是如何启动起来的?
  • 点击桌面图标,是如何启动App的Activity的?
  • AMS的启动流程
  • Binder机制
  • 系统级app和第三方应用级app分别在什么目录下?
  • SystemUI是在system/priva-app还是system/app路径下?
  • android中UID和PID的作用及区别
  • android系统的低电耗模式(Doze模式)是怎么工作的
  • Service 什么时候启动可以不影响启动速度?
  • Activity onResume 回调的时候真的可见了么?
  • Redex 为什么会加快应用启动速度?
  • ContentProvider 会不会影响启动速度?为什么会影响?
  • ThreadLocal 做什么的?
  • Thread 和 Handler 的关系
  • 为什么不能在子线程更新 UI?
  • idleHandler 什么时候运行?
  • 主线程为什么循环却不会卡死?
  • ContentProvider、Broadcast、Service 是怎么利用 Message 监控 ANR 的?

六、性能优化

  • 做了哪些稳定性方面的优化?
  • 性能稳定性是怎么做的?
  • 业务稳定性如何保障?
  • 如果发生了异常情况,怎么快速止损?
  • 启动优化是怎么做的?
  • 是怎么异步的,异步遇到问题没有?
  • 启动优化有哪些容易忽略的注意点?
  • 版本迭代导致的启动变慢有好的解决方式吗?
  • 如果提高启动速度,设计一个延迟加载框架或者sdk的方法和注意的问题
  • 内存优化项目的过程是怎么做的?
  • 做了内存优化最大的感受是什么?
  • 如何检测所有不合理的地方?
  • 如何避免内存抖动?
  • 在做布局优化的过程中用到了哪些工具?
  • 布局为什么会导致卡顿,如何优化?
  • 做完布局优化有哪些成果产出?
  • 怎么做卡顿优化的?
  • 怎么样自动化的获取卡顿信息?
  • 卡顿的一整套解决方案是怎么做的?
  • TextView setText耗时的原因,对TextView绘制层源码的理解?
  • 如何优化一个列表页面的打开速度和流畅性
  • APK瘦身
  • 客户端网络安全实现
  • 设计一个网络优化方案,针对移动端弱网环境
  • 电量优化
  • 提高app安全性的方法
  • 安卓的app加固如何做?
  • 安卓的混淆原理是什么?
  • 对安卓签名的理解
  • 为什么WebView加载会慢呢?
  • 如何优化自定义View?
  • Java多线程引发的性能问题,怎么解决?
  • TraceView的实现原理,分析数据误差来源
  • 使用过SysTrace吗?原理了解得怎么样?
  • mmap + native 日志优化

七、开源库

  • OkHttp这个库有哪些用法?对应什么样的使用场景?
  • OkHttp的优缺点是什么,跟同类型库的比较?
  • OkHttp连接池复用原理
  • OkHttp责任链模式如何运行的?
  • Dispatcher分发流程
  • 如果让你实现OkHttp的某些核心功能,你会考虑怎么去实现?
  • 从OkHttp中学到什么有价值的或者说可借鉴的设计思想?
  • OKhttp针对网络层有哪些优化?
  • 网络请求缓存处理,okhttp如何处理网络缓存的?
  • HttpUrlConnection 和 okhttp关系?
  • 自己去设计网络请求框架,怎么做?
  • 从网络加载一个10M的图片,有哪些注意事项?
  • http怎么知道文件过大是否传输完毕的响应?
  • 谈谈你对WebSocket的理解
  • WebSocket与socket的区别
  • Retrofit 与OkHttp的关系
  • Retrofit都有哪些用法?对应什么样的使用场景?
  • Retrofit如何通过动态代理实现对Okhttp的调用的?
  • Retrofit自定义注解的作用
  • Retrofit为何能直接渲染UI线程?
  • Retrofit运用了哪些设计模式
  • 如果让你实现Retrofit的某些核心功能,你会考虑怎么去实现?
  • Glide为什么不用担心内存泄漏?
  • Glide的3级缓存是如何实现的
  • Glide怎么实现页面生命周期绑定?
  • Glide为什么对Fragment做缓存?
  • 美团robust修复原理
  • class字节码加载过程原理
  • Tinker热修复的实现原理

八、架构设计

  • 模块化、组件化、插件化有哪些区别?
  • 路由框架原理
  • 如何优化组件化中的路由表?
  • 组件化核心编译时如何通过apt实现对路由的接入?
  • 如果你来做大型架构,如何设计组件化架构?
  • 插件化原理及运用场景
  • 插件生命周期管理
  • 插件四大组件跳转机制
  • 插件中Activity的上下文如何管理和应用
  • 配置中心以及灰度测试
  • 调试组件
  • 性能监控框架
  • 基础网络组件
  • 埋点框架
  • 启动相关
  • 中间件(图片 日志 存储 基础信息)
  • 第三方sdk(偏中台方向)
  • 组件化插件化动态化
  • android编译流程
  • Gradle 生命周期
  • apt是编译中哪个阶段?
  • Dex和class有什么区别?
  • Transform是如何被执行的?
  • Transform和其他系统Transform执行的顺序
  • 如何监控编译速度变慢问题?
  • Gradle中如何给一个Task前后插入别的任务?
  • ksp APT Transform的区别
  • Transform上的编译优化能做哪些?
  • aar 源码切换插件原理
  • 你们有哪些保证代码质量的手段?
  • 如何对第三方的依赖做静态检查?
  • R.java code too large 解决方案
  • R inline 你需要注意些什么?
  • 一个类替换父类 比如所有activity实现类替换baseactivity
  • R8 D8 以及混淆相关的,还有R8除了混淆还能干些什么? 混淆规则有没有碰到什么奇怪的问题?
  • 编译的时候有没有碰到javac的常量优化?

九、跨平台

  • Dart 语言有哪些重要的特性?
  • Dart 是如何实现多任务并行的?
  • Stream 有哪两种订阅模式?分别是怎么调用的?
  • dart中mixin机制是怎么样的?
  • JIT 与 AOT分别是什么?
  • Dart的内存分配与垃圾回收是怎么样的?
  • mixin 怎么指定异常类型?
  • Future和Isolate有什么区别?
  • Stream 与 Future是什么关系?
  • Flutter的优缺点
  • Flutter跨平台原理
  • 移动端跨平台技术划分
  • 移动端跨平台技术演进
  • 蓝湖设计图有一张轮播图,宽度是 335 高度是 120,左右间隔是 10, 如何使用屏幕算法适配全机型屏幕宽和高?
  • 未知数据数量有规则的列表视图,要求一行显示5个,每个间隔为 10(含上下),最外边距margin左右都为20,高度为50,多出的数 据继续往下排并向左对齐,适配任何机型,怎么做?
  • 如何实现点击空白区域收起键盘?
  • 无需上下文进行路由跳转原理是怎么样的?
  • 为什么我的容器无论设置宽高多少都是占整个的宽高?怎么解决?
  • 键盘弹出时底部溢出如何解决?
  • Container 设置 borderRadius 不生效怎么解决?如何导致的?
  • GestureDetector 设置 onTap 不生效怎么解决?
  • 如何实现动态更改 TabBar 长度?
  • 如何实现键盘弹出后遮住布局,而不是顶起布局?
  • 为何输入框输入内容之后返回到桌面,再进入app时内容被清空了?怎么解决?
  • 为何本地资源图片刚进入的时候切换到另一张出现白屏?怎么解决?
  • 如何拦截 App 返回事件,用什么组件?
  • 如何监听 App 暂停运行或不可见状态事件?
  • Text 的 TextOverflow.ellipsis 不生效如何解决?
  • 如何获取控件的大小和位置?
  • 类构造方法后面加个super表示什么意思?
  • assert( data != null, ‘no data’)是什么意思?
  • const修饰构造函数和放声明数值前分别有什么作用?
  • Assert(断言)有什么作用?什么时候有效?
  • StatefulWidget 的生命周期是怎么样的?
  • Widgets、RenderObjects 和 Elements的关系
  • Flutter 是如何与原生Android、iOS进行通信的?
  • 简述Flutter 热重载
  • Flutter 和其他跨平台方案的本质区别
  • Widget 唯一标识Key有哪几种?
  • 什么是Navigator? MaterialApp做了什么?
  • Flutter动画类型有哪些?
  • Flutter是怎么完成组件渲染的?
  • Flutter绘制流程是怎么样的?
  • Flutter 中存在哪四大线程?
  • PlatformView使用了哪些东西来实现?
  • PlatformView原理
  • Platform Channel有哪几种通信方式?分别是用于什么操作?
  • RenderObject如何使得页面重绘?流程是怎么样的?
  • 状态管理基本分类
  • 状态管理的底层逻辑一般是怎么样的?
  • 状态管理的使用原则是怎么样的?
  • 使用成熟状态管理库的弊端有哪些?
  • flutter run实际走了哪三个命令?分别用于什么操作?
  • Flutter引擎启动过程中做了什么操作?
  • Flutter应用启动runApp(MyApp)过程是怎么样的?
  • Dart虚拟机如何管理的?怎么调用?如何跟Flutter引擎交互?
  • setState在哪种场景下可能会失效?
  • isolate是怎么进行通信的?实例化过程是怎么样的?

十、音视频

  • 为什么要有YUV这种数据出来?(YUV相比RGB来说的优点)
  • H264/H265有什么区别?
  • 什么是音视频编码格式?什么是音视频封装格式?
  • 视频或者音频传输,你会选择TCP协议还是UDP协议?为什么?
  • 平时说的软解和硬解,具体是什么?
  • 何为直播?何为点播?
  • 简述推流、拉流的工作流程?
  • 如何在直播中I帧间隔设置、与帧率分辨率选定?
  • 直播推流中推I帧与推非I帧区别是什么?
  • 常见的直播协议有哪些?之间有什么区别?
  • 点播中常见的数据传输协议主要有哪些?
  • 何为Nginx?有什么特点?
  • RTMP、HLS协议各自的默认端口号是?
  • 简述RTMP协议,如何封装RTMP包?
  • m3u8构成是?直播中m3u8、ts如何实时更新?
  • MediaCodec编码机制
  • 何为音视频同步,音视频同步是什么标准?
  • 音视频能做到绝对同步吗?
  • 音频超前与视频超前在同步中如何解决?
  • 播放器暂停、快进快退、seek、逐帧、变速怎么实现?
  • 视频倒放如何实现?
  • 说说你平时在播放过程中做的优化工作?
  • 你研究过哪些具体的流媒体服务器,是否做过二次开发?

当然,面试时不会上面的每个题都问到,通常会根据简历里写的项目经历来问,结合岗位相关的技术,而面试中经常会出现层层深挖,并且会结合实际问题来问,面试中的大多数问题都是在探明你的技术边界,全方位地考察你对技术的理解深度,以及解决问题的能力

这里只是列出一些题目给大家一点思路,后续将会单独更题目的参考答案,大家可以多多关注!

分类:
Android
标签:
分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改