自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Framework学习之旅:Zygote进程

在Android系统中,DVM(Dalvik 虚拟机和ART、应用程序进程以及运行系统的关键服务SystemServer进程都是由Zygote进程来创建的。通过fork(复制进程)的形式来创建应用程进程和SystemServer进程,由于Zygote进程在启动时会创建DVM或者ART,因此通过 fork而创建的应用程序进程和SystemServer进程可以在内部获取DVM或者ART实例副本。

2023-02-19 10:35:30 723 1

原创 Framework学习之旅:Service的绑定过程

Service的绑定过程将分为两个部分来进行讲解;分别是Contextlmpl到AMS的调用过程和Service的绑定过程。}通过Framework 学习之旅:Service 启动过程= null) {= null) {} else {try {// activity在系统端的 token IBinder token = getActivityToken();

2022-12-18 17:41:19 568

原创 Framework 学习之旅:Service 启动过程

Service 的启动过程将分为两个部分,分别是ContextImpl到ActivityManageService调用过程和ActivityThread启动Service过程。一般启动服务操作在Activity中调用startService方法,从Activity的startService开始进行了解,Activity继承ContextWrapper,所以调用的是ContextWrapper的startService方法。从以上代码可知,startService方法最终调用的是mBase的startSer

2022-12-04 19:02:41 809

原创 Dart 笔记:函数

函数也是对象并且类型为Function,这意味着函数可以被赋值给变量或者作为其它函数的参数。=> 是{ return 表达式;}的简写,=> 称之为箭头函数。在=>与;之间的只能是表达式而非语句。

2022-11-27 09:51:34 555

原创 Dart 笔记:变量和内置类型

Object是Dart所有对象的根基类,也就是说在Dart中所有类型都是Object的子类(包括Function和Null),所以任何类型的数据都可以赋值给Object声明的对象。Object声明的变量可以赋值任意对象,且后期可以改变赋值的类型。dynamic与Object不同的是dynamic声明的对象编译器会提供所有可能的组合,而Object声明的对象只能使用 Object 的属性与方法, 否则编译器会报错。上面的代码,可以将构造函数声明为const的,这种类型的构造函数创建的对象是不可改变的。

2022-10-31 19:46:27 347

原创 App 启动流程全解析

Activity 启动过程分为两种,一种是根Activity的启动过程,另一种是普通Activity的启动过程。这里介绍是是根Activity的启动过程,也可以理解为应用程序启动过程。根Activity 启动过程中涉及到4个进程,分别是Zygote进程、Launcher 进程、AMS所在进程(SystemServer)、应用程序进程。

2022-09-08 21:12:20 2000

原创 浅析MVC、MVP、MVVM 架构

Presenter可以使View(Activity)不用直接和Model打交道,View(Activity)只用负责页面的显示和交互,剩下的和Model交互的事情都交给Presenter做,比如一些网络请求、数据的获取等,当Presenter获取到数据后再交给View(Activity)进行展示,这样,Activity的任务就大大减小了。MVVM的本质是数据驱动,把解耦做的更彻底,viewModel不持有view。指Activity,既要负责页面的展示和交互,还得负责数据的请求和业务逻辑之类的工作。

2022-08-23 15:12:18 925

原创 Framework学习之旅:init 进程启动过程

init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动流程中一个关键的步骤,它有很多重要的职责,比如创建Zygote(孵化器)和属性服务等。它的生命周期贯穿整个Linux内核运行的始终。Android中所有其它的进程共同的鼻祖均为init进程。创建和挂载启动所需的文件目录初始化和启动属性服务解析init.rc配置文件并启动启动Zygote服务httpshttps。...

2022-07-24 17:40:54 1675

原创 Framework 学习之旅:Android 系统启动流程

init进程(pid=1,init进程是所有进程的鼻祖,第一个启动)启动后,会启动adbd,logd等用户守护进程,并且会启动servicemanager(binder服务管家)等重要服务,同时孵化出zygote进程,这里属于C++Framework,代码为C++程序。zygote同时会启动相关的APP进程,它启动的第一个APP进程为Launcher,然后启动Email,SMS等进程,所有的APP进程都有zygotefork生成。初始化进程管理等操作会启动INIT进程,这些在Native层中。...

2022-07-24 17:11:47 827

原创 Glide 源码解析

源码方面主要从最基本的三个方法入手:with,load,into。Glide.with()方法根据不同上下文对象有多个重载方法,源码如下:

2022-07-16 23:02:18 689

原创 Android 视图截屏小结

把UI布局转换成图片保存到本地或者分享出去。未测量过UI布局(未显示屏幕上)WebView 截图第一种第二种通过获取当前window的DecorView,然后绘制Bitmap对象。

2022-06-27 19:58:57 529

原创 APK 瘦身优化小结

APK 优化主要分为:Dex、Resource、Assets、Native LibrariesMatrix-ApkChecker是针对android安装包的分析检测工具,根据一系列设定好的规则检测apk是否存在特定的问题,并输出较为详细的检测结果报告,用于分析排查问题以及版本追踪。Matrix-ApkChecker在 Android 中代码混淆和压缩都是通过 ProGuard 来实现的,ProGuard会检测和移除代码中未使用的类、字段、方法和属性。在 build.gradle中,使用minifyEnabl

2022-06-04 10:40:21 324

原创 启动优化小结

启动基础知识应用有三种启动状态,每种状态都会影响应用向用户显示所需的时间:冷启动、温启动或热启动。冷启动当启动应用时,后台没有该应用的进程,这时系统会首先会创建一个新的进程分配给该应用,这种启动方式就是冷启动。冷启动相关的任务流程:热启动当启动应用时,后台已有该应用的进程,比如按下home键,这种在已有进程的情况下,这种启动会从已有的进程中来启动应用,这种启动方式叫热启动。温启动当启动应用时,后台已有该应用的进程,但是启动的入口Activity被干掉了。有许多潜在状态可视为温启动。例如:

2022-05-25 11:00:55 900

原创 启动优化知识之有向无环启动器

前言App启动优化,自然会想到异步加载。将耗时任务放到子线程加载,等到所有加载任务加载完成之后,再进入首页。这种多线程异步加载方案适合于多个任务之间没有依赖关系,业务逻辑没有那么复杂情况。但是在实际项目中肯定会遇到复杂业务逻辑情况,如任务2依赖于任务1,这种情况如何解决?或者任务3依赖于任务2,任务2依赖于任务1,这种更复杂情况又该如何解决呢?那既能够异步操作、又能解决任务之间的依赖关系,同时执行代码更加优雅的方式有没有?下面这种解决方案就具备该条件:有向无环图启动器。重要概念在介绍有向无环图启动器

2022-05-22 22:46:10 500

原创 内存优化小结

内存泄漏(Memory Leak)每个应用程序都需要内存来完成工作,为了确保Android 系统的每个应用都有足够的内存,Android 系统需要有效地管理内存分配。当内存不足时,Android 运行时就会触发GC,GC采用的垃圾标记算法为根搜索算法。从上图可知,Obj4是可达的对象,表示它被引用,因此不会标记为可回收的对象。Obj5、Obj6和Obj7都是不可达的对象,其中Obj5和Obj6虽然相互引用,但是因为它们到GCRoots是不可达,所以它们仍旧被标记为可回收的对象。内存泄露就是指没有用的

2022-05-03 23:03:43 948

原创 数据结构:栈和队列

栈(Stack)栈是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。栈的两端分别为栈顶和栈底。概念入栈又称作进栈(压栈)。向一个栈插入新元素,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。出栈又称作退栈。从一个栈删除元素,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。特点先进后出(LIFO)方法E push(E item)把item压入栈顶部E pop()移除堆栈顶部的对象,并返回该对象。E peek()

2022-05-01 22:01:55 686

原创 内存泄露检测工具:Matrix ResourceCanary 使用

简介Resource Canary主要是用来检测Activit级别的内存泄漏、以及重复创建的冗余Bitmap。地址官方文档Matrix GitHub使用1. 项目依赖在项目根目录下的 gradle.properties中配置要依赖的Matrix版本号MATRIX_VERSION=2.0.5在项目根目录下的build.gradle文件添加Matrix依赖dependencies { classpath ("com.tencent.matrix:matrix-gra

2022-04-28 21:29:51 1180

原创 卡顿优化小结

卡顿理解卡顿先理解个概念:帧数。帧数就是在1秒时间里传输的图片的量,也可以理解为图形处理器每秒钟能够刷新几次,通常用FPS表示。每一帧其实就是静止的图像,通过快速连续显示帧便形成了运动的假象。要想画面保持在60fps,需要屏幕在1秒内刷新60 次,也就是每16ms刷新一次,绘制时长在16ms以内。Android 系统每隔16ms发出VSYNC信号,触发UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要60fps。VSYNC 是 Vertical Synchronization (垂直

2022-04-13 14:17:08 903

原创 Android 系统分析工具:Systrace

前言Systrace 可以帮助开发者收集Android关键子系统(SurfaceFlinger、WMS等Framework 部分关键模块、服务,View体系系统等)的运行信息。Systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统的运行状况等。对于UI显示性能,比如动画播放不流畅、渲染卡顿等问题提供了分析数据。Systrace 工具安装使用Systrace 工具包会在sdk/platform-tools/systrace/ 目录下,如图所示:Windo

2022-04-03 10:49:57 5288

原创 Android Studio Profiler CPU检测卡顿

前言Android Studio 3.0 及更高版本中的 Android Profiler 取代了 Android Monitor 工具。Android Profiler工具可提供实时数据,帮助您了解应用的CPU、内存、网络和电池资源使用情况。图1Android Profiler 显示当前正在分析的进程和设备图2在Sessions窗格中,选择要查看的会话,或启动一个新的分析会话图3使用缩放按钮控制要查看的时间轴范围,或使用 Attach to live 按钮跳转到实时更

2022-03-30 16:21:25 9899

原创 数据结构:数组和链表

数组定义数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。内存位置数组从栈中分配空间逻辑结构数组必须事先定义固定的长度(元素个数),不能动态地增减数据。应用场景快速访问数据,很少插入和删除元素,就应该用数组特点存取方式上,数组可以顺序存取或者随机存取存储位置上,数组逻辑上相邻的元素在物理存储位置上也相邻数组在静态存储分配情形下,存储元素数量受限制,动态存储分配情形下,虽然存储空间可以扩充,但需要移动大量元素,导致操作效率降低,而且如果内存中

2022-03-29 09:28:17 283

原创 性能检测工具:Matrix-TraceCanary 入门

简介TraceCanary分为帧率监控、慢方法监控、ANR监控、启动耗时、主线程优先级检测、IdleHandler耗时检测这6个功能。基本使用文档TraceCanary 文档Matrix GitHub用法1. 项目依赖在项目根目录下的 gradle.properties中配置要依赖的Matrix版本号MATRIX_VERSION=2.0.5在项目根目录下的build.gradle文件添加Matrix依赖dependencies { classpath ("com.

2022-03-22 21:05:29 4097

原创 HashMap 源码解析

存储结构JDK 1.7HashMap是以数组和链表组合构成。如下图所示:// JDK 1.7//默认数组大小,二进制1左移4位为16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //默认的负载因子static final float DEFAULT_LOAD_FACTOR = 0.75f;//最大容量static final int MAXIMUM_CAPACITY = 1 << 30;//默认的空数组

2022-03-16 09:54:55 442

原创 性能分析工具System Trace

前言Android 9或更高版本的设备包含一个名为 System Tracing的系统级应用。允许您直接从测试设备本身录制跟踪记录,而无需插入设备并通过 ADB 连接到该设备。解决应用中与性能相关的错误(例如启动速度慢、转换速度慢或界面卡顿)时,录制跟踪记录特别有用。使用可以使用“快捷设置”图块录制系统跟踪记录。如果首次在测试设备上使用 System Tracing,或在设备的快捷设置面板中看不到 System Tracing 图块。如下图所示:启用开发者选项,找到系统跟踪在系统跟踪中,打开

2022-03-15 15:45:52 8198

原创 数据结构:二叉树基础入门

定义二叉树由一个根节点和两个互不相交的、分别称为根节点的左子树和右子树的二叉树组成。二叉树种类满二叉树对于一棵二叉树,如果每一个非叶子节点都存在左右子树,并且二叉树中所有的叶子节点都在同一层中,这样的二叉树称为满二叉树。完全二叉树除了叶子节点外每一个节点都有左右子叶且叶子节点都处在最底层的二叉树。对于完全二叉树,若某个节点数为i,左子节点位2i+1,右子节点为2i+2。二叉搜索树又称二叉查找树或者二叉排序树。二叉搜索树具有下列性质:若左子树不空,则左子树上所有节点的值均小于它的根节点的

2022-03-07 21:05:46 1713

原创 Java 虚拟机笔记

概述JDK 包含了Java语言、Java虚拟机和Java API 类库这三部分,是Java 程序开发的最小环境。JRE 包含了Java API 中的Java SE API子集和Java虚拟机这两部分,是Java程序运行的标准环境。Java虚拟机执行流程Java 虚拟机执行流程分为两大部分,分别是编译环境和运行时环境。当一个Java 文件经过Java 编译器编译后会生成Class 文件,这个Class 文件会由Java 虚拟机来进行处理。Java 虚拟机与Java 语言没有什么必然的联系,它与特定

2022-02-22 19:56:48 766

原创 协程进阶:CoroutineContext

前言CoroutineContext是协程中的上下文,通过它可以控制协程在哪个线程中执行,可以设置协程的名字,可以用它来捕获协程抛出的异常等。通过 CoroutineScope.launch 方法或者CoroutineScope.async 方法可以启动一个协程。// launch 源码 public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: Corouti

2022-02-12 22:34:48 1766

原创 协程入门基础

概念协程是一种非抢占式或者说协作式的计算机程序并发调度的实现,程序可以主动挂起或者恢复执行。函数或者一段程序能够被挂起(可以理解成暂停),待会儿再恢复,挂起和恢复是开发者的程序逻辑自己控制的,协程是通过主动挂起出让运行权来实现协作的。协程和线程区别线程之间是抢占式的调度协程之间是协作式的调度协程是依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的。所以协程像是一种用户态的线程,非常轻量级,一个线程中可以创建N个协程。使用依赖 // 协程核心库 implementation

2022-01-30 21:21:11 2633

原创 Jetpack 架构组件:Room 数据库应用

简介Room 是一个 ORM (Object Relational Mapping)对象关系映射数据库、其底层还是封装的 SQLite 的能力。它赋予了一个强大的功能,就是可以用面向对象的思维来和数据库进行交互,绝大数情况下不用再和SQL语句打交道了,同时也不用担心操作数据库的逻辑会让项目的整体代码变混乱。Room 主要是由Entity、Dao 和Database 这3部分组成:Entity用于定义封装实际数据的实体类,每个实体类都会在数据库中有一张对应的表,并且表中的列是根据实体类中的字段

2022-01-16 22:23:11 2188

原创 Jetpack 架构组件:LiveData

简介LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData具有生命周期感知能力,意指它遵循其他应用组件(如Activity/Fragment)的生命周期。这种感知能力可确保 LiveData仅更新处于活跃生命周期状态的应用组件观察者。优势UI和实时数据保持一致LiveData 遵循观察者模式。当数据更新后,LiveData就会通知它的所有观察者;与RxJava的方法不同的是,LiveData并不是通知所有观察者,它只会通知处于活跃状态(Activity/Fragm

2022-01-06 17:19:39 1627

原创 工厂方法设计模式解读

介绍工厂方法模式是创建型设计模式之一定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。工厂就是用来生成对象的,把对象的实例化和初始化封装起来。使用场景在任何需要生成复杂对象的地方,都可以使用工厂方法模式UML类图Product抽象产品类ConcreteProduct具体产品类,实现Product接口。Factory抽象工厂类,该方法返回一个Product类型的对象。ConcreteFactory具体工厂类,返

2021-12-25 17:10:20 292

原创 Jetpack 架构组件:ViewModel

简介在Activity/Fragment中,通常会将UI交互、与数据获取等相关的业务逻辑全部写在页面中,但是在页面功能复杂的情况下,代码量会变的非常多。页面只应该负责处理用户与UI控件的交互,并将数据展示到屏幕上,而数据获取相关的业务逻辑应该单独处理和存放。谷歌为了解决这种问题,推出了ViewModel组件。ViewModel 是以感知生命周期的形式来存储和管理视图相关的数据。使用在app的build.gradle中添加依赖dependencies { implementation "andro

2021-12-23 18:19:37 1466

原创 Jetpack 架构组件:Data Binding

通过Data Binding,通过声明式布局以精简的代码来绑定应用程序逻辑和布局,这样就不用编写大量的模板代码。配置在对应的 Module 的 build.gradle 中添加:buildFeatures { dataBinding = true }如果要用kotlin 开发,还需要添加apply plugin: 'kotlin-kapt'// dependencieskapt "com.android.databinding:compiler:$rootProje

2021-12-19 18:05:39 479

原创 Jetpack架构组件:Lifecycle

前言Lifecycle,是用于帮助开发者管理Activity和Fragment的生命周期,它是LiveData和ViewModel的基础。Lifecycle 出现原因比如说,某个界面中发起了一条网络请求,但是当请求得到响应时,界面或许已经关闭了,这个时候就不应该继续对响应的结果进行处理。因此,需要时刻感知到Activity的生命周期,以便在适当的时候进行相应的逻辑控制。通常的做法是:监听器的方式来对Activity的生命周期进行感知:public class ExJetPackActivity e

2021-12-16 20:49:34 728

原创 建造者设计模式解读

介绍Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。UML类图Director统一组装过程。负责安排已有模块的顺序,然后通知Builder开始建造。Builder抽象Builder类,规范产品的组建,一般由子类实现具体的组建过程。C

2021-12-11 22:22:42 240

原创 Android 事件分发机制

前言点击事件的事件分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,而这个传递的过程就是分发过程。基础概念涉及到类事件分发过程实际上就是Activity、ViewGroup、View对MotionEvent事件的分发,拦截,消费的过程。其中,只有ViewGroup能进行事件拦截,因此只有ViewGroup有onInterceptTouchEvent方法。类方法Activity拥有di

2021-12-07 14:18:15 2085

原创 RxJava 知识回顾

一个实现异步操作的库。RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。RXJava GitHubRXAndroid GitHubRxJava观察者模式两个对象观察者与被观察者,其中观察者与被观察者建立了订阅关系,如果被观察者发生了变化那么需要及时通知观察者,观察者收到通知后做出相应的处理.。例子: 顾客去买蛋糕这样一个场景(把顾客和蛋糕店店员分别看做观察者与被观察者),由于蛋糕是现做需要一定时间才能完成,顾客在购买时一般会先付钱给店员拿到一个付款凭证后离开去忙其他事,这样他们.

2021-11-30 21:37:46 1953

原创 APK瘦身优化检测工具-Matrix ApkChecker 使用

简介Matrix-ApkChecker 作为Matrix系统的一部分,是针对android安装包的分析检测工具,根据一系列设定好的规则检测apk是否存在特定的问题,并输出较为详细的检测结果报告,用于分析排查问题以及版本追踪。官方文档Matrix Github使用运行前准备工作从官方地址下载ApkChecker.jar (本次使用matrix-apk-canary-2.0.2.jar)准备配置文件config.json ,下面是配置文件(与官方文档示例有区别,具体配置根据自己项目需求)

2021-11-26 17:26:38 2551

原创 Retrofit 源码解析

简介一个用于Android和Java平台的类型安全的网络框架。Retrofit 是一个Square开发的类型安全的REST安卓客户端请求库。这个库为网络认证、API请求以及用OkHttp发送网络请求提供了强大的框架,底层对网络的访问默认也是基于OkHttp。官网地址Github官网依赖implementation 'com.squareup.retrofit2:retrofit:2.9.0'用法基本用法// 创建网络请求接口interface Api { @GET("us

2021-11-16 15:37:50 3270

原创 OkHttp 源码解析

本文源码为okhttp:4.9.0版本。implementation("com.squareup.okhttp3:okhttp:4.9.0")GitHub地址基本用法创建请求Request后,要用OkHttpClient的newCall()方法创建一个RealCall对象,然后调用execute()发起同步请求或调用enqueue()发起异步请求。 //1.创建请求(包含url,method,headers,body) val request = Request

2021-11-07 20:12:22 429

音视频播放器(FFmpeg+OpenSELES)

音视频播放器(FFmpeg+OpenSELES)

2023-12-28

阿里Sophix 热修复集成Demo

阿里Sophix 热修复集成Demo

2023-01-18

MVVMExmple 采用mvvm架构小例子,以登录功能为例

采用DataBinding +Retrofit+LiveData+ViewModel+Liffecycle+协程

2022-08-23

MVPExmple 是简单封装的mvp小例子,通俗易懂。

采用mvp架构,使用RxJava3+OKHttp3+Retrofit2 搭建框架,以登录功能为例

2022-08-23

空空如也

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

TA关注的人

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