在博主认为,对于Android面试以及进阶的最佳学习方法莫过于刷题+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现面试并不难,其次就是在刷题的过程中有没有去思考,刷题只是次之,这又是一个层次了,这里暂时不提后面再谈。
博主总结了一系列大厂面试中常问的面试技术点,深入解析以及答案,将为最近准备面试的各开发者去大厂保驾护航,
何谓面试? 博主所理解的面试,它是一个过程,是不断沉淀、不断总结、善于传达自己的专业领域技术以及解决问题能力的过程。以下是博主总结的一些面试题,文中如有错误,恳请批评指正!
Java相关
-
容器(HashMap、HashSet、LinkedList、ArrayList、数组等)
-
内存模型
-
垃圾回收算法(JVM)
-
垃圾回收机制和调用 System.gc()的区别?
-
类加载过程(需要多看看,重在理解,对于热修复和插件化比较重要)
类加载过程:
加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、和卸载(Unloading)这7个阶段,其中验证、准备和解析3个统称为连接(Linking)
-
反射
https://blog.csdn.net/heng615975867/article/details/104845694
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制
-
多线程和线程池
-
设计模式(六大基本原则、项目中常用的设计模式、手写单例等)
-
Java 四大引用
-
Java 的泛型
泛型,即“参数化类型”;泛型提供了编译时类型安全监测机制,该机制允许程序员在编译时监测非法的类型。使用泛型机制编写的程序代码要比那些杂乱地使用Object
变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。泛型对于集合类尤其有用,例如,ArrayList
就是一个无处不在的集合类。
-
final、finally、finalize 的区别
- final 在java中,final可以用来修饰类,方法和变量
- finally finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,经常被用在需要释放资源的情况下
- finalize finalize()是在java.lang.Object里定义的,每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。 特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。 使用finalize还需要注意一个事,调用super.finalize();一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法,它跟析构函数不一样。
-
接口、抽象类的区别
共同点如下:
1) 都是上层的抽象层。
2) 都不能被实例化
3) 都能包含抽象的方法,这些抽象的方法用于描述类具备的功能,但是不比提供具体的实现。
他们的区别如下:
1) 在抽象类中可以写非抽象的方法,从而避免在子类中重复书写他们,这样可以提高代码的复用性,这是抽象类的优势;接口中只能有抽象的方法。
2) 一个类只能继承一个直接父类,这个父类可以是具体的类也可是抽象类;但是一个类可以实现多个接口。
Android 相关
自定义 View
事件拦截分发
解决过的一些性能问题,在项目中的实际运用
性能优化工具
性能优化 (讲讲你自己项目中做过的性能优化)
1、UI优化
a.合理选择RelativeLayout、LinearLayout、FrameLayout,RelativeLayout会让子View调用2次onMeasure,而且布局相对复杂时,onMeasure相对比较复杂,效率比较低,LinearLayout在weight>0时也会让子View调用2次onMeasure。LinearLayout weight测量分配原则。
b.使用标签
c.减少布局层级,可以通过手机开发者选项>GPU过渡绘制查看,一般层级控制在4层以内,超过5层时需要考虑是否重新排版布局。
d.自定义View时,重写onDraw()方法,不要在该方法中新建对象,否则容易触发GC,导致性能下降
e.使用ListView时需要复用contentView,并使用Holder减少findViewById加载View。
f.去除不必要背景,getWindow().setBackgroundDrawable(null)
g.使用TextView的leftDrawabel/rightDrawable代替ImageView+TextView布局
2、内存优化
主要为了避免OOM和频繁触发到GC导致性能下降
a.Bitmap.recycle(),Cursor.close,inputStream.close()
b.大量加载Bitmap时,根据View大小加载Bitmap,合理选择inSampleSize,RGB_565编码方式;使用LruCache缓存
c.使用 静态内部类+WeakReference 代替内部类,如Handler、线程、AsyncTask
d.使用线程池管理线程,避免线程的新建
e.使用单例持有Context,需要记得释放,或者使用全局上下文
f.静态集合对象注意释放
g.属性动画造成内存泄露
h.使用webView,在Activity.onDestory需要移除和销毁,webView.removeAllViews()和webView.destory()
备:使用LeakCanary检测内存泄露
3、响应速度优化
Activity如果5秒之内无法响应屏幕触碰事件和键盘输入事件,就会出现ANR,而BroadcastReceiver如果10秒之内还未执行操作也会出现ANR,Serve20秒会出现ANR 为了避免ANR,可以开启子线程执行耗时操作,但是子线程不能更新UI,因此需要Handler消息机制、AsyncTask、IntentService进行线程通信。
备:出现ANR时,adb pull data/anr/tarces.txt 结合log分析
4、其他性能优化
a.常量使用static final修饰 b.使用SparseArray代替HashMap c.使用线程池管理线程 d.ArrayList遍历使用常规for循环,LinkedList使用foreach e.不要过度使用枚举,枚举占用内存空间比整型大 f.字符串的拼接优先考虑StringBuilder和StringBuffer g.数据库存储是采用批量插入+事务
Http[s]请求慢的解决办法(DNS、携带数据、直接访问 IP)
缓存自己如何实现(LRUCache 原理)
图形图像相关:OpenGL ES 管线流程、EGL 的认识、Shader 相关
SurfaceView、TextureView、GLSurfaceView 区别及使用场景
Android 5.0中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
View: 显示视图,内置画布,提供了图形绘制函数、触屏事件、按键事件函数等,必须在UI主线程内更新画面,速度较慢;
SurfaceView: 基于view视图进行拓展的视图类,更适合2D游戏的开发,是view的子类,使用了双缓冲机制,即:允许在子线程中更新画面,所以刷新界面速度比view快。
GLSurfaceView: 基于SurfaceView视图再次进行拓展的视图类,在SurfaceView基础上封装了EGL环境管理以及render线程,专用于3D游戏开发的视图。是SurfaceView的子类,openGL专用。
TextrueView: 前面的SurfaceView的工作方式是创建一个置于应用窗口之后的新窗口,脱离了Android的普通窗口,因此无法对其应用变换操作(平移、缩放、旋转等),而TextureView则解决了此问题,Android4.0引入。
应用场景:
- 1 被动更新画面的。比如棋类,这种用View就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 在这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。
- 2 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要SurfaceView来控制。
- 3.对于一些3D游戏来说,为了追求极致的性能和帧率,可以使用GLSurfaceView。其本身就封装了一些OpenGL ES的API, 通过着色器可以达到很多View难以达到的效果。
- 4.SurfaceView窗口刷新的时候不需要重绘应用程序的窗口(android普通窗口的视图绘制机制是一层一层的,任何一个子元素或者是局部的刷新都会导致整个视图结构全部重绘一次,因此效率非常低下,不过满足普通应用界面的需求还是绰绰有余),但是SurfaceView也有一些非常不便的限制。因为SurfaceView的内容不在应用窗口上,所以不能使用变换(平移、缩放、旋转等),所以如果是对于视频播放器或者相机应用的开发,TextureView更加适合。
动画、差值器、估值器(Android中的View动画和属性动画 - 简书、Android 动画 介绍与使用)
MVC、MVP、MVVM
Handler、ThreadLocal、AsyncTask、IntentService 原理及应用
Gradle(Groovy 语法、Gradle 插件开发基础)
热修复、插件化
我们知道Java虚拟机 —— JVM 是加载类的class文件的,而Android虚拟机——Dalvik/ART VM 是加载类的dex文件,
而他们加载类的时候都需要ClassLoader,ClassLoader有一个子类BaseDexClassLoader,而BaseDexClassLoader下有一个
数组——DexPathList,是用来存放dex文件,当BaseDexClassLoader通过调用findClass方法时,实际上就是遍历数组,
找到相应的dex文件,找到,则直接将它return。而热修复的解决方法就是将新的dex添加到该集合中,并且是在旧的dex的前面,
所以就会优先被取出来并且return返回。
组件化架构思路
系统打包流程
Android 有哪些存储数据的方式
Android中的5种数据存储方式
- 1 使用SharedPreferences存储数据;
- 2 文件存储数据;
- 3 SQLite数据库存储数据;
- 4 使用ContentProvider存储数据;
- 5 网络存储数据;
SharedPrefrence 源码和问题点;
Android 面试(六):你已经用 SharedPrefrence 的 apply() 替换commit()
sqlite 相关
Android数据存储的5种方式(数据库面试相关)
如何判断一个 APP 在前台还是后台?
AMS 、PMS
Activity 启动流程,App 启动流程
Binder 机制(IPC、AIDL 的使用)
为什么使用 Parcelable,好处是什么?
Android 图像显示相关流程,Vsync 信号等
算法与数据结构
-
时间复杂度 / 空间复杂度
-
常用的排序算法有哪些?
-
字符串反转
-
链表反转(头插法)
-
如何查找第一个只出现一次的字符(Hash查找)
-
如何查找两个子视图的共同父视图?
-
无序数组中的中位数(快排思想)
-
如何给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
-
二叉树前序、中序、后序遍历
-
最大 K 问题
-
广度、深度优先搜索算法
-
String 转 int。核心算法就三行代码,不过临界条件很多,除了判空,还需要注意负数、Integer 的最大最小值边界等;
-
如何判断一个单链表有环?
-
100 亿个单词,找出出现频率最高的单词。要求几种方案;
-
链表每 k 位逆序;
-
镜像二叉树;
-
找出一个无序数组中出现超过一半次数的数字;
-
计算二叉树的最大深度,要求非递归算法。
-
String 方式计算加法。
网络
1、网络框架对比和源码分析
2、网络七层协议有哪些?
OSI七层模型
- 1、应用层:直接与用户之间交互的,包括用户的软件,网站等
- 2、表示层:使用这个软件或者网站可以看到的数据:图片文字等
- 3、会话层:保存登陆连接状态,在电脑中以cookie保存
- ---------------------------------------------------------------------
- 有的分类方式也会将上面三层分为一层,统一称为应用层
- ---------------------------------------------------------------------
- 4、传输层:选择协议TCP/UDP,相当于给数据加上报头;[TCP][数据]
- 5、网络层:通过IP路径寻址,同时又对数据进行封装;[IP][[TCP][数据]]
- 6、数据链传输层;使用Mac地址寻址,又进行了数据封装;【mac地址】【[IP][[TCP][数据]]】
- 7、物理层;将上面得到的数据转化为电信号或者光信号
- ------------------------------------------------------------------------
- 这四层都有socket模块帮助我们辅助完成
1、Http 和 Https 的区别?Https为什么更加安全?
Https特点:基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护
2、HTTPS的连接建立流程
- client向server发送请求https://baidu.com,然后连接到server的443端口,发送的信息主要是随机值1和客户端支持的加密算法。
- server接收到信息之后给予client响应握手信息,包括随机值2和匹配好的协商加密算法,这个加密算法一定是client发送给server加密算法的子集。
- 随即server给client发送第二个响应报文是数字证书。服务端必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。传送证书,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间、服务端的公钥,第三方证书认证机构(CA)的签名,服务端的域名信息等内容。
- 客户端解析证书,这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值(预主秘钥)。
- 客户端认证证书通过之后,接下来是通过随机值1、随机值2和预主秘钥组装会话秘钥。然后通过证书的公钥加密会话秘钥。
- 传送加密信息,这部分传送的是用证书加密后的会话秘钥,目的就是让服务端使用秘钥解密得到随机值1、随机值2和预主秘钥。
- 服务端解密得到随机值1、随机值2和预主秘钥,然后组装会话秘钥,跟客户端会话秘钥相同。
- 客户端通过会话秘钥加密一条消息发送给服务端,主要验证服务端是否正常接受客户端加密的消息。
- 同样服务端也会通过会话秘钥加密一条消息回传给客户端,如果客户端能够正常接受的话表明SSL层连接建立完成了。
3、解释一下 三次握手 和 四次挥手
socket底层实现原理 (TCP三次握手四次挥手)
三次握手,是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换TCP窗口大小信息。
SYN(synchronous)是同步标志;ACK (Acknowledgement)是确认标志,seq是序列号
- 第一次握手:客户端发送一个TCP的SYN标志位置1的包,指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号字段里。
- 第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号设置为客户的序列号加1以,即X+1。
- 第三次握手:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写序列号的+1。
四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开
- (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
- (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
- (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK态。
- (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
4、TCP 和 UDP的区别
socket底层实现原理 (TCP/UDP)
UDP是面向无连接、传输不可靠、用于传输少量数据(数据包模式)、速度快的传输层协议。注意,UDP传输的是数据报包,而TCP是流
5、Cookie和Session
-
Session 是保存在服务端,用于标识用户
-
Cookie 是保存在客户端的,浏览器端
-
Cookie使用HTTP Header 传递数据
Cookie机制定义了两种Header :Set-Cookie Header 和Cookie Header:Set-Cookie Header 包含于Web服务器的响应头(Response Header)中;Cookie Header 包含在浏览器客户端请求头(Reguest Header)中
-
绝大部分情况都是用 Cookie 来实现Session跟踪的 ,在 Cookie 里面记录了一个Session ID
-
Session ID 是一种机制,不同的环境有不同的叫法 比如: java web 是 JSESSIONID
-
okhttp等使用:
classicApplication.getHeadersMap().put("Cookie","SESSION="+sessionId);//01866fbe-725c-482b-aca1-dcd32a6dcfe2 // .addInterceptor(httpCookiesInterceptor)
6、DNS是什么?
DNS的全称是Domain Name System。它负责把FQDN(就是以"."分隔结尾的名字)翻译成一个IP。
最初的DNS系统使用的是一个巨大的hosts.txt文件,最终发展到了现在的分布式数据库。DNS系统是一个分布式的数据库,当一个数据库发现自己并没有某查询所需要的数据的时候,它将把查询转发出去,而转发的目的地通常是根服务器,根服 务器从上至下层层转发查询,直到找到目标为止。DNS还有一个特点就是使用高速缓存,DNS把查询过的数据缓存在某处,以便于下次查询时使用。
DNS报文定义了一个既可以查询也可以响应的报文格式:
- 最前面的16个bit唯一的标示了问题号码,用于查询端区别自己的查询。
- 紧接着的16个bit又可以做进一步的细分,标示了报文的性质和一些细节,比如说是查询报文还是响应报文,需要递归查询与否(一般服务器都支持递归查询,而且不需要任何设置,BIND就是这样)
- 查询问题后面有查询类型,包括A,NS,CNAME,PTR,HINFO,MX,如果熟悉BIND的话,就知道在zong的配置文件里面,每一条记录都记载了各自的类型,比如A就是IP地址,NS就是名字服务器。
- 响应报文可以回复多个IP,也就是说,域名可以和多个IP地址对应,并且有很多CNAME。
7、DNS解析过程
8、HTTPS实现原理:SSL建立链接过程
- client向server发送请求https://baidu.com,然后连接到server的443端口,发送的信息主要是随机值1和客户端支持的加密算法。
- server接收到信息之后给予client响应握手信息,包括随机值2和匹配好的协商加密算法,这个加密算法一定是client发送给server加密算法的子集。
- 随即server给client发送第二个响应报文是数字证书。服务端必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。传送证书,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间、服务端的公钥,第三方证书认证机构(CA)的签名,服务端的域名信息等内容。
- 客户端解析证书,这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值(预主秘钥)。
- 客户端认证证书通过之后,接下来是通过随机值1、随机值2和预主秘钥组装会话秘钥(这个会话密钥属于对称加密)。然后通过证书的公钥加密会话秘钥。
- 传送加密信息,这部分传送的是用证书加密后的会话秘钥,目的就是让服务端使用秘钥解密得到随机值1、随机值2和预主秘钥。
- 服务端解密得到随机值1、随机值2和预主秘钥,然后组装会话秘钥,跟客户端会话秘钥相同。
- 客户端通过会话秘钥加密一条消息发送给服务端,主要验证服务端是否正常接受客户端加密的消息。
- 同样服务端也会通过会话秘钥加密一条消息回传给客户端,如果客户端能够正常接受的话表明SSL层连接建立完成了。
10.HTTP报文结构
Http协议由什么组成
请求报文包括三部分:
- (1).请求行:包含请求方法,URI,HTTP版本协议
- (2).请求首部字段
- (3).请求内容实体
响应报文包含三部分:
- (1).状态行:包含HTTP版本,状态码,状态码原因短语
- (2).响应首部字段
- (3).响应内容实体
11.HTTP与HTTPS的区别以及如何实现安全性
http是应用层协议,它会将要传输的数据以明文的方式给传输层,这样显然不安全。https则是在应用层与传输层之间又加了一层,该层遵守SSL/TLS协议,用于数据加密。
12.如何验证证书的合法性?
-
证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名;
-
签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名;
客户端在对服务器say hello之后,服务器将公开密钥证书发送给客户端,注意这个证书里面包含了公钥+各种信息+签名(私钥对各种信息加密后生成签名),客户端收到公开密钥证书后,相当于收到了一个包裹里面有公钥+各种信息+签名,怎么样使用这三个数据来校验尼,很简单,公钥加密,私钥解,私钥加密公钥也可以解,只要利用公钥对签名进行解密,然后最和各种信息做比较就可以校验出证书的合法性
13.https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解?
参考8
14.client如何确定自己发送的消息被server收到?
15.谈谈你对WebSocket的理解
- 目的:即时通讯,替代轮询
- 原理:WebSocket同HTTP一样也是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上的。一开始的握手需要借助HTTP请求完成
16.WebSocket与socket的区别 : Socket是传输控制层协议,WebSocket是应用层协议
17.谈谈你对安卓签名的理解
- 每个应用都必须签名
- 应用可以被不同的签名文件签名(如果有源代码或者反编译后重新编译)
- 同一个应用如果签名不同则不能覆盖安装
18.请解释安卓为啥要加签名机制?
为什么要签名
发送者的身份认证:由于开发商可能通过使用相同的 Package Name 来混淆替换已经安装的程序,以此保证签名不同的包不被替换
保证信息传输的完整性:签名对于包中的每个文件进行处理,以此确保包中内容不被替换
防止交易中的抵赖发生:Market(应用市场)对软件的要求
给apk签名可以带来以下好处:
应用程序升级:能无缝升级到新的版本,必须要同一个证书进行签名并且包名称要相同。(如果证书不同,可能会被系统认为是不同的应用)
应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行(系统实际把他们作为一个单个的应用程序),此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块
代码或者数据共享:Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。
签名的说明
所有的应用程序都必须有数字证书:Android 系统不会安装一个没有数字证书的应用程序
Android 程序包使用的数字证书可以是自签名的:不需要一个权威的数字证书机构签名认证
使用一个合适的私钥生成的数字证书来给程序签名:如果要正式发布一个 Android 应用,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用 adt 插件或者 ant 工具生成的调试证书来发布
数字证书都是有有效期的:Android 只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能
19.视频加密传输
20.App 是如何沙箱化,为什么要这么做?
21.权限管理系统(底层的权限是如何进行 grant 的)?
- permission 的初始化:是指 permission 的向系统申请,系统进行检测并授权,并建立相应的数据结构。
- 权限检查:Android framework 中提供了一些接口用来对外来的访问(包括自己)进行权限检查 。 这些接口 主要通过 ContextWrapper 提供,具体实现在 ContextImpl 中 。ContextImpl.java 中提供的 API ,其实都是由 ActivityManagerService 中的如下几个接口进行的封装。
其中有一个checkPermission() // 主要用于一般的 permission 检查
checkPermission 的实现分析
- 如果传入的 permission 名称为 null ,那么返回 PackageManager.PERMISSION_DENIED 。
- 判断调用者 uid 是否符合要求 。
- 如果通过 2 的检查后,再 调用 PackageManagerService.checkUidPermission ,判断 这个 uid 是否拥有相应的权限
- 权限校验之后,应给分发了
源码理解
-
Glide :加载、缓存、LRU 算法 (如何自己设计一个大图加载框架) (LRUCache 原理)
-
EventBus
-
LeakCanary
-
ARouter
-
插件化(不同插件化机制原理与流派,优缺点。局限性)
-
热修复
-
RXJava (RxJava 的线程切换原理)
-
Retrofit (Retrofit 在 OkHttp 上做了哪些封装?动态代理和静态代理的区别,是怎么实现的)
-
OkHttp
Kotlin 相关
1.从原理分析Kotlin的延迟初始化: lateinit var和by lazy
2.使用Kotlin Reified 让泛型更简单安全
3.Kotlin里的Extension Functions实现原理分析
4.Kotlin系列之顶层函数和属性
5.Kotlin 兼容 Java 遇到的最大的 “坑”
6.Kotlin 的协程用力瞥一眼
7.Kotlin 协程「挂起」的本质
8.到底什么是「非阻塞式」挂起?协程真的更轻量级吗?
9.资源混淆是如何影响到Kotlin协程的
10.Kotlin Coroutines(协程) 完全解析
11.破解 Kotlin 协程
Flutter相关
-
Dart 当中的 「..」表示什么意思?
-
Dart 的作用域
-
Dart 是不是单线程模型?是如何运行的?
-
Dart 是如何实现多任务并行的?
-
说一下Dart异步编程中的 Future关键字?
-
说一下Dart异步编程中的 Stream数据流?
-
Stream 有哪两种订阅模式?分别是怎么调用的?
-
await for 如何使用?
-
说一下 mixin机制?
-
请简单介绍下Flutter框架,以及它的优缺点?
-
介绍下Flutter的理念架构
-
介绍下FFlutter的FrameWork层和Engine层,以及它们的作用
-
介绍下Widget、State、Context 概念 - Widget
14.简述Widget的StatelessWidget和StatefulWidget两种状态组件类
15.StatefulWidget 的生命周期
16.简述Widgets、RenderObjects 和 Elements的关系
17.什么是状态管理,你了解哪些状态管理框架?
18.简述Flutter的绘制流程
19.简述Flutter的线程管理模型
20.Flutter 是如何与原生Android、iOS进行通信的?
21.简述Flutter 的热重载
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2020年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
出自:https://www.jianshu.com/p/a8f7048a1575