自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Android 性能优化系列:启动优化进阶

应用的速度优化是我们使用最频繁,也是应用最重要的优化之一,它包括启动速度优化、页面打开速度优化、功能或业务执行速度优化等等,能够直接提升应用的用户体验。大部分人谈到速度优化,只能想到一些零碎的优化点,比如使用多线程、预加载等等,没有一个较为体系的优化方案。那么我们要怎么体系化的学习启动优化呢?能从哪些方面入手?从底层来看,CPU、缓存、任务调度是决定应用速度最本质的因素,CPU 和缓存都属于硬件层,任务调度机制则属于操作系统层。速度优化我们将围绕这三个因素详细说明优化方案。所有的程序最终会被编译成机器码指令

2023-07-09 14:33:36 839

原创 Android 性能优化系列:崩溃原因及捕获

java crash 由 JVM 触发处理,最终走到 /data/system/dropbox 目录用文件保存native crash 由管道通信建立 socket 接收通知,最终走到 /data/system/dropbox 目录用文件保存anr 由多种情况(事件、前后台服务)触发器处理,最终走到 /data/system/dropbox 目录用文件保存所有的 crash 处理在 Android 系统内部都会将对应的数据收集到 /data/system/dropbox 目录下。

2023-06-27 16:39:32 772 1

原创 换肤实现及LayoutInflater原理

不知道你在接到项目需求需要实现换肤功能时,有没有想过到底为什么需要换肤?虽然这是一篇技术文章,但我们不妨从产品和运营的角度想一想,实现换肤它究竟有什么样的价值?在 Android 10 从系统层面已经为我们提供了深色主题(也就是夜间模式),它也可以认为是换肤的一种,官方文档对深色主题列举了以下优势:可大幅减少耗电量(具体取决于设备的屏幕技术)为弱视以及对强光敏感的用户提高可视性让所有人都可以在光线较暗的环境中更轻松地使用设备系统提供给我们只有日间和夜间模式,从用户的角度它满足了在日间和夜间两种场景下更好的使

2023-04-26 14:02:00 553

原创 Okio 网络提速

Okio 简单来说就是一个对原生 IO 封装的三方库,Okio 最重要的是对缓冲区的设计。Okio 读写效率高是因为动态的缓冲区构建,缓冲区以 Segment 作为读写单位,每 8k 数据分配一个 Segment,最多 8 个 Segment 保证了至少在 64k 数据内只有一次数据拷贝一次上下文切换,减少用户空间和内核空间的交互次数,以达到在常规读写业务达到网络读写提速的目的。

2023-04-12 12:54:49 227

原创 Jetpack:DataBinding

该篇文章从布局绑定、注册监听、数据驱动 UI 更新各个流程都做了详细的源码分析,根据上面的内容我们再做对各流程做一个总结梳理。通过 Activity 的 setContentView() 加载布局根据布局根节点的 tag 属性 layout/activity_xxx_0 创建对应布局的 ViewDataBindingViewDataBinding 创建时遍历布局所有的 View 存到数组中,数组的 View 赋值给 ViewDataBinding 的控件变量。

2023-03-21 18:08:35 116 2

原创 设计原则与设计模式概览

创建型模式的核心:让你们知道怎么去 new 对象。让你考虑内存性能和扩展性,以及后续代码维护的工作量。再简单梳理下创建型模式的使用场景:单例模式:适用于类只允许创建一个对象(一般是进程内只有一个对象),被创建的类一般不需要太多的代码改动,并且不依赖外部系统时简单工厂:适用于代码不复杂、类型不多改动较少的对象创建场景工厂方法:对象创建条件比较复杂,要组合其他类对象和判断条件,做各种初始化操作的时候。

2023-02-17 10:24:16 151 1

原创 Android 组件化与路由跳转实现

路由是在 Android 组件化开发中必不可少的组件,两个独立的模块不能有直接引用,界面的跳转都经过路由中转实现。在讲路由之前,我们需要理解一个概念:什么是路由?路由本来是网络的概念,而放在 Android 开发中,我们可以将项目的每个 module 看成不同的网络,路由就是连接各个 module 的中转站,这个中转站可以对页面跳转的参数等统一处理后再进行转发。或许你会有这样的疑惑:隐式跳转也能实现跨 module,也可以实现相应的功能;还有也可以用反射来实现,为什么要用路由?

