自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

super_marie的博客

小白学习中

  • 博客(112)
  • 资源 (1)
  • 收藏
  • 关注

原创 解析Activity启动-窗口篇

从WMS角度分析Activity启动流程

2023-01-18 17:35:14 1095

原创 Ubuntu系统配置

repo安装

2022-08-23 16:09:31 509

原创 ubuntu系统安装TP-Link无线网卡驱动

ubuntu安装无线网卡驱动

2022-07-24 10:30:53 4193

原创 解析Activity启动-生命周期角度

书接上回,在 AMS侧解析Activity启动 篇章中,我们大致梳理了 Activity 启动过程中涉及到堆栈的整体流程,本篇再让我们从 Activity 生命周期的角度来梳理整个流程顺着上一篇 解析Activity启动-堆栈篇 的流程,在启动Activity时,会在 函数中调用 函数对发起者Activity触发 Pause 动作,那么我们就按照启动顺序,进行逐一分析首先是调用起点,剔除与Pause流程无关的代码;可以看到,只有在对应 stack中存在 时,才会去触发进行Pause流程,很好理解,

2022-06-26 16:02:43 876

原创 解析Activity启动-堆栈篇

从堆栈角度看Activity的启动

2022-06-13 15:41:00 1234

原创 Android Logd框架梳理

Logd框架梳理1. 整体框架Android P的logd总体框架图如下所示:和旧版本方案的差异,主要就是去掉了logger驱动,引入了logd进程,将logbuffer放到了用户空间logd部分各模块功能如下图表所示:模块功能LogReader线程监听 /dev/socket/logdr,将日志发送给client端logListener线程监听 /dev/socket/logdw,将日志保存到logBuffer中,还会在有日志存入时通知 LogReade

2022-03-20 17:07:31 4049 1

原创 移动硬盘安装Ubuntu,并确保在任何电脑都可用

移动硬盘安装Ubuntu,并确保在任何电脑都可用设备准备准备一个U盘作为启动盘准备一个移动硬盘作为系统安装盘电脑文件准备Ubuntu 18镜像文件ultraiSo烧录软件准备Ubuntu镜像Ubuntu镜像文件可以直接去官网搜索下载,或者去清华镜像下载:Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror制作U盘启动盘如何制作启动盘,网上教程很多,不再赘述,可直接参考:使用UltraI

2022-03-10 15:45:56 6863 1

原创 InputManager(3)--键盘事件的分发[part 4:InputDispatcher 接收消息处理结果]

当一个输入事件经过上面的层层判断,确认了处理者并且完成处理之后,就会调用 `finishInputEvent()` 函数结束输入事件的调用,那么在结束输入事件的处理时又会有哪些处理逻辑,最终如何将 **InputDipatcher** 对象中存储在等待处理反馈队列 **waitQueue** 中的输入事件给删除的呢?接下来就让我们从 `finishInputEvent()` 函数入手,开始逐一分析

2021-12-26 17:59:04 1085

原创 InputManager(3)--键盘事件的分发[part 3:窗口获取输入事件]

经过上面的分析,此时 **InputMessage** 对象借由 **server** 端 **InputChannel** 的 **Socket** 对象发送到了 **Client** 端 InputChannel 的 **Socket** 处,而 **Client** 端 **InputChannel** 添加了 **Socket** 的监听,当 存在消息时,就会调用 `NativeInputEventReceiver::handleEvent()` 函数进行处理,那么接下来我们就从此处开始进行梳理接

2021-12-26 17:53:16 1882

原创 InputManager(3)--键盘事件的分发[part 2:InputDispatcher 事件分发]

经过 part 1的分析,我们可以知晓**InputDispatcher**对象是如何获取到输入事件的,那么接下来就让我们来梳理一下,当 **InputDispatcher** 获取到输入事件后,是如何进行分发的

2021-12-26 17:43:10 977

原创 InputManager(3)--键盘事件的分发[part 1:InputReader 事件获取]

InputReader 事件获取事件分发①. InputReader 事件获取⑴ `processEventsLocked()`1. `processEventsForDeviceLocked()`2. `process()`3. `process()`4. `processKey()`ⅰ`getListener()`Ⅱ `notifyKey()`⑵. `flush()`1. `notify()`总结:事件分发经过前两篇的分析,我们先来简单简述一下事件分发的流程:当有键盘事件发生,InputR

2021-12-26 16:03:17 1337

原创 InputManager(2)--InputChannel的注册

InputChannel在前面一章,我们分析了 InputManager 的创建和启动,并且详细分析了 在 InputReader 线程中,用来获取 事件的 EventHub 的创建以及事件获取的流程。那么接下来在介绍键盘事件的分发流程之前,先来梳理一下 InputChannel 的注册流程。在一个 Activity 启动时,会通过与该Activity关联的ViewRoot对象来和 InputManager 建立一个连接,这个连接就是 InputChannel,而这个 InputChannel

