自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Android】系统启动流程(zygote 进程启动流程)

先上图,我们先大致了解一下 Android 设备点击电源键开机到创建出进程的流程,以及流程中涉及到的一些基本名词,里面细化的子流程和。

2022-08-26 15:51:45 1722

原创 【Android】如何分析 ANR 日志

应用层导致的ANR(耗时操作)系统层导致的ANR方法一当系统出现 ANR 时,设备会自动将 ANR 日志输出到 目录下,如下所示:对于这些文件,我们直接双击在 Android Studio 上打开即可。方法二执行命令:可以导出设备所有 bug 日志,执行命令后,在指定文件夹内得到一个 zip 文件,将文件解压后打开,文件目录如下所示:其中,设备的 anr 日志会保存在该路径下:,如图:另外,该文件 内也有有 anr 日志的打印,我们可以通过以下关键词搜索该文件的一些异常信息,如:一个 ANR 日志,会包

2022-06-17 16:22:15 13304 4

原创 【Binder】Android 跨进程通信原理解析

在Android开发的过程中,用到跨进程通信的地方非常非常多,我们所使用的Activity、Service等组件都需要和AMS进行跨进程通信,而这种跨进程的通信都是由Binder完成的。甚至一个看似简单的startActivity操作,就有可能发生 **6** 次的跨进程通信。...

2021-12-31 10:31:32 2906

原创 【LeakCanary】源码分析

LeakCanary原理分析LeakCanary的Github地址如下:https://square.github.io/leakcanary/前言LeakCanary是一个检测项目内存泄漏的第三方库。目前已经升级到V2.7版本了,对于2.0以上的版本,LeakCanary的使用可以说是相当的简单。LeakCanary对代码的侵入性极低,我们看它的使用就明白了。想要使用LeakCanary,我们只需要在build.gradle文件中添加入依赖即可:debugImplementation 'com.

2021-12-22 17:01:40 1543

原创 【Android】LiveData 源码分析

LiveData源码分析前言LiveData其实已经不是一个新鲜的东西了,我是在使用MVVM框架的时候开始接触到LiveData的,LiveData用起来确实很方便。LiveData是一个具有感知组件生命周期的类,如Activity、Fragment、Service,只要和LiveData进行了绑定,LiveData就能感知到它们的生命周期。LiveData的基本使用我们就不讲了,因为它的使用非常简单,不懂的话网上一搜一大把。那么,LiveData有什么好处呢?1、监听与其绑定的界面的生命周期,

2021-12-15 16:02:16 2475

原创 【Android】事件分发和处理机制

Android 事件处理机制和分发机制我们首先要了解一下,Android中的事件用MotionEvent对象来表示,那么它的哪些类型呢?事件类型触发时机ACTION_DOWN手指初接触到屏幕时触发ACTION_MOVE手指在屏幕上滑动时触发,会多次触发ACTION_UP手指离开屏幕时触发ACTION_CANCEL事件被上层拦截时触发事件分发,其实只针对ViewGroup,举个例子,比如一个ViewGroup,它拿到了事件后,它首先会分发给它的子Vie

2021-11-28 23:06:52 1944

原创 【Android】system_server 创建和启动流程

SystemServer进程的创建和启动流程在将SystemServer的启动流程之前,先回顾一下上一篇章的内容:上篇文章中,我们介绍了从init进程到zygote进程再到SystemServer进程开始创建的流程,大致是这样的:1、执行app_main.cpp文件的main方法(init进程中)2、main方法中初始化AndroidRuntime3、执行runtime.start()启动Android运行时环境,其中,start()方法内部通过startVM方法创建了虚拟机,通过startReg

2021-11-21 20:09:29 3943 1

原创 【OkHttp】源码分析

okhttp基本使用://分发器:内部维护队列与线程池,完成请求的调配//拦截器:完成整个请求过程OkHttpClient client = new OkHttpClient();Request request = new Request.Builder() .url(MY_URL) .build();//call是一个接口。call接口的实现类在okhttp中是RealCall,call只能使用一次,只要call执行了enqueue或execute方法,就会抛

2021-10-24 23:00:51 397

原创 【Android】音视频开发基础入门

