- 博客(62)
- 资源 (14)
- 收藏
- 关注
原创 这可能是最好的AndroidLint开源库
Android Lint这是一个通用Android Lint库,你可以用它来检查代码规范、bug、资源命名等✌️。本库最大特点是通用,相较于其他Lint库(规则直接在代码写死),最大的不同是,规则全靠配置生成,更加灵活,在多团队协作下,只需拷贝配置文件,修改提示信息即可完成迁移。支持增量扫描功能,速度更快。支持lint发现错误后自动执行脚本功能,更加友好。对于增量扫描原理可以看Lint增量扫描实践,具体在项目中使用可以参考Android Lint代码检查实践。如果有感兴趣的大佬,欢迎一起开发、交
2020-10-22 10:21:53 606
原创 Lint增量扫描实践
Lint增量扫描实践1. 背景在上一篇Android Lint代码检查实践中说到了Lint全量扫描项目的耗时在3.5m,执行时机是在mr的时候,所以在大多数时候,不会因为Lint检查阻塞开发流程。但是,特殊情况下,比如你只提交了几行代码需要mr的时候,review只需要10秒完事了,而Lint检查却需要3.5m,这个时候你就需要浪费宝贵的3分多钟进行等待,这种事情是我不希望看到的,本着对极致的追求,我决定支持增量扫描的功能,来压缩Lint扫描的时间。老规矩先看下成果,不然被我骗着做完后发现没卵用怎么
2020-09-11 15:34:12 935
原创 Android Lint代码检查实践
1. 为啥用Lint平时开发中我们在提mr的时候都会进行review,但有些问题通过人眼去看很难发现,比如Fragment必须有空参构造函数,因为在内存不足的时候Fragment恢复默认是通过反射调用空参构造函数重建Fragment、又或者直接使用了kt的扩展函数String#toInt,当服务端返回string不符合int的时候会发生NumberFormatException异常,这类问题在测试环境很难测出,review阶段也可能没注意到,直到线上出现crash才被发现。那为了避免这一类问题,我们最开
2020-08-16 21:06:14 3086 10
原创 OkHttp-CallServerInterceptor源码解析
本文基于okhttp3.10.0,并且只介绍http1相关的内容不涉及http2.0终于到最后一个拦截器了,前面我们说到在ConnectInterceptor中会建立连接创建RealConnection和HttpCodec,然后传递给下一个拦截器也就是CallServerInterceptor进行网络读写操作,那今天的博客就从这里开始。1. 源码解析讲之前简单介绍下HttpCodec,它...
2020-02-18 15:06:08 491 1
原创 Okio源码解析
Okio源码解析Okio是对java原生io的封装,旨在简化api同时优化io操作性能。接下来我会从下面几个方面介绍Okio特性概述读写流程源码查看Buffer精华操作Timeout超时处理1. Okio特性概述java已经提供了很多io实现类供我们在不同场景使用,而Okio并不是一种新的io,而是对原生io的一次封装,为的是解决原生io的一些缺陷,下面我们介绍Okio的特性...
2020-02-14 17:40:55 730 1
原创 OkHttp-ConnectInterceptor源码解析
ConnectInterceptor源码解析本文基于okhttp3.10.01. 概述ConnectInterceptor主要是用于建立连接,并再连接成功后将流封装成对象传递给下一个拦截器CallServerInterceptor与远端进行读写操作。这个过程中会涉及比较多类我们简述下每个类的作用StreamAllocation:类似一个工厂用来创建连接RealConnection和...
2020-01-13 15:46:15 499 3
原创 OkHttp-CacheInterceptor源码解析
OkHttp-CacheInterceptor源码解析本文基于okhttp3.10.01. 主要功能主要功能其实就一句话按照http协议实现响应的缓存,那既然是按http协议去实现,我们先简单过一下http缓存这块。1.1 Http缓存http缓存主要靠一些头部去标识1.1.1 ExpiresExpires的值为到期时间,即下次请求的时候如果请求时间小于到期时间则可以直接使用缓存...
2019-12-21 15:40:57 397 5
原创 OkHttp-BridgeInterceptor源码解析
BridgeInterceptor源码解析这是okhttp拦截器中第二个,作用非常简单就是增加必要的请求头,处理请求体。1. 主要功能添加请求头Cookie管理Gzip压缩1.1 添加请求体 @Override public Response intercept(Chain chain) throws IOException { Request userRequest ...
2019-12-10 15:56:13 334 3
原创 OkHttp-RetryAndFollowUpInterceptor源码解析
RetryAndFollowUpInterceptor源码分析本文基于okhttp3.10.0近段时间准备陆陆续续把okhttp拦截器分析一遍,既然是本系列开篇那先来回顾下拦截器是干嘛的,然后在开始今天的主题。1. 拦截器简介先简单看下拦截器是干嘛的,okhttp默认给我们提供了5个拦截器RetryAndFollowUpInterceptorBridgeInterceptorC...
2019-12-06 16:53:58 720 5
原创 利用APT实现一个组件初始化库
背景(为什么做)在做组件化的过程中发现一个问题,之前我们都是把第三方库和一些初始化的逻辑写在Application,ok这样在单Module的项目是没有问题的,但是当拆成多Module项目的时候这个初始化逻辑在壳App的Application中得维护一份,然后在每个Module自己独立运行的时候也得维护一份,那么假如哪天需要修改初始化逻辑,这将是一个灾难。为了解决这个问题,我们能不能把初始化逻...
2019-09-06 11:46:24 458
原创 Gradle入门(一)--Groovy常用语法
概述Groovy是一种可以用于构建的DSL,基于Jvm支持所有的Java语法,同时又对Java进行了扩展,提供了大量的语法糖去简化我们的代码。在开发中既能像Java一样用面向对象的方式编写,也能像脚本一样用面向过程的方式编写。而本篇我们主要介绍Groovy在Gradle脚本中常用的语法,如果你想知道更多可以到官网查看http://groovy-lang.org/。在开始之前你需要装好Java和...
2019-05-23 14:26:46 734 1
原创 组件化实践
组件化方案近期公司有组件化的打算,因此对市面上的方案进行了调研,目前已经整理出一套作为项目组件化的方案,这里分享一波,当然组件化是没法一步到位的,中间肯定少不了踩坑优化,所以本篇也会持续更新。那么我们先说说组件化是干嘛的吧,组件化就是将单模块的项目拆成多个,并且每个模块可以单独运行。WTF!!!这么简单?对概念就是这么简单,但当我们去做的时候就会发现几个问题模块如何单独运行拆成独立...
2019-04-11 21:12:43 544
原创 Android插件化初体验
最近把Activity启动流程整体看了一遍,估摸着弄个啥来巩固下,发现插件化正好是这块技术的实践,而说道插件化其实有好几种实现方式,这里我用的是hook的方式实现,主要目的呢是为了对activity启动流程有个整体的认识,当然了本篇的插件化也只是一个demo版本并没有任何兼容适配,重在流程和原理的理解。概述插件化顾名思义,就是将一个APK拆成多个,当需要的时候下载对应插件APK加载的技术。...
2018-12-27 16:00:33 1334 12
原创 View绘制源码浅析(二)布局的测量、布局、绘制
前言在第一篇View绘制源码浅析(一)布局的加载我们知道了setContentView()完成了DecorView的创建,并且将xml中的布局标签转换成了对应的View、属性转换成了对应的LayoutParams然后添加到了id为content的布局上,也就是说完成了布局对象的创建并且和DecorView关联上了。那么第二篇将介绍View是如何显示出来的,主体流程可分为测量、布局、绘制这三步。...
2018-12-14 19:05:51 430
原创 View绘制源码浅析(一)布局的加载
概述View的绘制流程大致可以分为两大块,一块是setContentView()和View显示在屏幕上这个整体流程的梳理,另外一块是measure、layout、draw细节的实现,由于内容比较多所以我准备分两篇博客讲述。那么本篇先从整体入手,分析下setContentView()和View显示到屏幕这个流程,掌握一个大体流程。测量、布局、绘制的话将在第二篇介绍。本文的源码基于API27。...
2018-12-04 14:46:57 470
原创 Android开发应该知道的HTTPS相关知识
前言越来越多的网站和APP将请求协议从HTTP转换到了HTTPS,那么作为安卓程序员我们也有必要了解下HTTPS,不过本篇文章并不想讲太多难懂的理论,更多的是讲述HTTPS是如何实现数据加密并且身份验证的,除此之外还有个额外补充是关于Charles这类截包软件如何截取HTTPS消息的。在开始之前如果你对对称加密、非对称加密、电子证书还、根证书、CA机构还不太了解的先看下下面的文章,这两篇是我看...
2018-12-01 18:39:25 952 3
原创 SparseArray源码浅析
SparseArray源码浅析前言最近有小伙伴去面试了,在群里分享的面试题有一道是关于SparseArray的,本来是不想看的o(╥﹏╥)o,没想到是个面试题,那没办法只能看看了。概述本文还是跟前面分析HashMap、LruChache的方式一样分别介绍构造方法、增、删、改、查方法。这里先概括下SparseArray的实现有个初步的认识。作为存储键值对的容器跟HashMap是有很大的...
2018-11-18 20:47:55 444 1
原创 Android 手动实现热更新
前言在上篇Android ClassLoader浅析中我们分析了安卓ClassLoader和热更新的原理,这篇我们在上篇热更新分析的基础上写个简单的demo实践一下。概述我们先回顾下热更新的原理PathClassLoader是安卓中默认的类加载器,加载类是通过findClass()方法,而这个方法最终是通过遍历DexPathList中的Element[]数组加载我们需要的类,那么要想实现热...
2018-10-30 19:55:59 3353 9
原创 Android ClassLoader浅析
前言最近在看Tinker的原理,发现核心是通过ClassLoader做的,由于之前也从未接触过ClassLoader趁着上周末看了安卓ClassLoader相关源码,这里分享一发安卓的ClassLoader和热更新的实现原理。ClassLoader首先我们要知道,程序在运行时要把对应的类加载到内存,在安卓上来说就是把Dex文件中的类加载到内存,这个加载流程是通过ClassLoader实现的。...
2018-10-26 17:01:01 2749 1
原创 LruCache源码解析
前言本篇将介绍LruCache,而LruCache是用LinkedHashMap实现的,LinkedHashMap继承HashMap所以没看过HashMap的先看下我另外篇博文HashMap源码解析(JDK8)再来看本篇。接下来是正菜LruCache不过吃之前我们先看下前菜LinkedHashMap,只要LinkedHashMap弄明白了LruCache也就小菜一碟了,本文的LinkedHas...
2018-10-12 16:13:04 324
原创 HashMap源码解析(JDK8)
前言这段时间有空,专门填补了下基础,把常用的ArrayList、LinkedList、HashMap、LinkedHashMap、LruCache源码看了一遍,List相对比较简单就不单独介绍了,Map准备用两篇的篇幅,分别介绍HashMap和(LruCache+LinkedHashMap),因为LruCache是用LinkedHashMap实现的所以就和Lru一起介绍了。概述HashMa...
2018-10-11 17:09:49 393 2
原创 关于Android MvvM的一些体会
关于Android MvvM的一些体会前言由于我司项目较老有很多历史包袱代码结构也比较混乱,需求复杂的页面动辄activity中1000多行,看着很是头疼,于是趁着加班提前做完需求余下的时间学习了mvvm对项目部分功能进行了改造,目前已经使用3个版本了,本篇博文分享下我使用的感受。准备这里先说说关于mvvm的几个问题(如有不对请轻喷 (╹▽╹))首先说说我为啥选择mvvm而不...
2018-09-26 10:19:14 9190 3
原创 rxjava操作符结合使用场景简介
rxjava操作符结合使用场景简介前言 本文将通过实际的例子来介绍rx相关的操作符,如果对rxjava还不熟悉的同学请先查看rxjava相关基础姿势再来查看本文准备 本文依赖rxjava版本如下implementation 'io.reactivex.rxjava2:rxjava:2.1.15'implementation 'io.reactivex....
2018-06-26 16:28:31 1124 8
原创 WebSocket安卓客户端实现详解(三)--服务端主动通知
WebSocket安卓客户端实现详解(三)–服务端主动通知本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连WebSocket安卓客户端实现详解(二)–客户端发送请求终于是最后一篇啦,有点激动\ ( ≧▽≦ ) /啦啦啦,服务端主动通知热身完毕,我们先回顾下第一篇中讲到的服务端主动通知的流程根据notify中事件类
2017-08-06 13:46:57 10281 27
原创 WebSocket安卓客户端实现详解(二)--客户端发送请求
WebSocket安卓客户端实现详解(二)–客户端发送请求本篇接着上一篇讲解WebSocket客户端发送请求和服务端主动通知消息,还没看过第一篇的小伙伴,这里附上第一篇链接WebSocket安卓客户端实现详解(一)–连接建立与重连.本篇依旧干货十足内容很多所以我们还是先热身下客户端发送请求为了方便我们协议使用json格式,当然你也可以替换成ProtoBuffer.这里先展示下发送请求的流程图,大体流
2017-08-06 11:02:08 20914 27
转载 让你不再俱怕Fragment State Loss
让你不再俱怕Fragment State Loss使用过Fragment的人我相信对臭名昭著的状态丢失问题(IllegalStateException: Can not perform this action after onSaveInstanceState)一定不会陌生。曾经被这个问题困扰了很久,相信很多同学也是。花些时间来好好把它研究一下,以弄懂为何会有这样的问题产生,然后就可以解决
2017-07-22 23:07:59 858 1
原创 WebSocket安卓客户端实现详解(一)--连接建立与重连
今年在公司第一个需求就是基于websocket写一个客户端消息中心,现在已经上线很久了在司机这种网络环境平均一天重连8次,自认为还是不错的.当时写的时候那个心酸啊,主要因为第一次写都不知道该从哪下手,没有方向.所以这里我将尽可能详细的跟大家分享出来.本篇内容会比较多,先来段舞蹈热身下.我准备按如下顺序来讲解整体流程的一个概括了解大体思路.把大体流程细化,逐步去实现.客户端大体流程前言这里特别
2017-06-10 00:07:03 84166 28
原创 Thread->线程池
Thread->线程池前言Callable与Future在介绍线程池前,我们先介绍下Callable与Future因为等会封装异步任务会用到.而异步任务Runnable相信都在熟悉不过了,Callable与Runnable类似,但Callable有返回值.public interface Callable<V> { V call() throws Exception;}类型参数就是返回值类型
2017-05-19 14:07:41 2309 1
原创 Thread->sleep、wait、join使用
Thread sleep、wait、join使用这里先介绍join,然后把两个有关联的sleep和wait一起介绍.join()这个方法比较好理解,当前线程等待指定线程终止后在执行,将两个交替执行的线程合并为顺序执行的线程.比如在B线程中调用A线程的join()方法,直到A线程执行完毕,B线程才会继续执行.api有两个void join()当前线程等待调用这个方法的线程终止后再执行.void j
2017-05-04 11:38:55 3457 3
原创 泛型(二)->擦除&擦除带来的问题
泛型(二)->擦除&擦除带来的问题 本篇首先介绍泛型的擦除,然后围绕泛型擦除所带来的问题进行精确打击,话不多说,我们直接开始正文.文中很多例子都会用到Pair这个对象,这里统一声明.public class Pair<T> { private T first; private T second; public Pair() { first = null;
2017-03-19 18:46:38 4086 6
原创 泛型(一)->简单使用
泛型(一)->简单使用 从上周末到现在陆陆续续看了几天终于把<< java核心技术 >>泛型看完了,有种豁然开朗的感觉尤其是对于泛型擦除又有了新的认识,趁脑还热赶紧记录下来. 关于泛型我准备分两篇写,第一篇是关于泛型的使用属于基础(必须掌握),第二篇是泛型擦除等等一些问题属于进阶(可选).大家自行选择.首先我们要知道泛型的英文是Generic,我曾经被中文版的安卓文档坑过他给翻译成一般结
2017-03-17 15:43:45 4367 4
原创 堆栈、堆、方法区介绍
堆栈、堆、方法区介绍终于开始看java啦…不知道有没有很多人跟我一样想法,先把安卓看完了再去看java,因为安卓直接跟工资挂钩而java更多的是内功.直到前段时间我和我们这边后台大佬对接开发websocket噩梦就开始了,这个线程不安全,这个单例在某些情况下有问题,这里应该这样封装等等…..每天围绕在我脑边,本来就是第一次做websocket,在加上后台大佬java大法猛如虎,真是感觉自己啥也不会了
2017-03-10 10:37:06 43997 23
原创 IPC(中)-进程间通讯方式详解
IPC(中)1 Android中IPC方式在第一篇IPC(上)中我们已经介绍了IPC的基础知识:序列化和Binder,本篇将详细介绍各种跨进程通讯方式.具体有如下几种:Intent中extras传递共享文件BinderContentProviderSocket1.1 Bundle四大组件中的三大组件(Activity,Service,Receiver)都是支持在Intent中传递Bu
2017-01-22 15:53:07 4619 8
转载 Android自定义权限
转至http://www.cnblogs.com/whoislcj/p/6072718.html前言: 最近突然喜欢上一句诗:“宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒。” 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过程中讨论比较多的一个知识点Android 6.0 权限适配问题来进行学习,不过我不想直接进入这个主题
2017-01-22 15:09:11 1401
原创 IPC(上)-多进程入门
1 IPC介绍既然是IPC的开篇那么先介绍下IPC的定义 IPC:进程间通信或者跨进程通信,即进程间交换数据的过程. 说到进程,那么需要了解下什么是进程.什么是线程,按操作系统描述,线程是CPU调度的最小单元,同时线程是一种有限的系统资源,而进程指一个执行单元,在PC和移动设备上指一个程序或者应用,一个进程可以包含多个线程,因此进程和线程是包含和被包含的关系,在Android中进程间通信方式就是
2017-01-05 09:42:03 2995 6
原创 AlarmManager-系统推荐的定时任务
近期leader提了很多这样的需求:每隔几个小时拉取服务器的配置信息存在本地、每隔一段时间跟服务端校对一下本地时间、每隔一段时间上传一下本地日志等等。其实这些本质都是定时任务,隔一段时间去干xxx,那么在安卓中定时任务无非三种实现方式,Handler(CountDownTimer)、Timer、while循环、AlarmManager。(如果有遗漏还望留言告知O(∩_∩)O谢谢)前三种大家基本都用过
2016-12-16 14:42:29 14990 6
原创 AIDL使用
最近有空就在看IPC,正好路过AIDL这里,发现基本忘干净了…正好借此机会回顾并记录下来,那么接下来我就先撸为敬了.AIDL用来做什么AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似。 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。 在 Android 上,一个进程通常无法访问另一个进程的内存。 尽管如此,进程需要将其对象分解成操
2016-12-10 20:53:16 1358 2
原创 RecyclerView下拉刷新上拉加载更多--EasyRecyclerView
EasyRecyclerView描述这是一个下拉刷新上拉加载更多框架(ps:后期还会加入一些常用的功能.),头部用的秋哥的android-Ultra-Pull-To-Refresh,底部和没有数据的状态自己实现的.其实刚刚开始我是想找个库直接用的,试了几个排名靠前的,感觉跟自己想要的不太一样,索性自己写了一个,当然这当中也遇到了问题,多亏仲锦大师的帮助在此感谢.感谢完了附上库的地址EasyRecyc
2016-12-02 11:28:56 9258 14
转载 ViewStub
由于最近正在封装下拉刷新上拉加载的库,为了进一步的优化ui,所以学习了下ViewStub,这里转载别人的blog分享给大家. 在Android开发中,经常会遇到这样的情况,在程序运行过程中动态的根据当前条件来决定是否显示某个控件或布局,那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制
2016-11-06 11:13:55 1472
转载 Java序列化与反序列化
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨。 1.Java序列化与反序列化Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。2.为什么需要序列化与反序列化我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数
2016-10-18 22:55:11 689
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人