自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 说说我们每天接触的Java锁吧

背景: 不管是做Java开发、C开发、IOS开发还是Android开发,都会遇到多线程开发的需求场景。那么问题就来了,多线程开发时无法避免的就要考虑线程安全和线程通信的问题。今天我们主要讲讲线程安全问题,Android中可能大家用synchronized关键字用多了、久了就对锁的概念缺乏了认知,所以这里就简单回顾补充一下这方面知识。一、线程并发访问的问题 程序运行时JVM会将我们的内存分成线程私有和线程公有两大块,这个在之前的内存优化篇章里面也有详细的介绍过,这里就不再...

2022-03-10 16:19:39 3426

原创 老生常谈的OkHttp

OkHttp工作原理总是记不住?

2022-03-06 15:55:09 5138

原创 聊聊你熟悉的HTTP和HTTPS

背景:前面我们已经了解过回顾过TCP/IP相关知识了。但是作为Android开发,很多人实际上正面接触传输层的TCP协议的机会并不是很多。大部分时候我们接触的最多的还是应用层的HTTP和HTTPS协议。所以这篇我们就来聊一聊HTTP和HTTPS。一、HTTP协议HTTP协议又称应用层超文本传输协议。1.1、HTTP URL解析与报文结构1.1.1、URL解析我们常常访问一个网页,发现又一大串如下的字符串。而这一大串字符串就是HTTP网络请求的URL,如...

2022-03-04 17:27:16 2888

原创 你真的了解TCP/IP吗