音视频基本概念帧率即单位时间内帧的数量,单位是fps。一帧表示一张图像,一个视频由许许多多的帧组成。24/25fps:一秒24/25帧,一般的电影帧率30/60fps:一秒30/60帧,游戏的帧率,30帧可以接受,60帧会感觉更加流程逼真85fps以上人眼基本无法察觉出来了,所以更高的帧率在视频里没有太大的意义分辨率影响图像大小,与图像大小成正比:分辨率越高,包含像素越多,图像越大;分辨率越低,图像越小。常见的分辨率有720P(1280 × 720)、1080P(1920 ×1080)、

2021-09-24 17:09:34 1430

原创 【并发】一文搞懂多线程和并发编程

线程是CPU调度和执行的最小单位,一个进程可以拥有一个或多个线程。在一个进程中,如果开辟了多个线程,线程的运行将由CPU调度器来安排。在单核CPU下,即使用了多线程,在同一个时间点,CPU只能执行单个线程的代码,因为线程之间切换的很快,所以就感觉多个线程是在同时做一件事。这种现象也叫做并发。......

2020-10-08 11:33:55 1114

原创 【Android】Handler 深度解析

Handler机制详解前言Handler可以说贯穿了整个Android系统,在Android中扮演着相当重要的角色。我们开发中接触到的四大组件如Activity、Service、BroadcastReceive、ContentProvider,他们的生命周期的管理都是由handler机制进行的,甚至毫不夸张的说,Android几乎所有的操作 ,都与Handler有关。因此Handler对于Android来说,非常非常重要。所以本篇文章将带大家深入研究Handler的机制。而我们在开发的过程中,用得比

2020-08-24 17:58:58 2982

原创 【AIGC】图片生成的原理与应用

近两年 AI 发展非常迅速,其中的 AI 绘画也越来越火爆,AI 绘画在很多应用领域有巨大的潜力,AI 甚至能模仿各种著名艺术家的风格进行绘画。目前比较有名商业化的 AI 绘画软件有 Midjourney、DALL·E2、以及百度出品的文心一格:https://yige.baidu.com/creation但是他们都有一个共同点,那就是要钱。为了解决这个问题,我们可以自己做一款 AI 绘图软件。扩散模型(Diffusion Models)的原理扩散模型(Diffusion Models)的实践。

2023-09-14 16:46:33 1449

原创 Ubuntu 20.04 安装 Stable Diffusionn

步骤 1:安装 wget、git、Python3 和 Python3虚拟环境(如果已安装可忽略这步骤)步骤 2:克隆 SD 项目到本地步骤 3:进入 stable-diffusion-webui 根目录步骤 4:执行命令运行 Stable Diffusionn./webui.sh。

2023-08-08 15:16:53 3879 2

原创 【Android】系统源码的上传

【Android】系统源码下载及编译这篇文章就写写系统源码的上传。为了对 Android 代码质量进行管控,Google 采用 Gerrit 进行 CodeView,并利用 Jenkins 做代码静态检测和自动化验证。Gerrit 是 Google 为 Android 系统研发量身定制的一套免费开源的代码审核系统。它允许团队成员对代码进行评审、评论和修改,并在代码被合并到主干之前进行审核和验证。Gerrit 提供了一个 Web 界面和一组命令行工具,用于管理代码审查过程。

2023-04-04 18:43:30 977 1

原创 【Android】系统源码下载及编译

指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境,例如 aosp_arm64-eng 中的 aosp(Android Open Source Project) 代表 Android 开源项目,arm 表示系统是运行在 arm 架构的处理器上的,arm64 则是指 64 位 arm 架构处理器。:编译目标的格式是 BUILD-BUILDTYPE ,如 aosp_arm64-eng 这个目标,它的 BUILD 是 aosp_arm64,BUILDTYPE 是 eng。

2023-02-14 16:53:28 3418

原创 【Android】Window 机制

Window,即窗口,在 Android 中,它是一个抽象的东西,我们在日常开发中,直接接触到的东西是 View,而 View 是附着在 Window 之上的。所以我们也可以说 Window 是 View 的直接管理者。在了解 window 机制之前,我们需要对 Android 系统中的显示部分涉及到的东西有一个大致的了解。

2022-11-02 18:05:49 1788

原创 【Android】之屏幕适配

Android 系统能发展到今天,离不开其开源性,但是随着越来越多的设备接入 Android 系统,并对 Android 系统进行各种各样的定制,导致长期以来出现了各种碎片化严重的问题。例如,Android 屏幕尺寸多种多样,如 5 寸、5.9 寸、6 寸、6.1 寸 等等,当然,屏幕分辨率也是多种多样,这很容易导致同一元素在不同手机上显示的效果不同的问题,因此,Android 应用开发中的屏幕适配工作也越来越重要。本篇文章就介绍一下 Android 中屏幕适配相关的知识。

