6 zhuliyuan丶

尚未进行身份认证

我要认证

暂无相关简介

等级
TA的排名 2w+

Lint增量扫描实践

Lint增量扫描实践1. 背景在上一篇Android Lint代码检查实践中说到了Lint全量扫描项目的耗时在3.5m,执行时机是在mr的时候,所以在大多数时候,不会因为Lint检查阻塞开发流程。但是,特殊情况下,比如你只提交了几行代码需要mr的时候,review只需要10秒完事了,而Lint检查却需要3.5m,这个时候你就需要浪费宝贵的3分多钟进行等待,这种事情是我不希望看到的,本着对极致的追求,我决定支持增量扫描的功能,来压缩Lint扫描的时间。老规矩先看下成果,不然被我骗着做完后发现没卵用怎么

2020-09-11 15:34:12

Android Lint代码检查实践

1. 为啥用Lint平时开发中我们在提mr的时候都会进行review,但有些问题通过人眼去看很难发现,比如Fragment必须有空参构造函数,因为在内存不足的时候Fragment恢复默认是通过反射调用空参构造函数重建Fragment、又或者直接使用了kt的扩展函数String#toInt,当服务端返回string不符合int的时候会发生NumberFormatException异常,这类问题在测试环境很难测出,review阶段也可能没注意到,直到线上出现crash才被发现。那为了避免这一类问题,我们最开

2020-08-16 21:06:14

OkHttp-CallServerInterceptor源码解析

本文基于okhttp3.10.0,并且只介绍http1相关的内容不涉及http2.0终于到最后一个拦截器了,前面我们说到在ConnectInterceptor中会建立连接创建RealConnection和HttpCodec,然后传递给下一个拦截器也就是CallServerInterceptor进行网络读写操作,那今天的博客就从这里开始。1. 源码解析讲之前简单介绍下HttpCodec,它...

2020-02-18 15:06:08

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

OkHttp-ConnectInterceptor源码解析

ConnectInterceptor源码解析本文基于okhttp3.10.01. 概述ConnectInterceptor主要是用于建立连接,并再连接成功后将流封装成对象传递给下一个拦截器CallServerInterceptor与远端进行读写操作。这个过程中会涉及比较多类我们简述下每个类的作用StreamAllocation:类似一个工厂用来创建连接RealConnection和...

2020-01-13 15:46:15

OkHttp-CacheInterceptor源码解析

OkHttp-CacheInterceptor源码解析本文基于okhttp3.10.01. 主要功能主要功能其实就一句话按照http协议实现响应的缓存,那既然是按http协议去实现,我们先简单过一下http缓存这块。1.1 Http缓存http缓存主要靠一些头部去标识1.1.1 ExpiresExpires的值为到期时间,即下次请求的时候如果请求时间小于到期时间则可以直接使用缓存...

2019-12-21 15:40:57

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

OkHttp-RetryAndFollowUpInterceptor源码解析

RetryAndFollowUpInterceptor源码分析本文基于okhttp3.10.0近段时间准备陆陆续续把okhttp拦截器分析一遍,既然是本系列开篇那先来回顾下拦截器是干嘛的,然后在开始今天的主题。1. 拦截器简介先简单看下拦截器是干嘛的,okhttp默认给我们提供了5个拦截器RetryAndFollowUpInterceptorBridgeInterceptorC...

2019-12-06 16:53:58

利用APT实现一个组件初始化库

背景(为什么做)在做组件化的过程中发现一个问题,之前我们都是把第三方库和一些初始化的逻辑写在Application,ok这样在单Module的项目是没有问题的,但是当拆成多Module项目的时候这个初始化逻辑在壳App的Application中得维护一份,然后在每个Module自己独立运行的时候也得维护一份,那么假如哪天需要修改初始化逻辑,这将是一个灾难。为了解决这个问题,我们能不能把初始化逻...

2019-09-06 11:45:01

Gradle入门(一)--Groovy常用语法

概述Groovy是一种可以用于构建的DSL,基于Jvm支持所有的Java语法,同时又对Java进行了扩展,提供了大量的语法糖去简化我们的代码。在开发中既能像Java一样用面向对象的方式编写,也能像脚本一样用面向过程的方式编写。而本篇我们主要介绍Groovy在Gradle脚本中常用的语法,如果你想知道更多可以到官网查看http://groovy-lang.org/。在开始之前你需要装好Java和...

2019-05-23 14:26:46

组件化实践

组件化方案近期公司有组件化的打算,因此对市面上的方案进行了调研,目前已经整理出一套作为项目组件化的方案,这里分享一波,当然组件化是没法一步到位的,中间肯定少不了踩坑优化,所以本篇也会持续更新。那么我们先说说组件化是干嘛的吧,组件化就是将单模块的项目拆成多个,并且每个模块可以单独运行。WTF!!!这么简单?对概念就是这么简单,但当我们去做的时候就会发现几个问题模块如何单独运行拆成独立...