背景:从我们进入IT行业的那一刻起就不停的接触到TCP/IP协议。但是多数人多数时候对TCP/IP协议都知之甚浅,只是浅显的知道TCP是基于链接的可靠传输协议,有三次握手四次挥手,然后就没了。这篇文章就稍微补充一点这方面的知识。一、网络模型网络模型大致可以分:TCP/IP模型和OS模型。如下图可以发现,TCP/IP模型实际上就是将OS模型进行了更笼统的划分。主要分为如下四大层:应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、 网络远程访问协议(T.

2022-03-02 13:38:01 6758

原创 AMS进阶——如何启动没有注册的Activity

背景:前面我们通过梳理了Activity启动的整个流程知道:Activity的启动主要经历如下几个阶段:发起Activity启动 与AMS建立通信节点,主要是在Instrumentation类中获取AMS的Binder代理,准备通信。 由应用进程切到系统进程(system_service)的AMS服务,由AMS判断应用进程是否创建,如果没有创建则AMS与Zegote进程通信创建应用进程。 应用进程创建后,启动应用进程,再由应用进程切到AMS服务,AMS进一步做启动Activity的校验(如:A

2022-03-01 14:07:54 2639

原创 AMS知识点——Activity的启动流程

Activity启动流程分析

2022-02-27 15:54:47 2131

原创 Android性能优化之内存优化浅析

一、背景Android由于是以Java语言为主要开发语言,所以它的内存管理并不像C语言那样由开发者去管理内存的分配以及回收等,而是交由JVM虚拟机的内存回收机制去处理。这就导致我们在开发过程中难免会遇到内存相关的各种问题带来的困扰。而这些问题的根源就在于我们对Android的内存管理机制的不够了解,以及开发过程中缺少对内存的关注导致。所以这里借这篇文章我们再回顾一下Android的内存管理机制,以及如何在开发过程中去尽量避免这些内存问题。二、内存管理—内存划分Android中的内...

2022-02-03 15:41:43 2437

原创 手撸热修复框架(三)——补丁包的自动生成框架

前言手撸热修复框架(一)——热修复原理探究手撸热修复框架(二)——如何替换补丁包手撸热修复框架(三)——如何生成补丁包上一章我们讲了一下如何通过加载补丁包dex的方式来进行热修复的原理,但是这个补丁包要如何获取呢?这一节我们就来讲讲如何来自动生成补丁包。这一章我们会接触两个新的知识点:插桩技术和gradle插件开发。一、插桩技术上一节我们在讲解热修复过程中会提到了字节码插桩的概念,那么要如何实现字节码插桩呢?(1)字节码插桩能干吗?我们都知道,我们写的.java文件会被编译成

2020-11-19 17:02:05 756

原创 手撸热修复框架(二)——加载补丁包修复Bug

前言手撸热修复框架(一)手撸热修复框架(二)手撸热修复框架(三)前面我们简单了解了几个热门热修复框架的实现和原理,以及优缺点。从自身的能力和目前的知识结构出发,我们选择模仿QZone框架并参考tinker的部分实现来一步步实现自己的热修复框架。一、热修复分析既然我们选择模仿QZone,那么也就是选择通过ClassLoader的类加载原理来实现热修复。所以我们必须要弄清楚ClassLoader是如何加载一个类的。这一部分内容在前面Android类加载原理章节我们已经讲过了,还不清楚的建

2020-11-19 17:01:07 1542

原创 手撸热修复框架(一)——热门框架对比与原理

一、背景热修复技术其实已经出来很久了,目前市面上只要是能上得了台面的App基本都加入这项强大技术来实现bug修复功能。但是我相信依旧有很多做Android开发的朋友和我一样都还是停留在知道有这项技术,但是不知道怎么用这项技术,更加不用说它的实现原理了。我觉得出现这样一个现象的原因有两个,一个是现实中没有项目去驱动我们做这件事,二个就是很多人都讨厌甚至惧怕接触新的技术,毕竟头发比较宝贵嘛。但是这也就是我们为什么薪水同样没有别人高的原因,学无止境!今天我们就一点点的记录下我们手撸热修复框架的学习过程。其

2020-11-19 16:59:44 2671

原创 进程保活与拉活——APP黑科技,永生不死!

我相信很多开发朋友都像我一样遇到过这样的需求,尤其是开发过IM对实时性要求比较高的朋友。一定遇到过老板或者产品经理发出来的要求我们做到像微信,钉钉等等这些大厂应用一样保持应用一直保活,能够实时接收到推送或者消息的功能需求。然后了解情况的人其实都知道,Android系统现在每个版本升级在应用保活这块已经被限制的很死了,6.0以前的那一套保活方法已经基本失效了。目的就是降低系统功耗,降低安全风险,避免流氓软件。但是产品经理可不管这些,他们的要求是:微信有的我也要有,微信能做出来我也要,至于如何去实现我管不着,但

2020-09-03 22:56:39 3531

原创 自定义控件——视图动画

Android中的动画主要分为两大类,视图动画和属性动画。我相信这在我们参加面试的时候面试官必问的问题。但是关键的是当面试官问这一知识点的时候我们通常都是过不了关的。那么这里我们就着重讲一下视图动画这个分支。什么叫视图动画呢,顾名思义它主要针对的就是View视图。视图动画又可分为两个分支:补间动画、逐帧动画一、补间动画根据不同的动画效果,补间动画又分为4种动画:平移动画(Tr...

2020-02-27 14:12:19 1362

原创 RecyclerView的缓存机制——复用机制

前面我们在讲RecyclerView回收机制的时候已经提及了它复用机制。但是并没有沿着复用分支继续向下研究,这里将补齐复用分支的源码分析,让我们来看一下RecyclerView是如何实现VH复用的。在讲回收机制的时候我们说回收机制有两个入口onTouch和onLayout。相应的复用同样也是两个入口。但是两个入口的复用逻辑都是从LinearLayoutManager.layoutChunk()...

2019-12-27 15:40:55 475

原创 RecyclerView的缓存机制——回收机制

如今在开发中RecyclerView已经基本替代了ListView来实现列表展示。而RecyclerView被说的最多的就是它的缓存机制,这也理所当然成了面试官的最爱啦。所以弄明白它的缓存机制就成了我们这些开发人员的必修课啦!而要弄明白它的缓存机制,我们就要一点点的去抠它的源码,有人问这一步能不能省了。我想说我也想省,但是现实告诉我们,只看几篇博客(包括我这篇)而不去抠几遍源码时无法理解透彻R...

2019-12-26 17:26:34 600

原创 自定义View基础——View的测量与流程基础

我们都知道,自定义View的三大流程:Measure、Layout、Draw。而学习这三个流程是我们进阶高级UI的毕竟之路,但是在学习在三个流程之前,一些基础知识是必不可少的,否则只会导致我们越学越难。所以在学习Measure流程之前我们需要先弄清楚这个过程中几个最重要的知识点一、LayoutParams到底是什么1、LayoutParams的定义LayoutParams顾名思义,就是...

2019-12-16 15:35:59 336

原创 自定义View基础——Android中的坐标

一、基础很多人一想到学习自定义UI就开始去研究Measure、Draw、Layout、画笔、画布、动画等这些知识,但是学着学着却发现越来越难。出现这样的现象,我觉得最重要的一个原因就是我们还没学会爬就开始想着跑了。既然要学习自定义View,却不了解Android各种坐标系以及它的各个API的坐标含义绝对是在误入歧途。你都不知道你当前View在整个坐标系中相对坐标,那你绘制出来又有什么意义呢?所...

2019-12-12 15:23:58 302

原创 事件分发的逻辑理清了吗

事件分发还是要多看看源码

2019-12-10 21:04:01 341

原创 通过AIDL看Binder

上一章我们简单的了解了一下Binder的知识,但是日常开发中我们最容易接触到的关于Binder相关的就数Aidl开发最多了,于是每次做Aidl开发的时候我们都需要打开百度,一顿操作,一顿CV。最后程序一执行还是不停报错,或者勉强完成了这次的小功能,下次来个新功能,又要重复上述操作。究其根本原因就是我们只是为了完成任务,却没有去真正的弄明白Aidl开发是个怎么回事,没有弄明白它的基本原理是什么。本人...

2019-10-24 17:22:34 232

原创 一问就懵逼的Binder(一)

一、为什么要用Binder机制Android系统为每个应用在分配进程的时候都是有内存限制如现在常见的64M啊等等。同时很多应用为了避免自己的核心业务被系统杀死,这个时候就需要将核心业务运行在单独的进程中,且各个进程组成一个守护进程来达到保活和唤醒的功能。于是这个时候就要用到进程间通信了,而进程间通信的方式又很多种,如在C语言中我们常说的socket、共享内存、管道、信号量等等。在Android...

2019-09-30 14:42:31 517

原创 浅析Activity生命周期和启动模式

一、Activity堆栈Task盖概念Android开发的朋友应该都听过Activity堆栈Task。但是有多少人研究过这个Task?或者说了解过这个Task呢?它是属于应用的还是属于系统的?Task是如何管理Activity的?这些问题都需要我们一一的去弄明白。1、首先要明确一个概念:Activity是属于Application的。但是Task是属于系统的,它是跨应用的。当用户...

2019-09-30 13:49:38 188

原创 IO实战一:Apk加解密

背景为什么要进行apk加密?答案是避免apk被有心人反编译,窃取公司重要技术和算法等。但是要给Apk加密要如何实现呢?首先我们需要知道Android整个Apk的打包流程,然后将加密的环节插入要其中的步骤中,加密完成后apk安装后要如何解密,这时候我们又要了解应用安装时apk是如何被加载运行。这一系列的问题都需要我们除了掌握IO知识外还要掌握如:类加载、热修复、反射、hook等知识。这里我们将借...

2019-09-20 16:19:49 3033 1

原创 如何应对Java的IO面试

可能很多朋友都和我一样,觉得IO不就输入输出流,读写操作吗?有什么好讲好写的?会用就行啦。但是现实却往往会给我们一个响亮的大耳光,往往在开发中我们会突然发现:妈的,IO是个什么鬼,我要怎么用?他能干什么?还有就是Java里面那么多IO类我要用哪一个?或者在参加面试的时候会被面试官劈头盖脸一顿骂:Java IO都没搞清楚你还敢说自己是做Android开发的?还敢说自己精通Android开发?还敢要这...

2019-09-17 15:49:26 275

原创 Android中的序列化方案

一、Serializable接口Serializable是 Java 提供的序列化接口,它是一个空接口,里面什么都没有,那么这个序列化和反序列化的工作的细节最后是谁来完成的呢?答案是:Serializable默认由JVM来完成这些工作,可以理解成Serializable 接口只是一个提供给JVM识别的标识接口。public interface Serializable {}Seria...

2019-08-23 16:41:26 349

原创 Java序列化基础

一、背景我们做软件开发的应该知道,系统将内存分为用户空间和内核空间。内核空间能够与所有用户空间进行直接通信,而用户空间与用户空间之间是无法进行直接通信。于是为了用户空间与用户空间之间通信,进程间通信技术(IPC)应运而生了。但是系统底层只认识字节序列,而Java是面向对象的,于是序列化与反序列化成了解决方案。二、序列化定义由于在系统底层,数据的传输形式是简单的字节序列形式传递,即在底层...

2019-08-23 14:41:29 168

原创 注解——dagger的使用和原理

一、什么叫依赖和依赖倒置依赖是类与类之间的连接,依赖关系表示一个类依赖于另一个类的定义,通俗来讲就是一种需要。依赖倒置是面向对象设计领域的一种软件设计原则。这里就要逐一讲一下,软件设计的 6 大设计原则,合称 SOLID1、单一职责原则(Single Responsibility Principle,简称SRP )核心思想: 应该有且仅有一个原因引起类的变更,啥意思呢?就是说一个类...

2019-08-14 22:23:59 585

原创 注解——基本使用和原理

直到写这篇博客之前,其实我和很多同学都一样,听过注解,看过别人用注解,第三方框架到处都是注解。然而如果有人问我注解是什么,怎么用,用来干嘛的。我只能恨不得摇断脖子,就更加不用说能在工作中使用注解了,想研究像EventBus等第三方框架时,一遇到注解前功尽弃。所以说到底还是底子差,不懂注解的程序员成不了好的架构师。二话不说学吧。一、注解的定义和使用(1)注解概念定义这里就不贴官方的定义了...

2019-08-05 16:59:23 443

原创 函数式编程概念-Lambda表达式

一、函数式编程概念面向对象编程是对数据进行抽象,而函数式编程是对行为进行抽象。现实世界中,数据和行为并存,程序也是如此,因此这两种编程方式我们都得学,而学好这些编程思想并不是一天两天的事情。我们首先要关心的是如何应用现有知识写出质量更高的代码。而写好写出高质量的代码就又需要我们不断的更新自己的知识面,跟上新技术的节奏。前面我们在学RxJava的时候就常用到类似下面这种写法。RxView....

2019-07-28 22:10:37 287

原创 RxJava(二)——原理与源码

RxJava除了要知道它的核心思想和基本概念我们还应该弄明白什么呢?必然是原理级别的啦,为什么RxJava可以使用链式调用,在源码中这个链式调用是怎么体现的?RxJava是如何实现线程切换的,以及为什么设置线程规则时subscribeOn只有第一次设置生效,而observeOn可以设置多次生效?RxJava2中的背压策略是什么?这些问题都是本章我们需要一一去研究弄明白的知识点。一、RxJava...

2019-07-14 21:05:31 260

原创 RxJava(一)——基础

背景:RxJava是目前最火的响应式编程框架之一。目前已经更新到RxJava2.0版本,我们平时在开发过程中遇到最多和使用最多的一种第三方框架,因为它使用起来方便快捷、成本低。而且现在有很多其他第三方框架都是基于RxJava来实现的,如Android 6.0之后的动态权限申请框架RxPermission。所以学习使用RxJava是迫在眉睫的事情,但是光会使用还不行,因为面试官要的永远不是你会使...

2019-07-14 20:47:24 308

原创 Android热修复核心——ClassLoader

背景:如今比较火的技术中热修复算是一种了。他能够帮助我们在不升级应用版本的情况下修复应用Bug。那么这种技术如何实现呢?这里我们先不急着讲如何去实现热修复,因为能力还达不到。我们先了解一下这个技术的核心:类加载。一、概念了解:Dalvik和ART(1)什么是Dalvik上一章我们讲了Java虚拟机JVM。但实际上Java中JVM可以理解为一种虚拟机规范,现实中各家都根据这个规范开发...

2019-07-03 20:10:34 263

原创 一问三不知的Java虚拟机

有人可能会说,你一个做Android开发的要研究虚拟机干嘛。嗯,可能是女朋友不在身边闲的。但是不学不行啊,现在出门面试,面试官都是各种原理,各种虚拟机知识的问。然后就是各种一问三不知,最后就是各种回家等通知的GG了。所以不学Java虚拟机的Android开发不是好的攻城狮。一、虚拟机的历史这个去网上一搜一大堆,都写烂了。这里就不再写了。想了解的去百度一下吧。二、JVM是干嘛的...

2019-06-29 21:13:36 225

原创 多线程三部曲——线程间同步与通信

学习多线程,那线程间同步与通信是必不可少得内容啦!首先我们讲一下什么是线程间同步,其实我们在上一章已经提到过一种线程间通信方式了:Handler作为线程间通信得桥梁,也是最常用得线程间通信方式。那线程间通信还有其他方式吗?答案是有滴。一、线程间通信方式(1)、Handler桥梁在Android中Handler机制是系统核心机制的重要成员之一,可以说整个Android系统几乎都是运行...

2019-06-16 20:50:47 314

原创 多线程三部曲——多线程的实现方式

前面讲了很多多线程的概念和创建原理,但是在Android中如何实现多线程,有几种实现多线程的方式?他们各自的实现原理是什么?以及他们之间的区别是什么?一、多线程之线程池线程池可以看成是一个线程的集合,需要运行任务时从池中拿一个线程来执行,执行完毕,线程放回池中。它内部又分为核心线程和非核心线程。在开发过程中,合理地使用线程池能够带来3个好处:(1):降低资源消耗。通过重复利用已创建...

2019-06-15 18:46:09 301

原创 多线程三部曲——线程概念与启动

平时开发过程中,多线程编程开发是我们必须掌握的技能。那么什么是多线程?如何创建多线程,什么又是线程间通信以及线程安全?下面我们就一个问题一个问题的来解答。一、基本概念在讲什么是多线程以及多线程编程注意项之前我们需要先了解几个基本概念。(1)、CPU核心数和线程数的关系如今手机都是四核、八核。那么这个核说的就是CPU的核心数。而核心数与线程数是1:1的关系,也就是说一个4核的CPU,...

2019-06-15 16:52:42 217

原创 反射原理及动态代理模式(二)

一、什么是代理模式前面说了那么多原理,那么反射到底什么时候用呢?研究过设计模式的朋友应该听过代理模式,代理模式就是给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用(经常找人代购各种化妆品的小姐姐应该一听就明白了,如果还有不懂的男同胞,那只能祝你金牌单身汪快乐!哈哈)。代理模式又分为静态代理模式和动态代理模式。而动态代理模式就需要用到我们的反射。二静态代理和动态代理的区别这里...

2019-05-25 18:30:21 212

原创 反射原理及动态代理模式(一)

背景做Java或者Android开发的攻城狮们应该都听过反射(别想歪了,别开车,兄得)。或者根本就没听过,当有前辈提起说某个功能可以用反射实现,你试一下的时候,很多人和我一样可能就一脸懵逼了。这里我就把自己学习到了关于反射的知识,和大家分享一下。一、什么是反射首先,什么是反射,我们为什么要用反射或者什么时候需要用反射呢?反射反射,关键就在于它那个反字上(不是射哦。sorry,又开车啦...

2019-05-25 18:30:04 220

原创 框架设计之MVP模式

背景随着Java/Android技术快速的发展更新,同时为了开发更快捷、代码可读性更高、更解耦(UI和数据逻辑的解耦)一堆牛人设计了一堆的框架模式。在Android中最出名的莫过于MVC、MVP、MVVM这三种模式了。首先我们分别讲一讲这三种设计模式的原理,以及优缺点。最后我将结合公司目前的项目利用前面说过的泛型来实现一个通用版的MVP模式架构。一、MVC模式MVC全名是Mode...

2019-05-20 19:26:03 440

原创 泛型方法

前面两章我们介绍了泛型类和泛型接口,这篇我们来讲解一下什么是泛型方法,其实在讲泛型类的时候我们已经有提到过泛型方法,只是没有去细说。那么什么又是泛型方法呢?泛型方法如何定义?泛型方法和普通方法有什么区别呢?一、怎么定义一个泛型方法首先我们来讲一下如何来定义一个泛型方法,他在写法上与普通方法有什么不同/**定义一个泛型方法的语法如下* 方法作用域修饰符 <泛型类型>...

2019-05-11 21:14:00 5703

原创 泛型接口

前面泛型类我们详细的讲解了什么是泛型类以及泛型类的使用。但是大家都知道,Java中除了类还有接口。那么泛型也不例外,泛型同样有接口,那么泛型接口是什么呢、泛型接口如何定义呢以及泛型接口有什么作用呢?我们再次带着这些问题来讲解泛型的第二篇章:泛型接口一、泛型接口如何定义泛型接口的定义和泛型类的定义一样,区别就在于一个是接口需要实现各个接口方法,一个是类,需要实现对应的抽象方法。/**...

2019-05-11 20:24:14 3065

原创 泛型类

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。注意,这也是他的特点,在编译期就能够进行类型检测,而不是运行时进行检测。我们通常写一个方法时都会有形参,当调用方法时传入具体的实参。但这种情况参数的类型是固定的。也就是说这个方法只能传固定类型的实参。但是在开发中很多时候或者设计框架的时候我们都不知...

2019-05-11 19:13:12 1139

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除