2022-09-24 19:23:01 5166 1

原创 【Android】编译系统之 make 和 Soong

make 是一个自动化构建工具,make 通过读取一种叫做Makefile的文件,将源代码自动构建成可执行程序和库文件。而 Makefile 文件中定义了目标程序的依赖关系和生成目标程序的相关规则。在早期, make 被包含在Unix系统中,随着GNU/Linux从Unix衍生出来并发扬光大,GNU/Linux保留并扩展了原始的make,加入了许多内置函数和自动变量等等,形成了GNU make。.........

2022-08-30 14:34:54 2710

原创 【Android】ANR 原理解析(Service)

ANR,Application Not responding,也就是应用程序未响应。Android 系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间不能得到响应或者响应时间过长,都会造成ANR。所有与 ANR 相关的消息,都会经过系统进程 来调度,然后派发到应用进程完成对消息的实际处理, 一旦应用程序处理消息超时,系统就会收集一些系统状态,譬如 CPU/IO 使用情况、进程函数调用栈,并且报告用户有进程出现 ANR 了,同时会弹出 ANR 的对话框。ANR机制可以分为两部分:整个 ANR 机制

2022-06-15 17:07:18 2045

原创 【Android】之 App Startup 的使用及浅析

App Startup 是一个可以用于加速 App 启动速度的一个库。平时开发中,大部分的第三方都需要在 Application 中进行初始化,但是库会借助 ContentProvider 来初始化,以便使自己的库的侵入性更低,使用更加简便。但是,一旦项目引入了使用 ContentProvider 进行初始化的库越来越多,那么应用的启动速度将会越来越慢,因为每个 ContentProvider 的初始化都是比较耗时的操作。而 App Startup,它可以将所有用于初始化的 ContentProvider

2022-06-13 15:36:25 2543

原创 【Android】IPC 之 AIDL、Messenger 、Binder 浅析

- 使用 Binder 类实现绑定服务和**同进程**组件之间的通信 - 使用 Messenger 实现绑定服务和**不同进程**组件之间的通信 - 使用 AIDL 实现绑定服务和**不同进程**组件之间的通信

2022-06-08 19:58:49 574

原创 【Android】之 Flow 的使用和浅析

Google 推荐在 MVVM 架构中使用 Kotlin Flow,可见其发展前景是相当好的。Kotlin Flow 可以用于替换 Rxjava,也可以用于替换 LiveData,功能十分强大,它是 Kotlin 协程库提供的一部分功能,因此,如果我们项目中已经引用了 Kotlin 协程,则不需要额外引入 Flow 相关的依赖。在协程中,挂起函数最多仅能返回一个值,而数据流 Flow 可按顺序发出多个值,例如,我们可以通过数据流从数据库中实时接收更新。数据流使用挂起函数通过异步方式生成和使用值,也就是说,数

2022-06-01 13:57:27 9746 3

原创 【Android】之 JetPack Room 的使用

是一个基于 SQLite 的强大数据库框架,是谷歌官方提供的给开发者使用的,Room 也是 JetPack 的一部分。Room 强大在哪里呢?- 使用编译时注解对 sql 语句进行检查- 与 sql 语句的使用更加贴近,能够降低学习成本- 支持 `RxJava`、`LiveData` 、`协程`等联合使用- 官方推荐,不需要额外引入第三方库...

2022-05-27 17:43:55 489

原创 【Android】四大组件之 ContentProvider

前言ContentProvider 是 Android 的四大组件之一,有时候我们需要操作其他应用程序的一些数据,就会用到 ContentProvider。ContentProvider 用于管理 Android 以结构化方式存放的数据,以相对安全的方式封装数据并提供简易的处理机制和统一的访问接口供其他程序调用。Android 为常见的一些数据提供了默认的 ContentProvider(包括音频、视频、图片和通讯录等)。要实现与其他的 ContentProvider 通信首先要查找到对应的 Co

2022-05-19 18:39:50 2833

原创 【设计模式】之 行为型模式