2023-01-09 20:16:15 625

原创 TCP 协议深度剖析

关于为什么是三次握手不能两次握手,网上很多文章提到说是消耗资源,

2023-01-01 16:32:30 96

原创 Android ASM

version:Java 版本号。例如 V1_8 代表 Java 8access:class 访问权限,一般默认都是 ACC_PUBLIC | ACC_SUPER。具体说明如下标志名称标志值含义ACC_PUBLIC0x0001是否为 public 类型ACC_FINAL0x0010是否被声明为 final,只有类可设置ACC_SUPER0x0020。

2022-12-15 13:40:49 887

原创 Jetpack:Lifecycle 和 LiveData

在讲解 Lifecycle 和 LiveData 之前,有必要说明下 Jetpack,官方对 Jetpack 的描述如下:简单理解 Jetpack,它是由多个库组成的、版本兼容的、让我们专注于业务代码的套件。其中 Lifecycle 和 LiveData 是 Jetpack 中的两个组件,也是比较重要的两个库;LiveData 使用了 Lifecycle,所以我们会先从 Lifecycle 开始讲起,然后再讲解 LiveData,这样会更方便原理。我们可以先思考一个问题:为什么需要 Lifecycle?在没

2022-10-04 11:08:50 230

原创 Android AMS(ActivityManagerService) 原理

为什么会有 AMSPMS 的作用:包管理、包解析、将解析结果缓存、提供查询接口AMS 是管理调度 Activity当没有 AMS、PMS 会发生什么?1、需要遍历 data/app2、解压 apk3、dom 解析 AndroidManifest.xml 解析出 Activity 标签4、获取到 Activity 全类名,反射构建对象5、跳转 MainActivity每次开启一个应用都要这么处理,效率是很低的,所以我们需要 PMS 和 AMS。前三个步骤由 PMS 管理,AMS 处理后面两

2022-10-01 15:52:07 2309

原创 Android PMS(PackageManagerService) 原理

为什么要有 PMS手机里面的 apk 都会在 data/app 目录下,知道这个 apk 路径很简单,难的地方在于怎么管理 apk 里面的信息,例如怎么提供给 AMS 需要的 Activity 信息等。所以就需要 PMS 提前将 apk 的信息缓存起来。PMS 缓存信息是在手机开机启动这段时间处理解析的,所以这也是为什么手机开启启动比较慢的原因之一。PMS 分析 apk 压缩文件当手机开机时,PMS 会扫描 data/app/package/base.apk,还有 system/app/packag

2022-05-24 13:48:14 2678

原创 Android 性能优化系列:ANR 触发原理与分析

文章目录系统内部对于 ANR 的生产过程什么是 ANR?ANR 发生场景系统对 ANR 的捕捉原理如何分析 ANR 文件traces.txt 分析技巧线程状态日志分析思路总结常见发生 ANR 场景及解决方案ANR 监控方案FileObserverANR WatchDog总结系统内部对于 ANR 的生产过程什么是 ANR?ANR(Application Not Responding)是指应用程序未响应,Android 系统对于一些事件需要在一定时间范围内完成,如果超过预定时间未能得到有效响应或者响应时间

2022-05-23 10:08:18 2073

原创 Android 性能优化系列:UI 与卡顿

渲染和布局优化VSync、Choreographer和Render Thread绘制流程原理

2022-05-19 16:00:01 1338

原创 IO 序列化的原理

文章目录序列化的概念与目的序列化协议与特性常见的序列化协议说明XML&SOAP(Simple Object Access Protocol)JSON(Javascript Object Notation)ProtobufSerializable序列化与反序列化原理Serializable 与 Parcelable 的性能比较序列化的概念与目的由于在系统底层,数据的传输形式是简单的字节序列,在 Java 中的表现就是 byte[] 二进制数据,即 在底层,系统不认识对象,只认识字节序列,而为了达到

2022-04-30 11:21:38 284

原创 IO 缓冲区与五种 IO 模型

