- 博客(106)
- 收藏
- 关注
原创 bindService() 跨进程调用流程的请求流程
bindService 跨进程调用流程的请求流程## ContextImpl#bindService()### Parcel#writeStrongBinder()### BinderProxy#transact()## 剩下的流程就概括一下## 最后看下 InnerConnection 是个啥?
2023-03-09 06:09:51 446
原创 获取 ActivityManagerService 服务
获取 ActivityManagerService 服务一、Java 层获取系统服务二、SystemServiceRegistry 静态代码块,创建并保存服务三、获取 ActivityManagerService 服务流程四、补充:API 25 获取 AMS 的方式API 26一、Java 层获取系统服务Context#getSystemService()// Context 的实现类是 ...
2020-08-13 00:37:33 4814
原创 Binder—Binder 对象生命周期
Binder——Binder 对象生命周期注册服务流程注册服务整个流程,涉及 Binder 对象生命周期的地方,概括如下:获取服务流程获取服务整个流程,涉及 Binder 对象生命周期的地方,概括如下:获取服务过程,涉及 Binder 对象声明周期,时间路线:BpBinder 对象存在直接返回已创建的,从代码角度看体现在哪?注册服务流程注册服务,详细步骤如下:注册服务进程发送 BC_TRANSACTION 协议给 Binder 驱动程序 // 调用的是 binder_thread_write 函数,
2020-08-11 15:39:23 904
原创 Binder—获取服务
Binder—获取服务获取服务一、BC_TRANSACTIONbinder_ioctl二、BR_TRANSACTION三、BC_REPLY四、BR_REPLY五、Client 收到服务句柄 handle获取服务(1)Client 进程将进程间通信数据封装在 binder_write_read 中,用来传递给 Binder 驱动程序Client 进程发送的进程间通信数据:目的进程 ServerManager + 服务名称(要访问的服务) + 要调用的函数:该函数返回服务句柄(2)Client 进程
2020-07-22 13:12:32 845
原创 Binder—ServiceManager 启动过程
Binder—ServiceManager 启动过程一、main:入口函数1.1 binder_open:打开和映射 Binder 设备文件1.2 binder_become_context_manager:注册为 Binder 进程间通信机制的上下文管理者1.3 binder_loop:循环等待 Client 进程请求二、ServiceManager 启动过程时序图一、main:入口函数[–>service_manager.c, main()]int main(int argc, char *
2020-07-21 03:56:27 622
原创 TCP 概述 可靠的、面向连接的、基于字节流、全双工的协议
TCP 概述 可靠的、面向连接的、基于字节流、全双工的协议目标一、TCP 是面向连接的协议三次握手二、TCP 协议是可靠的校验和包的序列号超时重传流量控制、拥塞控制三、TCP 是面向字节流的协议四、TCP 是全双工的协议五、问题目标了解 TCP 协议了解三次握手一、TCP 是面向连接的协议面向连接(connection-oriented)面向连接的协议要求正式发送数据之前需要通过握手建立一个逻辑连接,结束通信时也是通过有序的四次挥手来断开连接无连接(connectionless)无连接
2020-06-01 00:01:00 3437
原创 Linux 内核双向链表 list_head
可以表示一个学生的链表(将一个个学生链起来),成员变量 可以表示前和后的指针问题 1:list_head 既然是双向链表,链接的数据是什么,在哪里?问题 2:真的能用 struct list_head 替换 struct student 吗?解:list_head 作为 student 的成员,通过 list_head 的地址可以获得 student 的地址(关键就是 list_entry 宏)1.2 宏 container_of先看第一行代码第一行代码的作用是获取结构体 member 的地
2020-03-30 00:32:50 854
原创 switch-case 无 break 如何打印
switch-case 无 break 如何打印一、switch-case 无 break 时打印二、switch-case 有 break 时打印一、switch-case 无 break 时打印public class Test { public static void main(String[] args) { int a = 1; switch (a) { case 1...
2020-03-16 23:07:20 433
原创 简单理解 Binder 机制
简单理解 Binder 机制一、为什么要用 Binder二、Binder 进程间通信机制三、Java 层中的 Binder 分析关键一:getIServiceManager()问题一:getIServiceManager() 方法返回是什么,ServiceManager 的代理对象吗关键 1.1:ServiceManagerNative.asInterface() 需要关键 1.2 的返回值作为参...
2020-02-29 21:10:32 1208 1
原创 为什么 main() 函数直接调用其他函数交换两个数没效果?
为什么 main 函数直接调用其他函数交换两个数没效果?一、题目:如何交换两个数二、查看汇编代码三、总结四、那怎么交换两个数?4.1 指针4.2 引用4.3 直接在 main() 函数中交换一、题目:如何交换两个数#include <stdio.h>void swap(int a, int b) { int temp = a; a = b; b = te...
2020-02-28 23:48:14 868
原创 String 和它的 intern()
String 和它的 intern先做道题一、String 字符串编译期常量池字符串常量池intern() 方法(JDK 1.8)字符串分析(JDK 1.8)先用双引号创建字符串,再用一个 new 创建字符串JVM 启动过程中加入常量池的字符串先用一个 new 创建字符串先用两个 new 创建字符串总结先做道题Q1:定义了几个对象?public class Q1 { public s...
2020-02-10 00:00:35 296
原创 深入理解 TCP 协议:TCP_IP 历史与分层模型
深入理解 TCP 协议:TCP_IP 历史与分层模型目标一、TCP/IP 协议栈历史背景二、TCP/IP 网络分层三、习题目标了解 TCP/IP 协议历史理解 TCP/IP 协议分层使用 wireshare 抓包,查看网络分层一、TCP/IP 协议栈历史背景1969 年,当时 Intent 是美国国防部高级研究计划局(Advanced Research Projects Agenc...
2020-01-31 22:24:50 957 1
原创 网络编程 26(下)阻塞 I/O 线程池模型
网络编程 26(下)阻塞 I/O 线程池模型目标一、线程的两个概念二、阻塞 I/O 线程池模型服务端目标问题:虽然线程是轻量级的,但如果并发连接过多,线程的频繁创建和销毁会有一定的开销(虽然上下文切换开销不大)解:使用线程池的方式,在服务端启动的同时,预先创建一定数量的线程,避免频繁进行线程创建和销毁一、线程的两个概念锁(mutex):当前线程操作时,其它线程不能进入,保证线程安全条...
2019-12-20 00:56:05 184
原创 网络编程 26(上)阻塞 I/O 线程模型
网络编程 26_阻塞 I/O 线程模型目标一、POSIX 线程模型1.1 创建线程1.2 终止线程父线程终止所有子线程父线程终止某个子线程回收已终止线程资源1.3 分离线程二、阻塞 I/O 线程模型服务端三、CMake 管理当前项目① 代码组成② 创建并进入 build 目录③ 外部编译四、测试总结目标使用轻量级的线程处理多个连接,为每一个连接创建一个独立的线程去服务一、POSIX 线程模型...
2019-12-19 01:03:03 463
原创 网络编程 25_阻塞 I/O 进程模型
目标为每一个连接创建一个独立的进程去服务一、父子进程进程是程序执行的最小单位,创建进程使用 fork 函数fork 创建进程pid_t fork(void);调用一次,在父子进程中各返回一次,在父进程中返回进程 ID 号,在子进程中返回 0,只能通过返回值判断当前执行的进程是父进程还是子进程if (fork() == 0) { // 子进程} else { // ...
2019-12-15 18:31:24 343
原创 网络编程 23_高性能 I/O 复用技术 epoll
网络编程 23_高性能 I/O 复用技术 epoll目标一、epoll 机制的三个函数二、epoll 用法2.1 创建 epoll 对象2.2 填充 epoll_event 结构体2.3 注册事件监听到 epoll 对象2.4 等待监听的事件到来三、epoll 例子四、CMake 管理当前项目① 代码组成② 创建并进入 build 目录③ 外部编译五、测试总结目标理解并使用 epollepo...
2019-12-14 22:05:01 291
原创 网络编程 22_非阻塞 I/O + select 多路复用
网络编程 22_非阻塞 I/O + select 多路复用目标一、非阻塞 I/O + select 多路复用服务端二、CMake 管理当前项目① 代码组成② 创建并进入 build 目录③ 外部编译三、测试总结目标理解阻塞和非阻塞的区别阻塞应用程序调用阻塞的 I/O 获取资源时,在资源可以获取之前,应用程序会被挂起,进程进入休眠状态,让出 CPU 给其它进程,给人的感觉像是被 “阻塞” ...
2019-12-08 23:19:23 401
原创 网络编程 21_poll
网络编程 21_poll目标一、函数介绍二、poll 通信例子服务端客户端目标理解 poll 函数一、函数介绍int poll(struct ploofd *fds, unsigned long nfds, int timeout);参数pollfd:数组 fdsnfds:数组 fds 大小timeout:描述 poll 行为,小于 0,一直等待;等于 0,立即返回不阻塞;大于...
2019-11-30 21:49:31 297
原创 网络编程 期中_动手编个小程序
网络编程 期中_动手编个小程序一、题目二、开始客户端服务端三、CMake 管理当前项目① 代码组成② 创建并进入 build 目录③ 外部编译四、测试一、题目请分别写一个客户端程序和服务器程序,客户端程序连接上服务器之后,通过敲命令和服务器进行交互,支持的交互命令包括:pwd:显示服务器应用程序启动时的当前路径cd:改变服务器应用程序的当前路径ls:显示服务器应用程序当前路径下的文件列...
2019-11-19 23:19:05 330
原创 08 匿名内部类与 lambda —— lambda 表达式背后的字节码原理
08 匿名内部类与 lambda —— lambda 表达式背后的字节码原理问:lambda 表达式是匿名内部类的语法糖吗一、测试匿名内部类二、测试 lambda 表达式核心的 metafactory 定义核心的 metafactory() 函数小结思考题回答问:lambda 表达式是匿名内部类的语法糖吗答案在末尾一、测试匿名内部类public class Test { publi...
2019-11-05 05:52:30 1544 1
原创 网络编程 11_连接关闭
网络编程 11_连接关闭目标一、常用函数close 函数shutdown 函数二、select 多路复用客户端服务端目标理解连接关闭整个流程一、常用函数close 函数close() 函数会对套接字引用计数减一,当减为 0 时,会释放套接字,并且关闭 TCP 两个方向的数据流// 返回值:0 成功,-1 出错int close(int sockfd);close() 关闭两个方向...
2019-11-03 20:35:22 290
原创 网络编程 06_使用 UDP 进行读写
网络编程 06_使用 UDP 协议进行读写目标一、发送报文二、接收报文三、UDP 通信例子服务端客户端三、CMake 管理当前项目① 代码组成② 创建并进入 build 目录③ 外部编译四、测试 UDP 例子场景一:先运行客户端,再运行服务端场景二:先运行服务端,再运行客户端场景三:同时开启多个客户端场景四:中途重启服务器小结目标使用 UDP 协议收发数据,了解与 TCP 协议的区别一、发送...
2019-10-26 19:57:33 832
原创 网络编程 05_使用 TCP 进行读写
目标使用创建的套接字收发数据一、发送数据常用函数ssize_t write(int socketfd, const void *buffer, size_t size)ssize_t send(int socketfd, const void *buffer, size_t size, int flags)ssize_t sendmsg(int sockfd, const struct...
2019-10-20 04:48:24 627
原创 CMake:04 使用外部共享库和头文件
04 使用外部共享库和头文件任务目标一、准备工作二、外部构建三、运行可执行程序 main小结任务目标编写一个程序,使用 静态库与动态库构建 构建的共享库 libhello.so一、准备工作① 进入 /home/lql/cmake 目录,新建工作目录 t4cd /home/lql/cmake && mkdir t4② 新建 src 目录(用于存放源文件 main.c...
2019-10-05 20:06:30 436
原创 CMake:03 静态库与动态库构建
03 静态库与动态库构建任务目标一、准备工作二、外部构建三、添加静态库四、安装五、指令解释小结任务目标建立一个静态库和动态库,提供 HelloFunc 函数供其他程序编程使用,HelloFunc 向终端输出 Hello World 字符串安装头文件与共享库一、准备工作① 进入 /home/lql/cmake 目录,新建工作目录 t3cd /home/lql/cmake &&...
2019-10-05 19:20:41 156
原创 CMake:02 外部构建以及安装 CMake
02 外部构建以及安装 CMake任务目标一、外部构建 CMake 的 HelloWorld二、安装方式一:从代码编译后直接 make install 安装指定 Makefile 安装生成目录定义前缀 PREFIX方式二:打包时的指定目录安装指令解释任务目标外部构建 CMake安装 CMake一、外部构建 CMake 的 HelloWorld① 进入 /home/lql/cmake ...
2019-10-05 19:00:34 450
原创 02 字节码原理初步 —— 基于栈的执行引擎
02 字节码原理初步 —— 基于栈的执行引擎一、栈、寄存器二、栈帧(Stack Frame)三、举个 xue 微复杂的栗子未完待续一、栈、寄存器基于栈的指令集移植性更好,代码更紧凑、编译器实现更简单基于寄存器的指令集完成相同功能所需的指令数更少,执行速度更快一些二、栈帧(Stack Frame)栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构栈帧随着方法调用而创建,随着方法结束而...
2019-09-30 23:56:54 160
原创 01 字节码初体验 —— 从 Hello World 说起
Hello.javapublic class Hello { public static void main(String[] args) { System.out.println("Hello, World"); }}javac把源文件编译成 JVM 可识别的 class 文件javac Hello.javaxxd 查看 class 文件xx...
2019-09-30 23:48:21 320
原创 Activity、Dialog、Toast 的 Window 创建过程
Activity、Dialog、Toast 的 Window 创建过程一、Activity 的 Window 创建过程:二、Dialog 的 Window 创建过程:三、Toast 的 Window 创建过程:一、Activity 的 Window 创建过程:Activity#setContentView():① 在 ActivityThread#PerformLauncherActivit...
2019-09-30 23:26:39 352
原创 TCP 三次握手函数调用
TCP 三次握手一、服务端监听连接二、客户端发起连接三、通配地址四、地址格式一、服务端监听连接socketbindlistenaccept服务端监听连接1.socketint socket(int domain, int type, int protocol)domainPF_INET、PF_INET6、PF_LOCALtypeSOCK_STREAM(字节流,对应...
2019-09-30 23:11:24 1031
原创 02 TCP 协议:如何保证页面文件能被完整送达浏览器
02 TCP 协议:如何保证页面文件能被完整送达浏览器一、数据包的旅程1.1 主机 A 发送数据包给主机 B1.2 UDP:把数据包送达应用程序TCP:把数据完整的送达应用程序三、总结四、补充一、数据包的旅程互联网中的数据是通过数据包来传输的,传输的两端需要有一个共同的协议标准,这样数据包才能正确发送,准确送达数据包如何送达主机数据包在网络上传输,要遵守 IP 协议,每一个网络设备都有一个...
2019-08-31 23:35:59 391 1
原创 08 ELF 和静态链接:为什么程序无法同时在 Linux 和 Windows 下运行?
08 ELF 和静态链接:为什么程序无法同时在 Linux 和 Windows 下运行?一、编译、链接、装载1.1 说的简单,具体怎么个流程1.2 生成可执行文件二、C 语言 - 汇编代码 - 机器码三、ELF 格式和链接:理解链接过程四、总结一、编译、链接、装载一段 C 语言程序,通过编译器编译成汇编代码,汇编代码通过汇编器变成机器码,于是 CPU 就可以执行这些机器码1.1 说的简单,具...
2019-08-31 19:46:16 213
原创 05 计算机指令:使用纸带编程
05 计算机指令一、编译成汇编补充:生成 Linux 汇编二、解析指令和机器码2.1 MIPS 指令集三、举个栗子一、编译成汇编test.c// test.cint main(){ int a = 1; int b = 2; a = a + b;}程序想要在 Linux 操作系统上运行,需要将整个程序翻译成一个汇编代码的程序,这个过程叫编译成汇编代码对于汇...
2019-08-31 19:31:41 1148
原创 01 Chrome 架构:仅仅打开一个页面,为什么有 4 个进程?
01 Chrome 架构:仅仅打开一个页面,为什么有 4 个进程?一、浏览器架构1.1 进程和线程1.2 单进程架构1.3 多进程架构1.4 目前多进程架构二、标题答案一、浏览器架构1.1 进程和线程一个进程对应一个程序的运行实例。启动一个程序,操作系统回味该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,这样的一个环境叫主线程线程依附于进程,线程之间共享进程中的数据...
2019-08-31 19:00:30 470
原创 Day08_JNI、Linux 常用命令
Day08_JNI、Linux 常用命令一、JNI_OnLoadJNI_OnLoad()静态注册动态注册二、native 线程调用 Java三、Linux 常用命令(略)一、JNI_OnLoad通过 System.loadLibrary() 去加载 NDK 编译生成的动态库时,内部就会先去找动态库中是否有 JNI_OnLoad 这个函数,找到了就会调用这个函数JNI_OnLoad 函数会告诉...
2019-07-31 23:48:21 453
原创 二叉树操作——前序、中序、后序、层序
二叉树遍历——前序、中序、后序、层序获取树的深度先上树#include <jni.h>#include <string>#include <android/log.h>#include <queue>#define JNI_TAG "JNI_TAG"#define LOGE(...) __android_log_print(ANDR...
2019-07-31 23:29:48 240
原创 数据结构与算法——排序
数据结构与算法——排序冒泡排序(时间复杂度:O(N^2),额外空间复杂度:O(1))选择排序(时间复杂度:O(N^2),额外空间复杂度:O(1))插入排序(时间复杂度:O(N^2),额外空间复杂度:O(1))归并排序(时间复杂度:O(N*logN),额外空间复杂度:O(N))冒泡排序(时间复杂度:O(N^2),额外空间复杂度:O(1))第一次:0 位置和 1 位置的数比较第二次:1 位置和 ...
2019-07-30 23:48:25 157
原创 CMake:01 编写 CMake 的 HelloWorld
编写 Cmake 的 HelloWorld一、HelloWorld二、CMake 语法2.1 常见用法2.2 语法简介2.3 语法规则一、HelloWorld1.选择某个目录(这里我选择的是 /home/lql,即家目录)为根目录,进入该目录① 进入家目录命令(有两种方式)// 普通用户家目录 /home/xxx,root 用户家目录 /rootcd /home/lql或cd ~...
2019-07-28 20:52:32 614
原创 字节码角度看面试题 —— try catch finally 为啥 finally 语句一定会执行
字节码角度看面试题 —— try catch finally 为啥 finally 语句一定会执行一、try catch 字节码分析1.1 一个 catch1.2 多个 catch二、finally 字节码分析三、小结四、留道题一、try catch 字节码分析1.1 一个 catchpublic class Test { public void foo() { tr...
2019-06-24 23:11:16 2064 1
原创 字节码角度分析面试题 —— i++、++i 傻傻分不清楚
字节码角度分析面试题 —— i++、++i 傻傻分不清楚一、什么都憋说,先看题二、i++二、++i三、看一道 xue 微难一点的题目四、小结五、最后一题六、回答一、什么都憋说,先看题public class Test { public static void foo() { int i = 0; for (int j = 0; j < 50; j+...
2019-06-16 20:31:12 340
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人