【设计模式】之 行为型模式设计模式就是在某些场景下,针对某类问题的某种通用的解决方案。使用设计模式可以使得代码可复用、让代码更容易被他人理解、保证代码可靠性。设计模式总体被分为三类:创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程行为型模式:类和对象如何交互,及划分责任和算法结构型模式:把类或对象结合在一起形成一个更大的结构本文将讲述行为型模式的使用总结。行为型模式观察者模式当对象间存在一对多关系时,可以使用观察者模式。比如,当一个对象被修改时,则会自动通知依赖它

2022-05-10 20:21:09 687

原创 【设计模式】之 结构型模式

【设计模式】之 结构型模式设计模式就是在某些场景下,针对某类问题的某种通用的解决方案。使用设计模式可以使得代码可复用、让代码更容易被他人理解、保证代码可靠性。设计模式总体被分为三类:创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程行为型模式:类和对象如何交互,及划分责任和算法结构型模式:把类或对象结合在一起形成一个更大的结构本文将讲述结构型模式的使用总结。结构型模式适配器模式适配器模式是作为两个不兼容的接口之间的桥梁。它结合了两个独立接口的功能。它将一个类的接口转

2022-05-05 17:03:26 402

原创 【设计模式】之 创建型模式

【设计模式】创建型模式设计模式就是在某些场景下,针对某类问题的某种通用的解决方案。使用设计模式可以使得代码可复用、让代码更容易被他人理解、保证代码可靠性。设计模式总体被分为三类:创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程行为型模式:类和对象如何交互,及划分责任和算法结构型模式:把类或对象结合在一起形成一个更大的结构本文将讲述创建型模式的使用总结。创建型模式工厂模式工厂模式属于创建型模式,是 Java 中最常用的设计模式之一,它提供了一种创建对象的最佳方式。作

2022-04-25 20:41:23 761

原创 【Android】Fragment 使用及浅析

Android Fragment 浅析Fragment 是在 Android 3.0 (API level 11) 开始引入的。每个 Fragment 拥有自己的布局以及生命周期。Fragment不能独立存在,必须依赖于Activity。一个Activity里可以有多个Fragment,并且一个Fragment可以被多个Activity重用。Fragment 的基本使用首先需要创建一个 Fragment,代码如下:private const val ARG_PARAM1 = "param1"pr

2022-04-14 18:06:26 4591 1

原创 【面经分享】Android 开发面经

持续了大半个月的面试终于结束了,年后回来,从2月9号到3月1号,一直陆陆续续有面试邀约,不得不说,一边在职承受工作压力,另一边还要承受面试找工作压力,双重压力下,多多少少有点难顶,但是,收获offer还是比较满意的,拿下了网易、小米的offer,着实有点可惜的是字节跳动,倒在了三面,只能说自己还是太菜,以后还需要继续努。这期间只投递了互联网中大厂,面试并不多,以下是我在这大半个月以来的面试经历,发出来总结一波,也供大家参考参考!面试均为Android开发,社招岗。

2022-03-01 21:56:28 3298 1

原创 【屏幕刷新】Android 屏幕刷新机制

显示系统基础知识在一个典型的显示系统中,一般包括CPU、GPU、Display三个部分,CPU负责计算帧数据,把计算好的数据交给GPU,GPU会对图形数据进行渲染,渲染好后放到buffer(图像缓冲区)里存起来,Display(屏幕或显示器)负责把buffer里的数据呈现到屏幕上。双缓存屏幕刷新频率是固定的,比如每16.6ms从buffer取数据显示完一帧,理想情况下帧率和刷新频率保持一致,即每绘制完成一帧,显示器显示一帧。但是CPU/GPU写数据是不可控的,所以会出现buffer里有些数据

2022-02-07 09:42:29 979

原创 【Android】多渠道打包与签名机制

我们在发布APP时,往往需要生成多个渠道包,以上传到不同的应用市场。

2022-01-23 22:41:38 2943

原创 【RxJava】使用

虽说Rxjava显然已经有些过时了,但是有些公司还在使用,为了能适应更多的业务代码,并提高自己的开发效率,所以这里仅做个Rxjava使用的总结,不涉及Rxjava内部的实现原理。RxJava的核心就是异步数据流和响应式编程。我们平时开发过程中的网络请求、数据库读写、文件读写、定时任务等各种耗时操作,都可以使用RxJava来完成。在平时的开发中,我们可以把所有的事件(数据)我们都可以看成是一条河流,它可以被观察,被过滤等操作,也可以将多条河流汇合成一条新河流。

2022-01-22 16:35:34 1083 1

原创 【算法】K个一组翻转链表

