网络请求
Okhttp3:安卓端最火热的网络请求库,使用简单,功能完备
Okhttp3采用责任链模式,设置拦截器对请求跟响应做统一处理,自带了五个拦截器,实现了重连接、设置请求头、是否缓存等功能,也可以自定义拦截器。
线程池定义在分发器dispather中,没有核心线程、线程可以无限多,线程存活时间60秒。
OkHttp3的最底层是Socket
优点
支持HTTP2/SPDY(SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。)
socket自动选择最好路线,并支持自动重连,拥有自动维护的socket连接池,减少握手次数,减少了请求延迟,共享Socket,减少对服务器的请求次数。
基于Headers的缓存策略减少重复的网络请求。
拥有Interceptors轻松处理请求与响应(自动处理GZip压缩)。
这个简书讲了okhttp中线程池问题
https://www.jianshu.com/p/da4a526a9d72
OkHttp中的线程池是定义在分发器中的,即定义在Dispatcher
配置的线程池的核心线程数为0,最大线程数为Integer.MAX_VALUE,线程的存活时间为60s
Square公司的的网络请求开源库
OkHttp内部自带的五种拦截器,因为这五种拦截器组合完成了真正的Http网络请求。自带的五大拦截器将Request按责任链模式依序向下传递,Response结果再按责任链逆序向上传递返回。也就意味着第一个执行的拦截器最先接触到Request,最后接收到Response:
1、重试与重定向拦截器:RetryAndFollowUpInterceptor
重试重定向拦截器在交出请求(交给下一个拦截器)之前,负责判断用户是否取消了请求;在获得了结果之后,会根据异常情况以及响应码判断是否需要重试或重定向,如果满足条件那么就会重启执行所有拦截器。
2、桥接拦截器:BridgeInterceptor。
桥接拦截器在交出之前,负责将HTTP协议必备的请求头加入其中(如:Host)并添加一些默认的行为(如:GZIP压缩);在获得了结果后,调用保存cookie的接口并解析GZIP数据。
3、缓存拦截器:CacheInterceptor
缓存拦截器顾名思义在交出之前读取并判断是否使用缓存;且获得结果后判断是否缓存。
4、连接拦截器:ConnectInterceptor
连接拦截器在交出之前,负责找到或者新建一个连接,并获得对应的socket流。
5、请求服务器连接器:CallServerInterceptor
请求服务器拦截器进行真正的与服务器的通信,向服务器发送数据,解析读取的响应数据。
volley 网络请求库,适合进行数据量不大,但通信频繁的网络操作
Retrofit 基于okhttp封装的网络库
本质过程:App应用程序通过Retrofit请求网络,实质上是使用Retrofit接口层封装请求参数、Header、Url等信息,之后由okhttp来完成后续的请求工作。在服务端返回数据后,okhttp将原始数据交给Retrofit,Retrofit根据用户需求解析。
图片加载:
glide 快速高效的图片加载库
picasso 强大的图片加载缓存库
universal-image-loader 强大灵活的图片加载处理库
coil 快速高效的图片加载库
图片处理:
circleimageview 圆形图像处理库
ucrop 图片裁剪库
photoview 图片缩放库
matisse 本地图片选择库
数据库:
greendao 将对象映射的SQLite的ORM解决方案库
事件传递:
Eventbus(事件总线)57kb
原理:使用观察者模式,订阅消息、发布消息来通信。
有三个角色
1Event事件,可以事任意类型,EventBus根据事件类型进行全局通知。
2Subscriber,可以在Activiry、Fragment、Services中订阅事件,可以设置事件运行在主线程还是子线程。
3Publisher:事件发布者。可在任意线程里发布事件
EventBus、BroadcastReceiver和Handler均是Android中进程间消息传递的方式
AndroidEventBus的粘性事件
粘性事件能在发送事件之后再订阅该事件也能接收到该事件。与普通事件不同,普通事件是先注册后发布,粘性事件可以先发布后注册。
AndroidEventBus的粘性事件的使用与EventBus的粘性事件不同,AndroidEventBus需要注册粘性事件,订阅者的事件处理函数不需要添加sticky标识。
注意:
EventBus 官方文档中建议在onStart()中注册,在onStop()中注销,否则有可能收不到。
JSON解析:
fastjson Java语言编写的高性能功能完善的JSON库
Fastjson原理:
利用Java自带的反射机制解析JSON字符串。
将JSON字符串转换成Java对象,通过反射读取对象的字段。
自定义类型可以实现任意Java对象之间的转换。
gson Java序列化反序列化库用于JSON和Java对象转化
“Gson的原理是通过反射机制将Java对象的属性和JSON数据的键值对进行映射。
热修复:
tinker 腾讯热修复解决方案
性能优化:
leakcanary 内存泄漏检测库
blockcanary 卡顿检测
arca 应用崩溃报告
注解框架:
butterknife Android系统的View、Resource、Action注入框架
ButterKnife是用来解放开发者的,避免重复编写findViewById,setOnClickListener等操作,也就是说,其实这是一个用来提高开发效率的框架,当然,现在kotlin语言已经流行起来,直接用id就可以访问到view,故相应该框架的优点也稍微被弱化了。
在编译前,生成相应的辅助类,xx_ViewBinding.java,运行时,利用该辅助类对Activity中的view进行findViewById等操作
dagger 依赖注入库
组件化:
arouter 帮助 Android App 进行组件化改造的路由框架
原理:ARouter通过Apt技术,生成保存路径(路由path)和被注解(@Router)的组件类的映射关系的类,利用这些保存了映射关系的类,Arouter根据用户的请求postcard(明信片)寻找到要跳转的目标地址(class),使用Intent跳转。原理很简单,可以看出来,该框架的核心是利用apt生成的映射关系。
响应式:
rxjava 是一种响应式编程,来创建基于事件的异步操作库
有四个基本概念:
Observable(被观察者)
Observer(观察者)
Subscribe(订阅)
事件
Observable跟Observer通过Subscribe()方法实现订阅关系。从而使Observable在需要的时候通知Observer。
优点:异步处理简单、代码简单
rxandroid RxJava 的 Android 绑定
动画:
lottie json动画库
AVLoadingIndicatorView load动画库
图表绘制:
MPAndroidChart 强大的图表/图形视图库,支持折线图、饼图、雷达图、气泡图和烛台图等
权限适配:
rxpermissions 由 RxJava2 提供支持的 Android 运行时权限
permissionsdispatcher 用于处理 Android 运行时权限的声明式 API
Android 模块化、组件化、插件化、热修复的区别
Android 模块化、组件化、插件化、热修复的区别_android分包、热修复、插件化区别-CSDN博客
模块化:功能模块化,module
组件化:基于模块化,在打包时是library,jar包
插件化:也是属于模块化的一种体现。将完整的项目按业务划分不同的插件,分治法,越小的模块越容易维护。单位是apk,一个完整的项目。作用与组件化不同于热更新,灵活性在于加载apk,按需下载,动态更新。
插件化实现原理简单概括三步:
通过dexclassloader加载。
代理模式添加生命周期。
hook思想跳过清单验证。
想让插件的Apk真正运行起来,首先要先能找到插件Apk的存放位置,然后我们要能解析加载Apk里面的代码。
但是光能执行Java代码是没有意义的,在Android系统中有四大组件是需要在系统中注册的,具体来说是在
Android
系统的ActivityManagerService (AMS)
和PackageManagerService (PMS)
中注册的,而四大组件的解析和启动都需要依赖AMS
和PMS
,如何欺骗系统,让他承认一个未安装的Apk
中的组件,如何让宿主动态加载执行插件Apk中Android
组件(即Activity
、Service
、BroadcastReceiver
、ContentProvider
、Fragment
)等是插件化最大的难点。 另外,应用资源引用(特指
R
中引用的资源,如layout
、values
等)也是一大问题,想象一下你在宿主进程中使用反射加载了一个插件Apk
,代码中的R
对应的id
却无法引用到正确的资源,会产生什么后果。由于Android中的组件(Activity,Service,BroadcastReceiver和ContentProvider)是由系统创建的,并且由系统管理生命周期。 仅仅构造出这些类的实例是没用的,还需要管理组件的生命周期。其中以Activity最为复杂,不同框架采用的方法也不尽相同。插件化如何支持组件生命周期的管理。 大致分为两种方式:
- 运行时容器技术(ProxyActivity代理)
- 预埋StubActivity,hook系统启动Activity的过程
热修复:修复bug的
热修复与插件化都利用classloader实现加载新功能。不同的是热修复是为了修复bug,所以要将新的同名类替代同名的bug类,要抢先加载bug类之前加载新的类。插件化只是增加新的功能或资源文件,所以不涉及抢先加载旧类的使命。插件化比热修复简单,热修复在插件化基础上实现替换旧类bug。
Android MVC、MVP、MVVM、MVI
MVC:Activity、Fragment作为Control里面有太多的逻辑处理
MVP:View是布局跟Activity等,定义presenter分担原来Activity中的逻辑。通过接口回调Activity
MVVM:因为presenter的逻辑太复杂,使用View-Model代替presenter,将“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,通过ViewModel进行交互,而且Model和ViewModel之间的交互是双向的,因此视图的数据的变化会同时修改数据源,而数据源数据的变化也会立即反应到View上。
Jatpack
Architecture(架构组件)
Architecture指的是架构组件,帮助开发者设计稳健、可测试且易维护的应用。架构组件可以说是对应用开发帮助最大的组件,本系列也是围绕着架构组件进行讲解。
Lifecycles(生命周期)
用于管理Activity和Fragment的生命周期
原理:标准的观察者模式,监听Activity/Fragment的生命周期
DataBinding
以声明方式将可观察数据绑定到界面元素,通常和ViewModel配合使用。
ViewModel
ViewModel: 以生命周期的方式管理界面相关的数据,通常和DataBinding配合使用,为开发者实现MVVM架构提供了强有力的支持。
LiveData
LiveData: 在底层数据库更改时通知视图。它是一个可观察的数据持有者,与常规observable不同,LiveData是生命周期感知的。
Navigation
Navigation:处理应用内导航。
Paging
Paging:可以帮助开发者一次加载和显示小块数据,按需加载部分数据可减少网络带宽和系统资源的使用。
Room
Room:友好、流畅的访问SQLite数据库。它在SQLite的基础上提供了一个抽象层,允许更强大的数据库访问。
WorkManager
WorkManager: 管理Android的后台的作业,即使应用程序退出或设备重新启动也可以运行可延迟的异步任务。
Foundationy(基础组件)
基础组件提供横向功能,例如向后兼容性、测试、安全、Kotlin 语言支持,并包括多个多个平台开发的组件。
Android KTX:优化了供Kotlin使用的Jetpack和Android平台API。帮助开发者以更简洁、更愉悦、更惯用的方式使用Kotlin进行Android开发。
AppCompat:帮助较低版本的Android系统进行兼容。
Auto: 开发Android Auto应用的组件,提供了适用于所有车辆的标准化界面和用户交互。
检测:从AndroidStudio中快速检测基于Kotlin或Java的代码。
多Dex处理:为具有多个Dex文件应用提供支持。
安全:安全的读写加密文件和共享偏好设置。
测试:用于单元和运行时界面测试的Android 测试框架。
TV: 构建可让用户在大屏幕上体验沉浸式内容的应用。
Wear OS:开发Wear应用的组件。
Behavior(行为组件)
行为组件可帮助开发者的应用与标准Android服务(如通知、权限、分享)相集成。
CameraX:帮助开发简化相机应用的开发工作。它提供一致且易于使用的界面,适用于大多数Android。设备,并可向后兼容至Android 5.0(API 21)。
DownloadManager:处理长时间运行的HTTP下载的系统服务。
媒体和播放:用于媒体播放和路由(包括Google Cast)的向后兼容API。
通知:提供向后兼容的通知API,支持Wear和Auto。
权限:用于检查和请求应用权限的兼容性API。
设置:创建交互式设置,建议使用AndroidX Preference Library库将用户可配置设置集成到应用中。
分享操作:可以更轻松地实现友好的用户分享操作。
切片:切片是一种UI模板,创建可在应用外部显示应用数据的灵活界面元素。
UI(界面组件)
Animation and Transition:该框架包含用于常见效果的内置动画,并允许开发者创建自定义动画和生命周期回调。
Emoji Compatibility:即便用户没有更新Android系统也可以获取最新的表情符号。
Fragment:组件化界面的基本单位。
布局:用XML中声明UI元素或者在代码中实例化UI元素。
调色板:从调色板中提取出有用的信息。