- 博客(109)
- 资源 (1)
- 收藏
- 关注
原创 Android Framework 之 ServiceManager
ServiceManager 在 Android 系统中扮演了核心的角色。主要负责跨进程通信(IPC)的管理和服务的注册与查找。
2023-08-01 17:50:24 632
原创 Android Framework 之 SystemServer
SystemServer是Android系统中的一个核心组件,负责启动和管理许多重要的系统服务。
2023-08-01 15:23:30 805
原创 Android Framework 之 Zygote
Android Zygote 是 Android 操作系统中一个关键的系统服务,它在系统启动时加载,为应用程序的运行提供了一种快速且资源高效的方式。
2023-08-01 14:37:59 510
原创 ROS软件包更新的全流程
OTA是一种无线分发和安装软件更新的技术,可以让用户在不连接电脑的情况下直接通过设备的无线网络(如Wi-Fi或蜂窝数据网络)进行系统升级。
2023-04-26 13:39:58 1908
原创 Linux 端口号占用如何处理
例如,tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd 表示SSH服务占用了本机的22端口,当前处于监听状态(LISTEN),对所有IP地址都开放(0.0.0.0),对外的远程地址尚未建立连接(Foreign Address为"*"),该端口号对应的进程PID为1234,进程名为sshd。查看并关闭占用该端口的进程:可以使用 netstat -tlnp 命令查看占用该端口的进程,找到该进程的PID,然后使用 kill 命令关闭该进程。
2023-03-17 20:38:48 8661
原创 C++ 捕获异常崩溃全流程
在程序崩溃后,程序的状态是不确定的,可能会存在一些问题,如内存泄漏、资源未释放等。因此,直接在崩溃后的程序中上传服务器可能会存在风险,可能会加重程序的负担,导致程序异常退出。另外,对于一些轻微的错误或者性能要求比较高的代码,使用返回错误码的方式也可以提高程序的执行效率。需要注意的是,exec() 系列函数执行成功后,将不会返回,因此在调用 execl() 之后的代码将不会被执行。同时,在上传过程中要注意数据的传输安全,以及上传数据的完整性和准确性,以确保开发者能够及时准确地获取到程序崩溃的信息。
2023-03-17 20:35:28 5309
原创 OpenGL ES 绘制一张图片
注意,上述接口程序中的第一行代码激活的是哪个纹理句柄,在第三行代码中的第二个参数就需要传递对应的 Index,就比如说代码中激活的纹理句柄是 GL_TEXTURE0,对应的第三行代码中的第二个参数 Index 就是 0,如果激活的纹理句柄是 GL_TEXTURE1,那对应的 Index 就是 1,句柄的个数在不同的平台不一样,但是一般都会在 32 个以上。而当缩小的时候,因为没有足够的片段来绘制所有的纹理单元,也会丢失很多细节,是真正的降采样。其中,mColorMatrix 是这个变量在接口程序中的句柄。
2023-02-21 18:16:28 1243
原创 OpenGL ES SDL库
SDL 可以给开发者提供面向 libSDL 的 API 编程,它的内部能解决多个平台的 OpenGL 上下文环境和窗口管理的问题。开发者只需要交叉编译这个库到各自的平台上,就可以达到一份代码运行到多个平台的目的了。FFmpeg 中的 ffplay 工具就是基于 libSDL 开发的,SDL 不单单可以渲染视频画面,也可以渲染音频。但是对于移动开发者来讲,它也有一些缺点,比如使用 SDL 会牺牲一些更加灵活的控制,甚至某些场景下的功能实现不了。
2023-02-21 16:29:55 365
原创 OpenGL ES上下文环境搭建
由于 OpenGL ES 一开始就是为跨平台设计的,所以它本身并不承担窗口管理以及上下文环境构建的职责,这个职责需要由各自的平台来承担。Android 平台使用的是 EGL,EGL 是 Khronos 创建的一个框架,用来给 OpenGL 的输出与设备的屏幕搭建起一个桥梁。
2023-02-21 16:22:22 1442
原创 OpenGL 渲染管线与显卡可执行程序
其中,第一个参数 GLuint program 就是传入在上面一步返回的程序容器的句柄,第二个参数 GLuint shader 就是编译的 Shader 的句柄,当然要为每一个 shader 都调用一次这个方法才能把两个 Shader 都关联到 Program 中去。绘制方式的可选值有点、线、三角形三种,分别应用于不同的场景中。通过纹理坐标取得纹理中相对应的片元像素值,根据自己的需要改变这个片元,比如调节饱和度、锐化等,最终输出的是一个四维向量 gl_FragColor,我们用它来表示修改之后的片元像素。
2023-02-21 16:00:41 594
原创 OpenGL ES基础简介
视频的渲染源是 YUV 或者 RGBA 格式的数据,这种数据是描述画面最基础的格式,其中 YUV 常用在视频的原始格式中,RGBA 常用在一些图像的原始格式上。目前各个平台最终渲染到屏幕上的都是 RGBA 格式的,因为硬件对屏幕上的设计就是按照每个像素点分为四个子像素来实现的,所以 YUV 和 RGBA 之间是可以互相转换的。
2023-02-21 11:48:45 664
原创 Netty 学习笔记——请求处理
Netty 批量写数据时,如果想写的都写进去了,接下来的尝试写更多(调整 maxBytesPerGatheringWrite)。Netty 待写数据太多,超过一定的水位线(writeBufferWaterMark.high()),会将可写的标志位改成。Netty 只要有数据要写,且能写的出去,则一直尝试,直到写不出去或者满 16 次(writeSpinCount)。Netty 写数据,写不进去时,会停止写,然后注册一个 OP_WRITE 事件,来通知什么时候可以写进去了再写。
2023-02-13 14:07:42 490
原创 Netty 学习笔记——概念篇
Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。
2023-02-13 13:28:54 529
原创 UNIX 线程相关知识体系
介绍了现有的创建和销毁线程的方法,还介绍了线程同步问题,讨论了5个基本同步机制(互斥量、读写锁、条件变量、自旋锁、屏障)
2022-11-07 17:13:38 370
原创 OpenCV 常用函数汇总(bitwise_*、pointPolygonTest、morphologyEx)
OpenCV 常用函数汇总(bitwise_*、pointPolygonTest、morphologyEx)
2022-10-14 16:33:32 1114
原创 OpenCV 常用函数汇总(normalize、getStructuringElement、erode、dilate)
OpenCV 常用函数汇总(normalize、getStructuringElement、erode、dilate)
2022-10-12 18:45:03 1797
原创 OpenCV 常用函数汇总(findContours、drawContours、getRotationMatrix2D、warpAffine、invertAffineTransform)
OpenCV 常用函数汇总(findContours、drawContours、getRotationMatrix2D、warpAffine、invertAffineTransform)
2022-10-11 11:02:52 1034
原创 OpenCV 常用函数汇总(distanceTransform、minMaxLoc、resize、convertTo、threshold)
OpenCV 常用函数汇总(distanceTransform、minMaxLoc、resize、convertTo、threshold)
2022-10-11 10:47:02 928
原创 OpenCV 常用函数汇总(imread、floodFill、Canny、HoughLines、HoughLinesP)
OpenCV 常用函数汇总(imread、floodFill、Canny、HoughLines、HoughLinesP)
2022-10-11 10:35:10 962
原创 C++ 11 后一些便捷用法
自动类型推断,就是编译器能够根据表达式的类型,自动决定变量的类型(从 C++14 开始,还有函数的返回类型)但需要说明的是,auto 并没有改变 C++ 是静态类型语言这一事实——使用 auto 的变量(或函数返回值)的类型仍然是编译时就确定了,只不过编译器能自动帮你填充而已。decltypedecltype 的用途是获得一个表达式的类型,结果可以跟类型一样使用。它有两个基本用法:如果我们有 int a;,那么:类模板的模板参数推导列表初始化类数据成员的默认初始化如果一个类没有使用初始化列
2022-07-23 17:25:06 357
原创 C++ 中容器合集
string是模板basic_string对于char类型的特化,可以认为是一个只存放字符char类型数据的容器。“真正”的容器类与string的最大不同点是里面可以存放任意类型的对象。不管是内存布局,还是成员函数,string和vector是非常相似的。string当然是为了存放字符串。一般不建议在接口中使用conststring&,除非确知调用者已经持有string。...
2022-07-23 15:25:14 550
原创 线程、锁相关知识
线程安全原子性,简单说就是相关操作不会中途被其他线程干扰,一般通过同步机制实现。可见性,是一个线程修改了某个共享变量,其状态能够立即被其他线程知晓,通常被解释为将线程本地状态反映到主内存上,volatile 就是负责保证可见性的。有序性,是保证线程内串行语义,避免指令重排等。synchronizedsynchronized 代码块是由一对儿 monitorenter/monitorexit 指令实现的,Monitor 对象是同步的基本实现单元。在 Java 6 之前,Monitor 的实现完全是
2022-07-10 00:13:30 206
原创 Effective C++
让自己习惯 C++条款1:视 C++ 为一个语言联邦条款2:尽量以 const、enum、inline 替换 #define条款3:尽可能使用 const条款4:确定对象使用前已先被初始化构造/析构/赋值运算条款5:了解 C++ 默认编写并调用哪些函数条款6:若不想使用编译器自动生成的函数,就该明确拒绝条款7:为多态基类声明 virtual 析构函数条款8:别让异常逃离析构函数条款9:绝不在构造和析构过程中调用 virtual 函数条款10:令 operator= 返回一个 refer
2022-01-24 12:17:52 192 1
原创 给 Android 开发者的第一堂课
安卓(Android)是一种基于 Linux 内核(不包含 GNU 组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由美国 Google 公司和 开放手机联盟 领导及开发。Android 操作系统最初由 Andy Rubin 开发,主要支持手机。2005年8月由 Google 收购注资。2007年11月,Google 与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良 Android 系统。随后 Google 以 Apache 开源许可证的授权方式,发布了
2022-01-24 10:56:06 2096
原创 Linux 命令行(持续记录)
Linux 命令行(持续记录)文件管理切换目录 cd查看目录 ls打印文件到命令行 cat编辑文件 Vim进入编辑模式插入 i退出编辑模式 esc保存 : 后面输入 w退出 : 后面输入 q不保存退出 : 后面输入 q!改变文件所属用户 chown改变文件所属组 chgrp下载文件 wget搜索文件 grep部分显示 more、less运行程序命令行运行运行 ./filename退出 ctrl+c后台运行运行 nohup command >out.file 2>&1 &退出 ps
2021-10-11 10:29:32 405
原创 TCP / IP 协议
TCP / IP 协议TCP / IP 简介TCP / IP 协议分层应用层:具体应用如下传输层:网络层 :网络接口层:专业名词解释IP地址IP 路由器域名TCP/IPSocketTCP报文格式连接(握手)三次握手断开(挥手)四次握手UDP (用户数据报协议)无连接无阻塞不可靠面向报文数据量小UDP 广播UDP 多播多播的优点:组播的缺点:UDP 单播TCP和UDP的区别HTTPHTTP 与 TCP 的关系WebSocketHTTP 与 WebSocket 的异同点同异应用RosBridgeAndroid
2021-09-24 17:55:31 302
原创 Android-View 事件分发
欲哭无泪呀~~老生常谈下 Android 的事件分发机制。面试经常被问到事件分发机制,看过好多篇博客、文章了,但被问起来总是系统的答不上来。脑海中只记得三个主要的函数,写代码时候也是多次测试去处理(其实大多数都是 百度 解决),这里自己记录一下。我的粗略回答Activity -> Window -> DecorView(ViewGroup) -> ViewdispatchTouchEvent -> onInterceptTouchEvent -> onTouchEven
2021-07-12 23:29:31 304 3
原创 Android UI 渲染
先附上一张 Android UI 渲染的整体架构低级别组件BufferQueue 和 gralloc:BufferQueue 将可生成图形数据缓冲区的组件(生产者)连接到接受数据以便进行显示或进一步处理的组件(消费者)。通过供应商专用 HAL 接口实现的 gralloc 内存分配器将用于执行缓冲区分配任务。SurfaceFlinger、Hardware Composer 和虚拟显示屏:SurfaceFlinger 接受来自多个源的数据缓冲区,然后将它们进行合成并发送到显示屏。Hardware Co
2021-07-08 16:37:43 357
原创 Linux环境下进程的CPU占用率
Linux 环境下查看 CPU 信息通过 cat /proc/cpuinfo 命令,可以查看 CPU 相关的信息Processor : AArch64 Processor rev 14 (aarch64)processor : 0BogoMIPS : 38.40Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcp
2021-07-07 11:12:47 1439 2
原创 分布式锁的实现方式
介绍几种常用的分布式锁的实现MySql常用函数lock() 一般是阻塞式的获取锁,意思就是不获取到锁誓不罢休;tryLock() 是非阻塞获取锁,如果获取不到那么就会马上返回。适用场景Mysql分布式锁一般适用于资源不存在数据库,如果数据库存在比如订单,那么可以直接对这条数据加行锁,不需要我们上面多的繁琐的步骤,比如一个订单,那么我们可以用select * from order_table where id = ‘xxx’ for update进行加行锁,那么其他的事务就不能对其进行修改。
2021-06-02 18:01:37 130
原创 编程思想汇总
CC 语言是一个静态弱类型语言,在使用变量时需要声明变量类型,但是类型间可以有隐式转换;不同的变量类型可以用结构体(struct)组合在一起,以此来声明新的数据类型;C 语言可以用 typedef 关键字来定义类型的别名,以此来达到变量类型的抽象;C 语言是一个有结构化程序设计、具有变量作用域以及递归功能的过程式语言;C 语言传递参数一般是以值传递,也可以传递指针;通过指针,C 语言可以容易地对内存进行低级控制,然而这加大了编程复杂度;编译预处理让 C 语言的编译更具有弹性,比如跨平台。
2021-06-02 14:07:26 429
原创 Glide 全局配置(缓存、线程、OkHttp)
Glide 是 Android 中有名的图片加载框架了,这篇文章不是列举 Glide 的加载图片函数及入参方式含义,相信这些很多博客都有介绍基本使用,也不是深入底层源码去查看缓存、生命周期、转换等源码实现方式,仅仅为了模板的介绍下 Glide 的全局基础配置。此篇博客较为简短,意在提供相关的基础配置,如有哪里错误,欢迎及时指出。贴出一张 Glide 的框架大致图(源码一定要读)首先,引入 Glide 依赖,这里用到了 Kotlin,大家应该都不陌生了(okhttp3-int...
2020-10-29 00:06:12 3633
原创 Kotlin 之 Flow
Flow 库是在 Kotlin Coroutines 1.3.2 发布之后新增的库,也叫做异步流,类似 RxJava 的 Observable、Flowable 等等,所以很多人都用 Flow 与 RxJava 做对比。而Flow 则比 RxJava 简单很多。我们知道 MVVM 中 LiveData 是一个生命周期感知组件,最好在 View 和 ViewModel 层中使用它,如果在 Repositories 或者 DataSource 中使用会有这两个主要的问题:不支持线程切换,其次不支持背压。..
2020-10-28 22:45:11 849
原创 代理、适配器、桥接、装饰,这四个模式的区别
代理模式在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。代理模式的原理与实现在不改变原始类(或叫被代理类)的情况下,通过引入代理类来给原始类附加功能。一般情况下,我们让代理类和原始类实现同样的接口。但是,如果原始类并没有定义接口,并且原始类代码并不是我们开发维护的。在这种情况下,我们可以通过让代理类继承原始类的方法来实现代理模式。动态代理的原理与实现静态代理需要针对每个类都创建一个代理类,并且每个代理类中的代码都有点像模板式的“重复”代码,增加了维护成本和开
2020-10-23 22:54:36 299
原创 Retrofit 支持 Kotlin 协程
上期 Retrofit 源码解读,这期查看下如何支持 Kotlin 协程的。(上篇的 retrofit 版本 可能与这篇不同)例子还是最简单的标准例子,定义 interface 接口,这里就不贴多余代码了 @GET("/app/v1/commodity") suspend fun commodity( @Query("pageNo") pageNo: Int, @Query("pageSize") pageSize: Int ): BaseRe
2020-09-12 18:42:37 969
原创 指针小结
1、声明指针要声明指向特定类型的指针,请使用下面的格式: typeName * pointerName;下面是一些示例: double * pn; char * pc;其中,pn 和 pc 都是指针,而 double * 和 char * 是指向 double 的指针和指向 char 的指针。2、给指针赋值应将内存地址赋值指针。可以对变量名应用 & 运算符,来获得被命名的内存地址,new 运算符返回未命名的内存地址。下面是一些示例:.
2020-08-12 00:27:57 194
原创 由 RxJava Zip 操作符引起的串行并行操作
今天用到了 RxJava2 中 zip 操作符,目的是下载两张图片后合成为一张图片。具体代码不就贴出来了,简单提供一个小的操作流模拟两个下载图片的Flowable ,代码如下 (kotlin) val just = Flowable.create<String>({ XLog.e("是否是主线程 1 : ${Looper.getMainLooper() == Looper.myLooper()}") Thread.slee.
2020-08-06 19:40:02 847
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人