【算法】K个一组翻转链表出处leetcode 25:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/题解地址可参考:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/k-ge-yi-zu-fan-zhuan-lian-biao-by-leetcode-solutio/题目给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正

2022-01-22 15:24:25 569

原创 【算法】判断链表是否有环/环入口点/......

【算法】判断链表是否有环/环入口点/…题目这是一个比较经典的问题,给定一个单链表,判断其中是否有环其他相关算法:如果存在环,找出环的入口点如果存在环,求出环上节点的个数一、判断其中是否有环思路快慢指针:开始的时候两个指针都指向链表头,然后让快指针fast向后移动两个节点,同时慢指针slow向后移动一个节点,直到快指针指向null为止。由于fast要比slow移动的快,如果有环,fast一定会先进入环,而slow后进入环。当两个指针都进入环之后,经过一定步的操作之后,二者一定能够在环上相

2021-12-31 11:46:04 157

原创 【算法】删除链表的倒数第N个结点

【算法】删除链表的倒数第N个结点出处剑指offer 021题解地址可参考:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/solution/shan-chu-lian-biao-de-dao-shu-di-nge-jie-dian-b-61/题目给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2

2021-12-31 11:04:57 116

原创 【OkHttp】拦截器解析

OkHttp拦截器在之前的文章【OkHttp源码分析】中我已经对OkHttp的整体流程以及它的分发器分发流程进行详细分析,感兴趣的大佬可以观摩观摩,并给小弟提点意见~今天的重点是把OkHttp的拦截器部分的内容单独拎出来讲讲,因为它是OkHttp的核心部分!读过OkHttp源码的大佬应该都知道,无论是使用OkHttp进行同步请求还是异步请求,它们都会通过一个方法getResponseWithInterceptorChain()来获取Response。而这个方法就是通过责任链执行拦截器的入口,所以我们下

2021-12-30 11:45:01 925

原创 【HashMap】源码分析

【HashMap】源码分析我们先大致的了解一下HashMap。从使用的角度上看,它使用起来非常简单,put操作时,保存的是键值对,get操作时,通过键就即可拿到值,它的键值对都是支持null的,这在一定程度上提升了容错率,另外,HashMap实际上是非线程安全的。从内在角度看,它使用了hash算法+数组+链表的结构存储数据,而在JDK 1.8及之后的版本增加红黑树的数据结构来存储数据。构造方法HashMap的构造方法有四个,分别如下:1、public HashMap(int initialCapa

2021-12-23 11:09:17 256

原创 【数据结构与算法】LRU 缓存淘汰算法

LRU 缓存淘汰算法介绍最近,我个人在业务上接触到LRU缓存的场景非常多,比如本人是负责维护公司的音视频播放器中间件的,音视频的业务场景就涉及到LRU缓存,播放器需要对视频流进行缓存,一方面便于下次加载视频更快,另一方面可以一定程度上的节省用户流量,缓存到达一定容量,就要把最久没用过的缓存删除掉。再比如,迭代开发过程中用到的Glide框架,里面的图片缓存等,也是用到了LRU缓存机制。LRU,Least Recently Used,就是一种缓存淘汰策略。我们都知道,计算机的存储容量是有限的,所以缓存也

2021-12-08 10:58:57 290

原创 【数据结构】之双向链表的复杂度分析

双向链表的复杂度分析我们先看一下它的概念(来自百度百科):它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。和单向链表不同的是,双链表除了有一个指向下一节点的指针外,还有一个指向前一节点的指针,这也就意味着,双向链表能够快速找到前驱节点,也能快速找到后驱节点。和单向链表相比,对于插入或删除指定节点的操作,因为单向链表需要从头遍历定位到这个节点的前驱节点,所以它的平均复杂度是O(n

2021-11-26 11:51:30 8622 2

原创 【开机流程】Android系统的启动流程

Android系统的启动流程(开机流程)上图,先大致了解一下Android点击电源键开机到创建出system_server进程的流程,里面细化的子流程和system_server之后发生的事情我们后面再讲:Boot Rom:当电源键按下时,引导芯片就会启动,引导芯片代码会从预定义的地方开始执行(代码存在Rom),加载引导程序BootLoader到RAM。换句话说,就是启动的时候,会把引导程序代码由ROM中移动到RAM中,再去执行引导程序BootLoader。ROM可以简单理解为硬盘,断电后内部的数

2021-11-15 10:30:54 2610

空空如也

空空如也

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

TA关注的人

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