自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Compose:自定义触摸反馈

Toast.makeText(this, "发生事件: customClick", Toast.LENGTH_SHORT).show()})onClick()在 Compose 触摸事件类型主要有三种:PointerEventType.Press:按下事件,对应的 MotionEvent.ACTION_DOWN,多指的 MotionEvent.ACTION_POINTER_DOWN 也是返回它。

2023-09-29 16:35:24 445

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

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

2023-07-09 14:33:36 1886

原创 Compose:状态更新

我们先上一段代码,你觉得下面代码最终执行结果是什么:Text() 最终显示的结果还是 name,并没有在 3s 后更新为设置的值。为什么会这样呢?实际上上面的代码经过编译器编译后,代码类似是这样的:被通知刷新的 Text(name) 会被处理为例如被一个 WrapperFunction 包裹起来标记,在后续 name 更新的时候就会执行 WrapperFunction 代码块中的代码;因为 name 也被包裹在 WrapperFunction,所以 name 已经不是原先的那个 name,而是一个新的

2023-07-02 16:13:13 503

原创 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 2132 1

原创 Compose:自定义布局

当我们讲到原生的自定义布局,一般是指的自己实现一个 View 或者 ViewGroup 的子类,可能会重写 onMeasure() 和 onLayout() 达到我们想要的效果。但是在 Compose 所有的组件都是用纯 kotlin 代码,在定义自定义布局时,如果是单纯的摆放 Composable,可以认为是不算的:Compose 能通过 LayoutModifier 定制一个组件的测量布局效果:如果要自定义可以管控子组件的 Composable,Compose 提供了一个 Layout() 的 Co

2023-05-03 17:52:57 231 2

原创 Compose:自定义绘制

Compose 的绘制底层其实还是使用的 Canvas,不过相比原生的自定义绘制,Compose 提供了更上层的 API,这套 API 能让我们更简单更直接实现和原生一样的效果。并对其进行了详细的分析,所有的绘制步骤包括组件自身的绘制、手写的自定义绘制都是在 DrawModifier。我们可以用 DrawModifier 实现不同的绘制顺序。上面是一个文本,然后使用 Modifier.drawBehind() 绘制黄色的背景。可以发现使用 Compose 绘制和原生不同的是,

2023-04-29 13:12:02 153

原创 换肤实现及LayoutInflater原理

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

2023-04-26 14:02:00 688

原创 Okio 网络提速

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

2023-04-12 12:54:49 371

原创 Jetpack:DataBinding

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

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

原创 Compose:附带效应 SideEffect 和 Compose 中的协程

DisposableEffect 的使用场景比如界面埋点,还有设置进入界面时加上全局监听,退出界面时移除全局监听等等,具体还是看业务场景。SideEffect 从字面意思就是附带效应的意思,这里的附带效应指的是额外的作用。再具体到 Compose,,就是 SideEffect 的加强版。在 Compose 中。

2023-03-19 15:05:44 313

原创 Compose:ParentDataModifier

ParentDataModifier 的底层存储方式和 DrawModifier 以及 PointerInputModifier 相同,都是存储在链表中,整个链表在指定的数组索引位置:因为 Compose 是一个纯 UI 的框架,无论是 DrawModifier、PointerInputModifier 两者之间都没有关联,同理 ParentDataModifier,不过 ParentDataModifier 是和测量布局有一点关联用于辅助的 Modifier。我们在 LinearLayout 设置某个控

2023-03-15 23:29:51 38

原创 Compose:其他的 Modifier

OnRemeasuredModifier 和 OnPlacedModifier 分别对应的 onMeasure() 和 onLayout() 测量布局过程,也就是说它们是分开的,先执行测量然后再有布局,在 OnPlacedModifier 虽然也能拿到测量结果,但 OnRemeasuredModifier 会比 OnPlacedModifier 先回调测量结果。可以看到在 talkback 模式下文本也是可以被点击响应到,此时点击方块是没反应的,因为在无障碍场景点击它没有意义。

2023-03-15 23:29:40 136

原创 Compose:DrawModifier

这次 Modifier.drawWithContent() 后面有一个 background() 的 DrawModifier,background() 是 Modifier.drawWithContent() 原有的内部内容,在调用 Modifier.drawWithContent() 但没有填写任何内容,这将会擦除 background()。,如果是添加了 Modifier.background(),那么就是调用 background() 这个 DrawModifier 的 draw() 绘制自身。

2023-03-15 23:26:54 69

原创 Compose:PointerInputModifier

PointerInputModifier 是用来做触摸反馈的 Modifier,但实际上命名为 PointerInput 比 Touch 更合适,因为 PointerInput 还代指包含鼠标等输入反馈处理,只是在 Android 基本都是触摸事件。在讲 PointerInputModifier 之前,我们先了解下 Compose 的点击要怎么处理。

2023-03-15 23:26:46 263

原创 Compose:LayoutModifier

虽然提到测量和布局分别在 remeasure() 和 replace() 分别处理,按上面的源码分析,

2023-03-15 23:23:18 115

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

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

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

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

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

2023-01-09 20:16:15 1144

原创 TCP 协议深度剖析

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

2023-01-01 16:32:30 186

原创 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 1411

原创 Compose:Modifier、CombinedModifier 和 ComposedModifier

Compose Modifier

2022-11-05 15:51:04 137

原创 Jetpack:Lifecycle 和 LiveData

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

2022-10-04 11:08:50 381

原创 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 3092

原创 Compose:动画

Compose

2022-07-30 23:27:30 286

原创 Compose:State 状态订阅更新原理

compose

2022-07-13 16:14:55 423

原创 Compose:自定义 Composable

为什么要加 @Composable 注解才能用 Compose 的控件?在编译过程中这些组件会被 Compose 的编译器插件(Compiler Plugin)添加修改一些参数,调用的时候也是使用被修改参数后的函数。添加的参数准确的说是一个叫 Composer 类型的参数,加上它主要是有用到,而且通过注解的方式在编译时就加上,开发者也能很方便不用手动加上。这种方式就是典型的面向切面编程(AOP)。在我们熟知的 AOP 方案主要有两种:Annotation Processor 注解处理器修改字节码比如 ASM

2022-06-11 15:43:28 165

原创 Compose:Compose 写一个简单界面

文章目录声明式 UI从文字和图片到独立于平台的含义和未来传统 Layout 的 Compose 平替Modifier 两个特点:从内外边距说起从按钮到 MD:Compose 为啥这么分包?声明式 UI目前 Android 传统的 UI 界面编写流程是这样的:先在 xml 编写静态界面,然后在 Java 或 Kotlin 代码写业务逻辑时需要更新界面则手动更新 UI。这种写法叫做命令式 UI:<LinearLayout xmlns:android="http://schemas.android.c

2022-06-04 16:41:13 316

原创 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 3602

原创 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 3156

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

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

2022-05-19 16:00:01 2477

原创 IO 序列化的原理

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

2022-04-30 11:21:38 416

原创 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 900

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

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

2022-04-16 12:28:44 2711 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 4669

原创 JVM GC

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

2022-04-07 23:05:10 805

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

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

2022-04-04 18:40:54 2083

原创 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 843

原创 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 535

原创 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 482

转载 Android launchMode

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

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

转载 Glide做了哪些优化

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

2021-09-08 23:33:06 167

空空如也

空空如也

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

TA关注的人

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