2019-04-11 21:12:43

Android插件化初体验

最近把Activity启动流程整体看了一遍,估摸着弄个啥来巩固下,发现插件化正好是这块技术的实践,而说道插件化其实有好几种实现方式,这里我用的是hook的方式实现,主要目的呢是为了对activity启动流程有个整体的认识,当然了本篇的插件化也只是一个demo版本并没有任何兼容适配,重在流程和原理的理解。概述插件化顾名思义,就是将一个APK拆成多个,当需要的时候下载对应插件APK加载的技术。...

2018-12-27 16:00:33

View绘制源码浅析(二)布局的测量、布局、绘制

前言在第一篇View绘制源码浅析(一)布局的加载我们知道了setContentView()完成了DecorView的创建,并且将xml中的布局标签转换成了对应的View、属性转换成了对应的LayoutParams然后添加到了id为content的布局上,也就是说完成了布局对象的创建并且和DecorView关联上了。那么第二篇将介绍View是如何显示出来的,主体流程可分为测量、布局、绘制这三步。...

2018-12-14 19:05:51

View绘制源码浅析(一)布局的加载

概述View的绘制流程大致可以分为两大块,一块是setContentView()和View显示在屏幕上这个整体流程的梳理,另外一块是measure、layout、draw细节的实现,由于内容比较多所以我准备分两篇博客讲述。那么本篇先从整体入手,分析下setContentView()和View显示到屏幕这个流程,掌握一个大体流程。测量、布局、绘制的话将在第二篇介绍。本文的源码基于API27。...

2018-12-04 14:46:57

Android开发应该知道的HTTPS相关知识

前言越来越多的网站和APP将请求协议从HTTP转换到了HTTPS,那么作为安卓程序员我们也有必要了解下HTTPS,不过本篇文章并不想讲太多难懂的理论,更多的是讲述HTTPS是如何实现数据加密并且身份验证的,除此之外还有个额外补充是关于Charles这类截包软件如何截取HTTPS消息的。在开始之前如果你对对称加密、非对称加密、电子证书还、根证书、CA机构还不太了解的先看下下面的文章,这两篇是我看...

2018-12-01 18:39:25

SparseArray源码浅析

SparseArray源码浅析前言最近有小伙伴去面试了,在群里分享的面试题有一道是关于SparseArray的,本来是不想看的o(╥﹏╥)o,没想到是个面试题,那没办法只能看看了。概述本文还是跟前面分析HashMap、LruChache的方式一样分别介绍构造方法、增、删、改、查方法。这里先概括下SparseArray的实现有个初步的认识。作为存储键值对的容器跟HashMap是有很大的...

2018-11-18 20:47:55

Android 手动实现热更新

前言在上篇Android ClassLoader浅析中我们分析了安卓ClassLoader和热更新的原理,这篇我们在上篇热更新分析的基础上写个简单的demo实践一下。概述我们先回顾下热更新的原理PathClassLoader是安卓中默认的类加载器,加载类是通过findClass()方法,而这个方法最终是通过遍历DexPathList中的Element[]数组加载我们需要的类,那么要想实现热...

2018-10-30 19:55:59

Android ClassLoader浅析

前言最近在看Tinker的原理,发现核心是通过ClassLoader做的,由于之前也从未接触过ClassLoader趁着上周末看了安卓ClassLoader相关源码,这里分享一发安卓的ClassLoader和热更新的实现原理。ClassLoader首先我们要知道,程序在运行时要把对应的类加载到内存,在安卓上来说就是把Dex文件中的类加载到内存,这个加载流程是通过ClassLoader实现的。...

2018-10-26 17:01:01

LruCache源码解析

前言本篇将介绍LruCache,而LruCache是用LinkedHashMap实现的,LinkedHashMap继承HashMap所以没看过HashMap的先看下我另外篇博文HashMap源码解析(JDK8)再来看本篇。接下来是正菜LruCache不过吃之前我们先看下前菜LinkedHashMap,只要LinkedHashMap弄明白了LruCache也就小菜一碟了,本文的LinkedHas...

2018-10-12 16:13:04

HashMap源码解析(JDK8)

前言这段时间有空,专门填补了下基础,把常用的ArrayList、LinkedList、HashMap、LinkedHashMap、LruCache源码看了一遍,List相对比较简单就不单独介绍了,Map准备用两篇的篇幅,分别介绍HashMap和(LruCache+LinkedHashMap),因为LruCache是用LinkedHashMap实现的所以就和Lru一起介绍了。概述HashMa...

2018-10-11 17:09:49

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv1
    勤写标兵Lv1
    授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 分享精英
    分享精英
    成功上传11个资源即可获取