2021-12-25 23:53:19 649

原创 InputManager(1)--InputManager的创建和启动

文章目录InputManagerService和输入事件①. InputManagerService的创建1. `InputManagerService()`2. `nativeInit()`3. `NativeInputManager()`4. `InputManager()`5. InputReader 和 InputDispatcher 线程的创建:5.1.1. `createInputDispatcher()`5.1.2. `InputDispatcher()`5.2.1. `createInp

2021-12-23 23:06:50 1123

原创 从JAVA层addService到SM

经过前面几篇文章得分析,可以大致知晓从native层往下是如何进行SM的获取,那么这篇文章将着手从JAVA层开始梳理service服务端如何添加服务到SM中的addService()整体流程简介照例先给出整个流程的时序图addService整个流程的示意图如下:AMS启动本篇以AMS的addService为例进行梳理分析,其他的服务也都是大同小异,这里简单说一下AMS服务的启动AMS是由SystemServer进行开启的,我们从AMS开启入手。代码路径:androi.

2021-10-14 23:19:47 327

原创 Service Manager的获取

首先需要说明的是,本篇文章是从native层开始进行Service Manager的获取回到Binder的框架图,本质上Service的底层实体就是一个BBinder实体,而Clinet客户端想要调用某个service端,需要拿到对应service端的代理接口,也就是BpBinder对象。如上面的框架图,Client端想要和Service端进行通信,那么就需要使用defaultServiceManager()方法获取到IServiceManager对象,一旦拥有了IServiceManag..

2021-10-12 22:37:54 355

原创 Service Manager的启动

Service Manager的用处在正式展开叙述之前,我们需要先说明一下为什么要进行Service Manager的启动和获取。回到binder-框架认知中的整体框架图可知:客户端想要和服务端进行通信,首先需要和对应服务端建立连接,那么客户端是怎么知道,并且完成和服务端进行连接的呢?这就需要用到Service Manager服务了,其实对应客户端和服务端的连接通信都是通过Service Manager来建立的,之所以Service Manager可以实现相关需求,原因如下:Service M

2021-10-10 19:48:44 1108

原创 Binder JNI注册

通过上两个篇章,对于Binder的整体框架,以及其中驱动层的逻辑梳理之后,接下来需要对Binder的JNI层注册进行一个梳理1. Zygote进程的启动解析init.rc文件Zygote是由init进程通过解析对应的init.zygote.rc文件进行创建的,这里可以看一下 init.zygote32.rc 文件文件路径:android/system/core/rootdir/init.zygote32.rc//这里会去找app_process文件夹下的app_main.cpp文件.

2021-10-10 15:18:08 434

原创 Binder框架探究之binder驱动

通过Binder框架图示,对于Binder的整体流程有了一个基本的认知后,接下来就可以深入每一个部分进行逐一的探究,首先先来探究:Binder的所谓一次拷贝究竟是什么?这个一次拷贝又是发生在何处?1 一次拷贝的原理解析1.1 内核空间和用户空间的数据交互如上篇 binder-框架认知 中 3.1章节 所陈述的,在Linux中,用户进程和内核空间是隔离的,而内核空间和用户空间之间的相互访问只能通过系统调用(System Call)进行,对于用户空间和内核空间之间的数据交互,常用的是以下的几个函数:.

2021-10-10 15:00:04 658

原创 Binder框架解析

BinderBinder是什么?1. Binder的概念对于Binder有以下这几种解释:Binder机制是Android系统独有的IPC方式,也是Android系统的核心Linux内核中的驱动文件(/dev/binder)在应用层的开发中,它是一个实现了IBinder接口的一个类,从而具备跨进程通讯的能力从Android Framework的角度来看,它连接了Client、Server、Service Manager和Binder驱动程序。形成一套C/S的通信模式实际上,抛去实

2021-09-26 23:11:35 219

原创 Handler原理浅析

HandlerHandler定义Handler本质上是线程间的一个消息传递和处理的机制Handler通信实现的方案本质上是内存共享的方案同一个进程内存是共享的Handler是整个app通信的框架,在ActivityThread里面感受到,整个App都是用它来进行线程间的协调那么以上的这些结论是怎么得来的呢?Handler流程我们通常使用Handler的方式class Test { Handler mHandler = new Handler() {

2021-08-30 23:27:15 151

原创 Android中的序列化

序列化一. 认识序列化1. 序列化的定义序列化狭义的概念:即将对象转换为字节序列的过程广义的概念:即将数据结构或者对象转换为我们可以存储或者传输的数据格式的一个过程反序列化狭义的概念:即将字节序列转换成对象的过程广义的概念:即将生成的数据还原成数据结构或者对象的过程2. 序列化的用途由于在系统底层,数据的传输形式是简单的字节序列形式传递的,即在底层,系统并不认识对象,只认识字节序列,而为了达到进程间通讯的目的,就需要将对象或者说数据转换为字节序列的形式,而这个过程本质上

2021-08-19 20:10:14 285

原创 JAVA中的代理模式

代理模式1. 什么是代理模式代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用;类比即为生活中的中介,用图示表明:2. 代理模式的作用中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开

2021-08-10 14:08:11 232

原创 AQS以及JMM

显示锁1. 什么是显示锁显示锁是JDK 1.5新增的同步机制,本质是使用Lock接口以及相关的实现类,来实现锁的功能;Lock接口提供了和Synchronized关键字类似的同步功能,但是和Synchronized不同的是Lock拓展了更多的同步方式,使得用锁变得更加的灵活2. 显示锁的使用1) Lock显示锁的使用范式如果要使用显示锁,是存在使用范式的,正确的使用显示锁才能保证加锁的有效性/*** 使用 显示锁 的规范*///先定义一个显示锁Lock lock = new

2021-08-06 14:18:22 107

原创 阻塞队列和线程池

阻塞队列1. 阻塞队列的定义首先队列是一种特殊的线性表,它只能够在表的后端(rear)进行数据插入,在表的前端(front)进行数据获取;和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。支持阻塞的含义:支持阻塞的插

2021-07-27 20:05:18 166

原创 线程并发工具类

Fork-JoinFork-Join体现了 分而治之 的设计思想分而治之:将一个大问题,分割成若干个相同的小问题,且各个小问题之间没有关联原理:在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务,完成每个小任务之后,再将这若干个小任务的结果进行合并(join)汇总示意图:工作密取:所谓的工作密取,举例来说就是:假设当前大任务被拆分成了50个小任务,但是此时只有5个线程可以用来执行任务,那么也就是每个线程需要处理10个任务,那么当某一个线程较快的完成了自身的10个任务之

2021-07-26 10:31:43 94

原创 ThreadLocal浅析

ThreadLocal作用:ThreadLocal可以让每个线程拥有一个属于自己的变量副本,不会和其他线程的变量副本冲突,实现了线程的数据隔离方法介绍:public void set(Object value)设置当前线程的线程局部变量的值public Object get()该方法返回当前线程所对应的线程局部变量public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结

2021-07-24 10:17:57 56

原创 线程和进程

进程、线程进程、线程的基本概念进程:进程是操作系统进行资源分配的最小单位;所谓的资源包含:CPU、内存空间、磁盘IO等等。同一个进程中的多条线程是共享该进程中的全部系统资源的,而不同的进程之间则是相互独立的进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动;程序是死的,静态的,而进程是活的,动态的。进程可分为系统进程和用户进程;凡是用于完成操作系统的各种功能的进程就是系统进程,他们就是处于运行状态下的操作系统本身;而用户进程就是所有由你启动的进程线程:线程是进程中的一个实体

2021-07-24 10:07:59 67

原创 JAVA注解和反射

注解1. 什么是注解:JAVA注解 Annotation 又称为JAVA标注(标签),是JDK5引入的一种注释机制。是元数据的一种形式,用来提供有关于程序但不属于程序本身的数据;注解对于他们注解的代码的操作没有直接的影响。元数据:元数据即描述数据的数据,一般是结构化的数据(如存储在数据库里的数据,规定了字段的长度,类型等);元数据一般由两部分组成,分别是:元数据项目和元数据内容;元数据项目是从信息资源中抽取出来的用于说明其特性、内容的结构化的数据(很常见如一本书,有书名,版本,出版数据等,这些就是

2021-07-23 10:14:11 93

原创 JAVA中的泛型

泛型1. 什么是泛型泛型是JDK5中引入的一种参数化类型的特性2. 泛型的作用 1. 可以使得代码更加的健壮,将类型检查提前到编译期,便于更早的发现问题 2. 使得代码更加的简洁,使得代码可以更方便的复用3. 泛型的三种使用场景泛型类class Generic_class<T> { }泛型接口interface Generic_interface<T> { }泛型方法<T> void Generic(T t) { }注意:

2021-07-22 10:31:46 89

原创 DVBS相关知识

DVB-S (卫星扫台)两个波段C频段 C波段是频率从 3.4~4.2GHZ的一段频带,作为通信卫星下行传输信号的频段;由于频率较低,故在阴雨天气不会出现KU波段的雨衰现象-KU波段 KU波段频率较高,一般在 10.7~12.75GHZ之间,不易受微波辐射干扰;KU波段比C波段信号发射功率更集中,所以KU波段的锅尺寸小于C波段的锅-波段中的相关概念IF:...

2018-09-05 20:55:30 4116 1

原创 GIT相关概念与基础指令

GIT 分布式版本控制系统 可以实现,实时的记录版本库的修改信息!注意: 所有的版本控制系统,其实只能跟踪文本文件的改动,而图片、视频这些二进制文件, 虽然也能有版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件的每次改动 串起来,也就是只知道图片从100kb改成了120kb但到底改了些什么,版本控制没法知道。暂存区 就是执行 git add 之...

2018-07-12 19:52:34 271

原创 USART串口通信

相关通信的基本概念通信可分为: 单工通信:任何时刻只能向一个方向传输数据半双工: 不可同时收发数据,但可分时收发全双工: 可同时收发数据-通信还可分为,同步和异步两种 有时钟信号的,都可认为是同步的!同步通信效率更高,但允许时钟误差较小。无时钟信号的,都可认为是异步的!异步通信为了保证数据传输的准确性,都会在原有数据基础上附带传输一些校验位,不需要时钟!-初始化串口...

2018-04-25 20:18:23 446

原创 EXTI中断程序编写

EXTI中断程序编写总结- EXTI中断主要涉及到AFIO、EXTI、NVIC以及GPIO这几个寄存器EXTI中断的具体编写步骤:先初始化与EXTI中断相关的GPIO寄存器,即欲将哪个GPIO端口设置为中断响应初始化EXTI寄存器,用于中断或者事件的产生。 先绑定输入线,即控制AFIO寄存器初始化EXTI结构体,即配置EXTI寄存器的相关参数初始化NVIC,用于处理中...

2018-04-22 15:15:58 1224

原创 系统时钟滴答计时器(sysTick寄存器)相关初始化结构体即初始化固件库函数分析

系统时钟计时器–SYSTICKsysTick工作原理:- sysTick 中断通过获取系统时钟(AHB 或者 AHB/8),通过重装载寄存器向递减计数器中存入初值,当递减计数器值为0时,触发相关的中断,我们也可以通过访问 SysTick-&gt;CTRL寄存器的第16位来判断是否计数完成(当递减计数器当前值为0时,该位置1,当该位被读取后,会自动清0)sysTick 中断属于...

2018-04-19 21:14:50 2271

原创 驱动模板编程总结

驱动模板xxx.c –&gt; 应用层驱动封装函数xxx.h –&gt; 应用层驱动封装函数头文件test.c –&gt; 测试驱动所有的应用层代码xxxDrv.c –&gt; 内核层驱动实现文件xxxDrv.h –&gt; 内核层驱动实现文件函数头文件Makefile –&gt; 编译管理 一个外设的驱动程序模板一般都需要这几个文件具体展开讲:xxxDrv.c –&...

2018-04-14 22:30:28 699

原创 STM32中通过固件库自己编写系统时钟配置文件

使用HSE配置系统时钟因为STM工程使用固件库,进入main函数时都已配置好时钟,所以我们自己编写时钟配置文件首先需要复位RCC寄存器!使能HSE判断HSE是否启动成功使能预取指设置FLASH等待周期配置3条总线的倍频因子配置锁相环,使能锁相环等待锁相环稳定选择锁相环输出为系统时钟,并等待其稳定void HSE_sysclock_config( uint32_t ...

2018-04-13 21:43:55 2093

原创 树的创建和遍历,线索二叉树的创建和遍历

#include &lt;stdio.h&gt;typedef int elemtype;define MAX 20typedef struct BiTree{ elemtype m_value; struct BiTree* lchild; struct Bitree* rchild;}*tree;void print_tree(tree T, int order){...

2018-04-05 17:22:47 257

原创 STL序列容器(vector)

#include &lt;iostream&gt;#include &lt;list&gt;#include &lt;vector&gt;#include &lt;deque&gt;using namespace std;template&lt;typename T&gt;void print(T begin, T end){ while (begin != end) { ...

2018-03-28 21:15:34 136

原创 使用C++类模板实现动态数组

#include &lt;iostream&gt;#include &lt;string&gt;using namespace std;//使用类模板实现动态数组!template&lt;typename T, int N&gt;class Array{private: T* m_array; int m_len;public: //构造函数,给数组申请空间 Array()...

2018-03-25 16:40:34 4552 3

原创 C++基础知识整理五(多态)

       所谓的多态,可以简单的理解为一个接口,多种方法,但是在程序运行时,特定的场合下,一个接口只能对应一个与其环境最匹配的方法。多态可以分为动态多态和静态多态。静态多态又可以称为是编译时多态;动态多态也可以称为运行时多态。C++的多态表现形式主要有函数重载、运算符重载和虚函数等,其中函数重载和运算符重载属于静态多态,即编译时多态;虚函数则是动态多态,即运行时多态。 编译时多态·  运算符重...

2018-03-19 21:34:05 308

Android启动流程.emmx

Android系统启动流程

2022-01-10

空空如也

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

TA关注的人

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