Android 插件化和热修复知识梳理
https://www.jianshu.com/p/704cac3eb13d
Activity生命周期
https://www.jianshu.com/p/b5a72a741025
Android优化中弱引用WeakReference的知识
https://blog.csdn.net/printfcc/article/details/79131479
Android四种引用:强引用、软引用、弱引用和虚引用
https://www.jianshu.com/p/1cbdc8f52014
Android各大图片加载框架之间的比较.
https://blog.csdn.net/tomcat0916/article/details/81902189
Android网络框架对比
https://www.jianshu.com/p/ff67472a6638
Android 中常用加密算法
https://blog.csdn.net/muranfei/article/details/82626656
安卓的内存管理机制
https://www.cnblogs.com/chendu123/p/6081305.html
Android性能优化总结
https://blog.csdn.net/xiangzhihong8/article/details/92800490
浅析android的OOM问题
https://www.jianshu.com/p/ee78eb0fb651
理解Android虚拟机体系结构
https://www.cnblogs.com/lao-liang/p/5111399.html
Android多线程方式
https://blog.csdn.net/baidu_36385172/article/details/79705915
Android中的缓存机制
https://www.jianshu.com/p/ad2b8af03133
MVP,MVC,MVVM的区别及各自优势
https://blog.csdn.net/victoryzn/article/details/78392128
Android集合使用
https://blog.csdn.net/dbpggg/article/details/80825294
ArrayList和LinkedList区别
https://blog.csdn.net/u012216131/article/details/82500925
Android中常用的设计模式
https://blog.csdn.net/lijinweii/article/details/80194875
Android 单例模式
https://blog.csdn.net/zhangying1994/article/details/83239916
Android数据序列化方案
https://www.cnblogs.com/hustzhb/p/7072951.html
Android RecyclerView —— 基本使用
https://blog.csdn.net/ITRenj/article/details/91556719
Android自定义View全解
https://www.jianshu.com/p/705a6cb6bfee
android线程池
https://www.jianshu.com/p/7b2da1d94b42
XML 的4种解析方式
https://cloud.tencent.com/developer/article/1012671
Android垃圾回收机制
https://blog.csdn.net/lu1005287365/article/details/52475957
Java基础之—反射
https://blog.csdn.net/sinat_38259539/article/details/71799078
Activity 与 Window 与 View 之间的关系
https://www.cnblogs.com/dubo-/p/6676259.html
https://blog.csdn.net/freekiteyu/article/details/79408969
TCP和UDP的区别和优缺点
https://blog.csdn.net/xiaobangkuaipao/article/details/76793702
蓝牙4.0协议详解
https://blog.csdn.net/yangxun0727l/article/details/81295772
从源码角度深入理解Glide
https://www.jianshu.com/p/ddb8e84b5238
OKHttp原理
https://blog.csdn.net/wangzihan91/article/details/87625986
Gradle模块化配置及多渠道打包
https://www.jianshu.com/p/1846506330d7
Android Webview 性能优化
https://my.oschina.net/ososchina/blog/1799575
https://www.cnblogs.com/ganchuanpu/p/8485811.html
Glide 实现原理解析
https://blog.csdn.net/hxl517116279/article/details/99639520
Socket原理详解
https://blog.csdn.net/noricky/article/details/82626188
LRU算法简析
https://www.cnblogs.com/wyq178/p/9976815.html
android 面试题
https://blog.csdn.net/m0_37868230/article/details/81457720
https://www.cnblogs.com/gooder2-android/p/11049755.html
https://www.jianshu.com/p/da8d6c01e3e6
内存泄漏和内存溢出是什么?一般怎么处理内存泄漏?
(1)内存溢出(OOM)和内存泄露(对象无法被回收)的区别。
(2)引起内存泄露的原因
(3)内存泄露检测工具 ------>LeakCanary
内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存溢出通俗的讲就是内存不够用。
内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光
内存泄露原因以及解决:
一、Handler 引起的内存泄漏。
解决:将Handler声明为静态内部类,就不会持有外部类SecondActivity的引用,其生命周期就和外部类无关,
如果Handler里面需要context的话,可以通过弱引用方式引用外部类
二、单例模式引起的内存泄漏。
解决:Context是ApplicationContext,由于ApplicationContext的生命周期是和app一致的,不会导致内存泄漏
三、非静态内部类创建静态实例引起的内存泄漏。
解决:把内部类修改为静态的就可以避免内存泄漏了
四、非静态匿名内部类引起的内存泄漏。
解决:将匿名内部类设置为静态的。
五、注册/反注册未成对使用引起的内存泄漏。
注册广播接受器、EventBus等,记得解绑。
六、资源对象没有关闭引起的内存泄漏。
在这些资源不使用的时候,记得调用相应的类似close()、destroy()、recycler()、release()等方法释放。
七、集合对象没有及时清理引起的内存泄漏。
通常会把一些对象装入到集合中,当不使用的时候一定要记得及时清理集合,让相关对象不再被引用。
webview 性能优化:
1.webview提前初始化,防止多次打开过慢
2.创建独立进程,减少webview引起的内存泄露对主进程内存的占用.避免WebView的Crash影响App主进程的运行。
https://www.cnblogs.com/ganchuanpu/p/8485811.html
Glide 实现原理解析
默认情况下,Glide 会在开始一个新的图片请求之前检查以下多级的缓存:
活动资源 (Active Resources)
内存缓存 (Memory Cache)
资源类型(Resource Disk Cache)
原始数据 (Data Disk Cache)
1.活动资源
活动资源中是一个”引用计数"的图片资源的弱引用集合。使用一个 Map<Key, WeakReference<EngineResource<?>>> 来存储的。
此外还有一个引用队列ReferenceQueue<EngineResource<?>> resourceReferenceQueue;每当向 activeResource 中添加一个 WeakReference 对象时都会将 resourceReferenceQueue 和这个 WeakReference 关联起来,
用来跟踪这个 WeakReference 的 gc,一旦这个弱引用被 gc 掉,就会将它从 activeResource 中移除。
2.内存缓存
内存缓存默认使用LRU(缓存淘汰算法/最近最少使用算法),当资源从活动资源移除的时候,会加入此缓存。使用图片的时候会主动从此缓存移除,加入活动资源。LRU在Android support-v4中提供了LruCache工具类。
3.磁盘缓存
资源类型缓存的是经过解码后的图片,如果再使用就不需要再去进行解码配置(BitmapFactory.Options),加快获得图片速度。比如原图是一个100x100的ARGB_8888图片,在首次使用的时候需要的是50x50的RGB_565图片,那么Resource将50x50 RGB_565缓存下来,再次使用此图片的时候就可以从 Resource 获得。不需要去计算inSampleSize(缩放因子)。
原始数据缓存的则是图像原始数据
4.Bitmap复用池
BitmapPool是Glide中的Bitmap复用池,同样适用LRU来进行管理。在每次解析一张图片为Bitmap的时候(磁盘缓存、网络/文件)会从其BitmapPool中查找一个可被复用的Bitmap。当一个Bitmap从内存缓存 被动 的被移除(内存紧张、达到maxSize)的时候并不会被recycle。而是加入这个BitmapPool,只有从这个BitmapPool 被动的被移除的时候,Bitmap的内存才会真正被recycle释放。
OKHttp原理
总体架构:
Interface-接口层:接口层接收用户的网络访问请求,发起实际的网络访问
OkHttpClient是OkHttp框架的用户面板,用户使用OkHttp进行各种设置,发起各种网络请求都是通过OkHttpClient完成的
Call描述一个实际的访问请求,用户的每一个网络请求都是一个Call实例。Call本身只是一个接口,定义了Call的接口方法,实际执行过程中,OkHttp会为每一个请求创建一个RealCall,每一个RealCall内部有一个AsyncCall
Dispatcher是OkHttp的调度器,其内部维护了一个线程池
Protocal-协议层:Protocol层负责处理协议逻辑,OkHttp支持Http1/Http2/WebSocket协议
Connection-连接层:在连接层中有一个连接池,统一管理所有的Socket连接,当用户新发起一个网络请求时,OkHttp会首先从连接池中查找是否有符合要求的连接,如果有则直接通过该连接发送网络请求;否则新创建一个连接。RealConnection描述一个物理Socket连接,连接池中维护多个RealConnection实例。由于Http/2支持多路复用,一个RealConnection可以支持多个网络访问请求,所以OkHttp又引入了StreamAllocation来描述一个实际的网络请求
Cache-缓存层:Cache层负责维护请求缓存,当用户的网络请求在本地已有符合要求的缓存时,OkHttp会直接从缓存中返回结果,从而节省网络开销
IO层:I/O层负责实际的数据读写。OkHttp的另一大有点就是其高效的I/O操作,这归因于其高效的I/O库Okio
Interceptor-拦截器层:拦截器层提供了一个类AOP接口,方便用户可以切入到各个层面对网络访问进行拦截并执行相关逻辑
Socket原理简析:
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,
这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
android垃圾回收机制:
1. 引用计数法(Reference Counting Collector)
引用计数法是唯一没有使用根集的垃圾回收的法,该算法使用引用计数器来区分存活对象和不再使用的对象。一般来说,堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时,引用计数器置为1。
当对象被赋给任意变量时,引用计数器每次加1当对象出了作用域后(该对象丢弃不再使用),引用计数器减1,一旦引用计数器为0,对象就满足了垃圾收集的条件。
基于引用计数器的垃圾收集器运行较快,不会长时间中断程序执行,适宜地必须实时运行的程序。但引用计数器增加了程序执行的开销,因为每次对象赋给新的变量,计数器加1,而每次现有对象出了作用域生,计数器减1。
2. 根算法
tracing算法是为了解决引用计数法的问题而提出,它使用了根集的概念。基于tracing算法的垃圾收集器从根集开始扫描,识别出哪些对象可达,哪些对象不可达,并用某种方式标记可达对象,
例如对每个可达对象设置一个或多个位。在扫描识别过程中,基于tracing算法的垃圾收集也称为标记和清除(mark-and-sweep)垃圾收集器.
Activity 与 Window 与 View 之间的关系