文章目录IO 的基本常识操作系统的内核是一套软件IO 阻塞模型内核空间对 IO 的操作方案Java 对 Basic IO 的支持缓冲区(FileOutputStream 和 BufferedOutputStream)ByteArrayOutputStream从 IO 到 NIO 的演变Okio 对于 Java IO 的优化IO 的基本常识操作系统的内核是一套软件我们在 app 编写代码程序的时候会使用到 IO 操作,Java 也提供了相应的 API 例如 InputStream/OutputStrea

2022-04-22 23:03:43 696

原创 JVM 字节码文件与类加载

文章目录前端编译器与后端编译器解释执行和 JIT&AOT字节码文件结构(.class 和 .dex 文件结构)代码编译成字节码后是怎样的?程序想要运行代码,做了什么?(类的生命周期概述)类加载器的分类loadClassAndroid 类加载器热修复原理该篇文章是建立在 JVM 运行时数据区(栈和堆) 、JVM GC 和 JVM Hotspot 虚拟机与 Dalvik&ART 虚拟机堆栈的区别 三篇文章的基础上讲解,所以在阅读前建议先理解看完上述文章,会对该篇文章的理解很有帮助。在之前的篇

2022-04-16 12:28:44 2426 1

原创 JVM Hotspot 虚拟机与 Dalvik&ART 虚拟机堆栈的区别

文章目录Hotspot 虚拟机与 Dalvik 虚拟机的区别Dalvik&ART 内存管理模型JVM 与 Dalvik&ART 在栈的区别AOT(Ahead Of Time)预先编译机制JVM 与 Dalvik&ART 在堆的区别ART 的 GC 策略分配对象时执行 GC 的三个阶段强引用、软引用、弱引用、虚引用该篇内容会基于 JVM 运行时数据区(栈和堆) 和 JVM GC 两篇文章的理论知识上讲解,所以建议看完理解后再学习该篇文章会对知识的学习比较有帮助。Hotspot 虚拟

2022-04-09 17:35:58 4344

原创 JVM GC

文章目录GC 核心概述Java 自动化内存管理什么是垃圾?内存碎片的概念为什么需要 GC?GC 相关算法对比垃圾回收相关算法引用计数算法可达性分析算法标记-清除算法复制算法标记-压缩/整理算法算法性能指标对比分代收集算法增量收集算法分区算法常用的垃圾回收器常用的 7 种垃圾回收器垃圾回收的并行与串行垃圾回收的并行与并发常用 GC 垃圾回收器对比CMS 回收器评估 GC 的性能指标MAT 及 Profiler 应用及程序调优MAT内存抖动与内存泄漏GC 核心概述Java 自动化内存管理什么是垃圾?内存

2022-04-07 23:05:10 671

原创 JVM 运行时数据区(栈和堆)

文章目录JVM 是一种规范什么是 JVM?为什么 JVM 是一种规范?Java 程序的执行过程JVM 与字节码文件栈指令集架构和寄存器指令集架构Hotspot 虚拟机及 Dalvik&ART 虚拟机JVM 的组成部分及架构运行时数据区方法调用过程虚拟机栈基本信息程序计数器/PC寄存器栈帧内部结构解析局部变量表操作数栈动态链接方法返回地址异常表对象分配过程线程共享区域方法区直接内存深入辨析堆栈内存溢出JVM 是一种规范什么是 JVM?为什么 JVM 是一种规范?很多时候我们提到 JVM,都会默认

2022-04-04 18:40:54 1704

原创 Android 系统启动流程与 Zygote、SystemServer

文章目录init 进程Zygote 进程SystemServer 进程ServiceManager 进程问题init 进程init 进程的 id 为 1,0 是 linux 内核,在 linux 中 id 的大小和启动顺序有关,意思是 linux 内核启动后,启动的就是 init 进程。init 进程主要有两个作用:启动系统关键的服务守护关键服务,重启手机怎样的服务属于关键服务?关键服务是对于手机而言必不可少的服务,比如网络服务、蓝牙服务、铃声服务,而 AMS、PMS 等这些父进程不

2022-03-27 17:23:27 493

原创 Java AQS(AbstractQueuedSynchronizer)

