
Android
文章平均质量分 82
zhuliyuan丶
这个作者很懒,什么都没留下…
展开
-
Lint增量扫描实践
Lint增量扫描实践1. 背景在上一篇Android Lint代码检查实践中说到了Lint全量扫描项目的耗时在3.5m,执行时机是在mr的时候,所以在大多数时候,不会因为Lint检查阻塞开发流程。但是,特殊情况下,比如你只提交了几行代码需要mr的时候,review只需要10秒完事了,而Lint检查却需要3.5m,这个时候你就需要浪费宝贵的3分多钟进行等待,这种事情是我不希望看到的,本着对极致的追求,我决定支持增量扫描的功能,来压缩Lint扫描的时间。老规矩先看下成果,不然被我骗着做完后发现没卵用怎么原创 2020-09-11 15:34:12 · 987 阅读 · 0 评论 -
Android Lint代码检查实践
1. 为啥用Lint平时开发中我们在提mr的时候都会进行review,但有些问题通过人眼去看很难发现,比如Fragment必须有空参构造函数,因为在内存不足的时候Fragment恢复默认是通过反射调用空参构造函数重建Fragment、又或者直接使用了kt的扩展函数String#toInt,当服务端返回string不符合int的时候会发生NumberFormatException异常,这类问题在测试环境很难测出,review阶段也可能没注意到,直到线上出现crash才被发现。那为了避免这一类问题,我们最开原创 2020-08-16 21:06:14 · 3160 阅读 · 10 评论 -
OkHttp-CallServerInterceptor源码解析
本文基于okhttp3.10.0,并且只介绍http1相关的内容不涉及http2.0终于到最后一个拦截器了,前面我们说到在ConnectInterceptor中会建立连接创建RealConnection和HttpCodec,然后传递给下一个拦截器也就是CallServerInterceptor进行网络读写操作,那今天的博客就从这里开始。1. 源码解析讲之前简单介绍下HttpCodec,它...原创 2020-02-18 15:06:08 · 523 阅读 · 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 · 769 阅读 · 1 评论 -
OkHttp-ConnectInterceptor源码解析
ConnectInterceptor源码解析本文基于okhttp3.10.01. 概述ConnectInterceptor主要是用于建立连接,并再连接成功后将流封装成对象传递给下一个拦截器CallServerInterceptor与远端进行读写操作。这个过程中会涉及比较多类我们简述下每个类的作用StreamAllocation:类似一个工厂用来创建连接RealConnection和...原创 2020-01-13 15:46:15 · 538 阅读 · 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 · 413 阅读 · 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 · 346 阅读 · 3 评论 -
OkHttp-RetryAndFollowUpInterceptor源码解析
RetryAndFollowUpInterceptor源码分析本文基于okhttp3.10.0近段时间准备陆陆续续把okhttp拦截器分析一遍,既然是本系列开篇那先来回顾下拦截器是干嘛的,然后在开始今天的主题。1. 拦截器简介先简单看下拦截器是干嘛的,okhttp默认给我们提供了5个拦截器RetryAndFollowUpInterceptorBridgeInterceptorC...原创 2019-12-06 16:53:58 · 741 阅读 · 5 评论 -
Android 手动实现热更新
前言在上篇Android ClassLoader浅析中我们分析了安卓ClassLoader和热更新的原理,这篇我们在上篇热更新分析的基础上写个简单的demo实践一下。概述我们先回顾下热更新的原理PathClassLoader是安卓中默认的类加载器,加载类是通过findClass()方法,而这个方法最终是通过遍历DexPathList中的Element[]数组加载我们需要的类,那么要想实现热...原创 2018-10-30 19:55:59 · 3412 阅读 · 9 评论 -
SparseArray源码浅析
SparseArray源码浅析前言最近有小伙伴去面试了,在群里分享的面试题有一道是关于SparseArray的,本来是不想看的o(╥﹏╥)o,没想到是个面试题,那没办法只能看看了。概述本文还是跟前面分析HashMap、LruChache的方式一样分别介绍构造方法、增、删、改、查方法。这里先概括下SparseArray的实现有个初步的认识。作为存储键值对的容器跟HashMap是有很大的...原创 2018-11-18 20:47:55 · 461 阅读 · 1 评论 -
View绘制源码浅析(一)布局的加载
概述View的绘制流程大致可以分为两大块,一块是setContentView()和View显示在屏幕上这个整体流程的梳理,另外一块是measure、layout、draw细节的实现,由于内容比较多所以我准备分两篇博客讲述。那么本篇先从整体入手,分析下setContentView()和View显示到屏幕这个流程,掌握一个大体流程。测量、布局、绘制的话将在第二篇介绍。本文的源码基于API27。...原创 2018-12-04 14:46:57 · 482 阅读 · 0 评论 -
View绘制源码浅析(二)布局的测量、布局、绘制
前言在第一篇View绘制源码浅析(一)布局的加载我们知道了setContentView()完成了DecorView的创建,并且将xml中的布局标签转换成了对应的View、属性转换成了对应的LayoutParams然后添加到了id为content的布局上,也就是说完成了布局对象的创建并且和DecorView关联上了。那么第二篇将介绍View是如何显示出来的,主体流程可分为测量、布局、绘制这三步。...原创 2018-12-14 19:05:51 · 451 阅读 · 0 评论 -
Android插件化初体验
最近把Activity启动流程整体看了一遍,估摸着弄个啥来巩固下,发现插件化正好是这块技术的实践,而说道插件化其实有好几种实现方式,这里我用的是hook的方式实现,主要目的呢是为了对activity启动流程有个整体的认识,当然了本篇的插件化也只是一个demo版本并没有任何兼容适配,重在流程和原理的理解。概述插件化顾名思义,就是将一个APK拆成多个,当需要的时候下载对应插件APK加载的技术。...原创 2018-12-27 16:00:33 · 1359 阅读 · 12 评论 -
让你不再俱怕Fragment State Loss
让你不再俱怕Fragment State Loss使用过Fragment的人我相信对臭名昭著的状态丢失问题(IllegalStateException: Can not perform this action after onSaveInstanceState)一定不会陌生。曾经被这个问题困扰了很久,相信很多同学也是。花些时间来好好把它研究一下,以弄懂为何会有这样的问题产生,然后就可以解决转载 2017-07-22 23:07:59 · 889 阅读 · 1 评论 -
组件化实践
组件化方案近期公司有组件化的打算,因此对市面上的方案进行了调研,目前已经整理出一套作为项目组件化的方案,这里分享一波,当然组件化是没法一步到位的,中间肯定少不了踩坑优化,所以本篇也会持续更新。那么我们先说说组件化是干嘛的吧,组件化就是将单模块的项目拆成多个,并且每个模块可以单独运行。WTF!!!这么简单?对概念就是这么简单,但当我们去做的时候就会发现几个问题模块如何单独运行拆成独立...原创 2019-04-11 21:12:43 · 566 阅读 · 0 评论 -
Gradle入门(一)--Groovy常用语法
概述Groovy是一种可以用于构建的DSL,基于Jvm支持所有的Java语法,同时又对Java进行了扩展,提供了大量的语法糖去简化我们的代码。在开发中既能像Java一样用面向对象的方式编写,也能像脚本一样用面向过程的方式编写。而本篇我们主要介绍Groovy在Gradle脚本中常用的语法,如果你想知道更多可以到官网查看http://groovy-lang.org/。在开始之前你需要装好Java和...原创 2019-05-23 14:26:46 · 758 阅读 · 1 评论 -
Android ClassLoader浅析
前言最近在看Tinker的原理,发现核心是通过ClassLoader做的,由于之前也从未接触过ClassLoader趁着上周末看了安卓ClassLoader相关源码,这里分享一发安卓的ClassLoader和热更新的实现原理。ClassLoader首先我们要知道,程序在运行时要把对应的类加载到内存,在安卓上来说就是把Dex文件中的类加载到内存,这个加载流程是通过ClassLoader实现的。...原创 2018-10-26 17:01:01 · 2774 阅读 · 1 评论 -
关于Android MvvM的一些体会
关于Android MvvM的一些体会前言由于我司项目较老有很多历史包袱代码结构也比较混乱,需求复杂的页面动辄activity中1000多行,看着很是头疼,于是趁着加班提前做完需求余下的时间学习了mvvm对项目部分功能进行了改造,目前已经使用3个版本了,本篇博文分享下我使用的感受。准备这里先说说关于mvvm的几个问题(如有不对请轻喷 (╹▽╹))首先说说我为啥选择mvvm而不...原创 2018-09-26 10:19:14 · 9227 阅读 · 3 评论 -
rxjava操作符结合使用场景简介
rxjava操作符结合使用场景简介前言 本文将通过实际的例子来介绍rx相关的操作符,如果对rxjava还不熟悉的同学请先查看rxjava相关基础姿势再来查看本文准备 本文依赖rxjava版本如下implementation 'io.reactivex.rxjava2:rxjava:2.1.15'implementation 'io.reactivex....原创 2018-06-26 16:28:31 · 1160 阅读 · 8 评论 -
Android属性动画
Android 动画可以分为三种:view动画,帧动画,属性动画.前两种虽然使用比较简单但View animation,它只是改变了View对象绘制的位置,而没有改变View对象本身,并且只能支持简单的缩放、平移、旋转、透明度基本的动画,而帧动画是顺序的播放一组预先定义好的图片局限性也非常大,所以前两种动画本文略了重点就是介绍属性动画1.概述属性动画顾名思义,在动画的同时更改对象的属性,并且不止可以原创 2016-01-24 21:12:36 · 1716 阅读 · 2 评论 -
Android动画学习笔记-Android Animation
3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三种动画模式在SDK中被称为property animation,view animation,drawable animation。 可通过NineOldAndroids项目在3.0之前的系统中使用P转载 2016-01-20 17:25:40 · 865 阅读 · 0 评论 -
Android Scroller原理
Scroller弹性滑动实现原理原创 2016-01-15 17:09:06 · 1156 阅读 · 1 评论 -
(搬运)如何正确获得Android内置SD卡跟外置可插拔SD卡
外置sd卡路径,也许很多同学在平时的工作中并不会用到,因为现在很多机型都不支持外置sd卡(这也是Google目标),所以并不用考虑外置sd卡的路径问题。除了开发文件管理类的应用之外,其他应用使用 Enviroment 这个类中的一些静态方法就能满足需要。但也有一些特殊需求需要用到外置sd卡路径,那怎么才能准确获得外置sd卡的路径呢?转载 2015-12-31 17:17:22 · 5032 阅读 · 1 评论 -
View滑动效果的七种实现方式
关于android中可以滑动的控件可以说数不胜数,而同一个效果的实现方式也是非常多的,今天先用最简单的几种方式来感受下自定义控件滑动效果的产生,先上效果图布局都是一样的<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" x原创 2015-12-30 18:06:29 · 4361 阅读 · 5 评论 -
android canvas drawText()文字居中
drawText()文字居中方法原创 2015-12-25 11:09:21 · 34320 阅读 · 20 评论 -
布局加载器LayoutInflater讲解
LayoutInflater布局加载器讲解原创 2015-12-13 10:54:06 · 2304 阅读 · 15 评论 -
Android动画坐标系详解
前段时间写dialog底部弹出动画的时候明明觉得自己写的是对的,但效果却不对.相信很多人在写View动画的时候都遇到过这种情况.今天本文就对症下药,跟大家聊聊Animation动画坐标系,至于Animation动画的使用一般都会这里不过多赘言.Animation 动画一共有四个 1. AlphaAnimation 2. ScaleAnimation 3. RotateAnimation 4原创 2016-05-23 21:25:20 · 5841 阅读 · 3 评论 -
Android Bitmap 优化- 图片压缩
原文地址:http://anany.me/2015/10/15/bitmap1/一直以来Bitmap都是开发中很棘手的问题,这个问题就是传说中的OOM(java.lang.OutofMemoryError - 内存溢出),那么Bitmap为何如此丧失,令无数Android开发者所懊恼?一、Bitmap引发OOM的原因由于每个机型在编译ROM时都设置了一个应用堆内转载 2016-08-26 10:41:21 · 5406 阅读 · 4 评论 -
如何选择compileSdkVersion, minSdkVersion 和 targetSdkVersion
最近在搞项目6.0权限问题,正好借着这股劲把之前一直不太理解的compileSdkVersion, minSdkVersion 和 targetSdkVersion这三个属性看了下,看完后不禁的发出感慨原来就是这样啊…本文出自于对以下两篇文章的整理总结 http://chinagdg.org/2016/01/picking-your-compilesdkversion-minsdkversion原创 2016-09-24 11:15:30 · 12345 阅读 · 13 评论 -
ViewStub
由于最近正在封装下拉刷新上拉加载的库,为了进一步的优化ui,所以学习了下ViewStub,这里转载别人的blog分享给大家. 在Android开发中,经常会遇到这样的情况,在程序运行过程中动态的根据当前条件来决定是否显示某个控件或布局,那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制转载 2016-11-06 11:13:55 · 1494 阅读 · 0 评论 -
AIDL使用
最近有空就在看IPC,正好路过AIDL这里,发现基本忘干净了…正好借此机会回顾并记录下来,那么接下来我就先撸为敬了.AIDL用来做什么AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似。 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。 在 Android 上,一个进程通常无法访问另一个进程的内存。 尽管如此,进程需要将其对象分解成操原创 2016-12-10 20:53:16 · 1386 阅读 · 2 评论 -
Android自定义权限
转至http://www.cnblogs.com/whoislcj/p/6072718.html前言: 最近突然喜欢上一句诗:“宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒。” 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过程中讨论比较多的一个知识点Android 6.0 权限适配问题来进行学习,不过我不想直接进入这个主题转载 2017-01-22 15:09:11 · 1409 阅读 · 0 评论 -
AlarmManager-系统推荐的定时任务
近期leader提了很多这样的需求:每隔几个小时拉取服务器的配置信息存在本地、每隔一段时间跟服务端校对一下本地时间、每隔一段时间上传一下本地日志等等。其实这些本质都是定时任务,隔一段时间去干xxx,那么在安卓中定时任务无非三种实现方式,Handler(CountDownTimer)、Timer、while循环、AlarmManager。(如果有遗漏还望留言告知O(∩_∩)O谢谢)前三种大家基本都用过原创 2016-12-16 14:42:29 · 15045 阅读 · 6 评论 -
浏览器跳安卓应用
转至http://blog.youkuaiyun.com/jiangwei0910410003/article/details/23940445今天老大给我提了一个需求叫我调研一下,他已经测试了IOS平台上是可以的,需求很简单就是在系统浏览器中通过输入一个uri就可以打开相应的app。 比如你在IOS中的系统浏览器中输入:tel://123,就会跳到拨打电话页面而且拨打号码是123,像这样的命令,老大他用了小转载 2016-05-12 14:21:46 · 1876 阅读 · 3 评论