文章目录什么是 AQS?AQS 核心思想自定义 AQSAQS 源码分析ReentrantLock 与 AQSReentrantLock 加锁流程条件变量实现原理同步方案对比ReentrantReadWriteLock 读写锁CyclicBarrier 和 CountDownLatch什么是 AQS?AQS(AbstractQueuedSynchronizer),位于 java.util.concurrent.locks 包下的一个类,它是 jdk 1.5 提供的一套用于实现阻塞锁和一系列依赖 FIFO(

2022-03-23 23:34:17 463

原创 Java synchronized 与 CAS(Compare And Swap)

文章目录线程安全性分析synchronized对象中的 mark word 对并发的支持重量级锁偏向锁轻量级锁锁膨胀CAS 原理总结线程安全性分析在系统处理过程中,最为常见的问题是多个线程对于相同资源进行访问所造成的数据处理异常问题。看下面的例子:public static int counter;public static void main(String[] args) { Thread t1 = new Thread(() -> { for (int i = 0; i <

2022-03-19 21:21:09 347

转载 Android launchMode

很多 Android 工程师在投简历找工作之前,会去复习一下 Activity 的 launchMode 启动模式,因为面试的时候会考,但真正把它搞懂的人是很少的,包括很多拿它做面试题的面试官。当用户在使用 App 的时候,按下了 Home 键,然后再切回来,或者在多个 App 之间切来切去,App 的内容会不会改变,会怎么改变,要怎么让它按你的需求去变或者不变,这些问题都需要你对 launchMode 有足够的了解;而且不止 launchMode,这是一个以 Activity 的回退栈为核心的大话题,你

2021-12-05 23:50:50 480 1

转载 Glide做了哪些优化

为了性能,Glide做了哪些优化

2021-09-08 23:33:06 133

转载 Android RecyclerView原理

文章目录从ListView到RecyclerViewRecyclerView核心运行机制ListView复用机制RecyclerView中的缓存RecyclerView核心机制RecyclerView复用机制源码解析从ListView到RecyclerViewRecyclerView 是在 Google I/O 在2014年时推出的控件,在 RecyclerView 还未出现前,列表的都是使用的 ListView,ListView 通过 View 和 Adapter 的组合将数据展示出来,现在应该基本都

2021-04-24 15:54:32 2031 2

原创 Android 性能优化系列:包体积优化

文章目录包体积优化的方式包体积优化的方式代码优化、资源优化、so库优化

2021-01-12 11:13:02 1459 1

原创 Android性能优化系列:CPU收敛优化(线程优化)

文章目录线程调度的原理Android的线程调度线程调度的原理任意时刻,只有一个线程占用CPU,处于运行状态多线程并发:轮流获取CPU使用权Android的线程调度

2021-01-11 18:06:59 2836

原创 OkHttp 源码解析

1 OkHttp的使用OkHttp的基本使用参考我另外一篇文章:https://blog.csdn.net/qq_31339141/article/details/901719262 OkHttp请求解析

2021-01-10 15:54:29 959 2

转载 SOLID原则:单一职责原则(SRP)

SOLID:SOLID原则并非单纯的1个原则,而是由5个设计原则组成,它们分别是:单一职责原则、开闭原则、里式替换原则、接口隔离原则和依赖反转原则,SOLID由5个设计原则的头一个字母组成。如何理解单一职责原则(SRP)?如何判断类的职责足够单一?类的职责是否设计得越单一越好?...

2020-12-26 20:45:20 793

转载 SOLID原则:开闭原则(OCP)

SOLID:SOLID原则并非单纯的1个原则,而是由5个设计原则组成,它们分别是:单一职责原则、开闭原则、里式替换原则、接口隔离原则和依赖反转原则,SOLID由5个设计原则的头一个字母组成。开闭原则是SOLID中最难理解、最难掌握,同时也是最有用的一条原则。之所以这条原则难理解,那是因为需要判定以下问题:怎样的代码改动才被定义为“扩展”?怎样的代码改动才被定义为“修改”?怎样才算满足或违反开闭原则?修改代码就一定意味着违反开闭原则吗?之所以这条原则难掌握,那是因为需要理.

2020-12-26 20:43:02 414

转载 SOLID原则:里氏替换原则(LSP)

SOLID:SOLID原则并非单纯的1个原则,而是由5个设计原则组成,它们分别是:单一职责原则、开闭原则、里式替换原则、接口隔离原则和依赖反转原则,SOLID由5个设计原则的头一个字母组成。如何理解里氏替换原则?里氏替换原则(Liskov Substitution Principle,LSP),这个原则最早是在1986年由Barbara Liskov提出,他是这么描述这条原则的:If S is a subtype of T, then objects of type T may be repla.

2020-12-26 20:39:19 304

转载 SOLID原则:接口隔离原则(ISP)

SOLID:SOLID原则并非单纯的1个原则,而是由5个设计原则组成,它们分别是:单一职责原则、开闭原则、里式替换原则、接口隔离原则和依赖反转原则,SOLID由5个设计原则的头一个字母组成。如何理解接口隔离原则?接口隔离原则(Interface Segregation Principle,ISP),Robert Martin在SOLID原则中这样定义它:Clients should not be forced to depend upon interfaces that they do not .

2020-12-26 20:36:43 314

转载 SOLID原则:依赖反转原则(DIP)

SOLID:SOLID原则并非单纯的1个原则,而是由5个设计原则组成,它们分别是:单一职责原则、开闭原则、里式替换原则、接口隔离原则和依赖反转原则,SOLID由5个设计原则的头一个字母组成。单一职责原则和开闭原则的原理比较简单,但是,想要在实践中用好却比较难。而现在讲的依赖反转原则正好相反,原则用起来比较简单,但概念理解起来比较难。要理解依赖反转原则,我们需要先理解下面几个问题:“依赖反转”这个概念指的是“谁跟谁”的“什么依赖”被反转了?“反转”两个字该如何理解?“控制反转”和“依赖注入”.

2020-12-26 20:32:13 207

转载 KISS原则和YAGNI原则

如何理解KISS原则?KISS原则的英文描述有好几个版本:Keep It Simple and StupidKeep It Short and SimpleKeep It Simple and Straightforward它们表达的意思其实都差不多,其实就是:尽量保持简单。我们知道,代码的可读性和可维护性是衡量代码质量非常重要的两个标准。而KISS原则就是保持代码可读性和可维护性的重要手段。代码足够简单,也就意味着很容易读懂,bug比较难隐藏。即便出现bug,修复起来也比较简单。代码行数

2020-12-26 20:28:34 200

转载 迪米特法则(LOD)

何为“高内聚、松耦合”?“高内聚、松耦合”是一个非常重要的设计思想,能够有效地提高代码地可读性和可维护性,缩小功能改动导致地代码改动范围。很多设计原则都以实现代码的“高内聚、松耦合”为目的,比如单一职责、基于接口而非实现编程等。“高内聚、松耦合”可以用来指导不同粒度代码的设计与开发,“高内聚”用来指导类本身的设计,“松耦合”用来指导类与类之间依赖关系的设计。不过,这两者并非完全独立不相干,高内聚有助于松耦合,松耦合又需要高内聚的支持。什么是“高内聚”?所谓高内聚,就是指相近的功能应该放到同一个类中,

2020-12-26 20:25:34 1783

转载 DRY原则

DRY原则代码复用性(Code Reusability)

2020-12-26 20:23:28 1142 1

原创 Android Handler

1 Handler的组成部分MessageQueue:消息队列,内部采用单链表的数据结构存储消息列表,只有存储消息的功能,不具备处理消息功能。Looper:主线程默认有创建,如果要在其他线程中使用Handler,需要创建Looper,Looper是和被创建的Handler同处在一个线程中的;Looper可以通过ThreadLocal获取到,消息处理由Looper执行。2 Hand...

2020-12-11 23:01:51 350

转载 Android性能优化系列:Android Studio Profiler

使用 Android Studio Profiler 工具解析应用的内存和 CPU 使用数据

2020-10-02 22:45:14 405

原创 Android性能优化系列:内存优化

实践App内存优化:如何有序地做内存分析与优化

2020-10-02 21:54:56 4795 2

空空如也

空空如也

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

TA关注的人

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