- 博客(87)
- 收藏
- 关注
原创 [Android] JNI技术
JNIEnv是一个与线程相关的代表JNI环境的结构体JNIEnv实际上就是提供了一些JNI系统函数,通过这些函数可以调用Java的函数,操作object对象很多事情。通过JNIEnv操作jobject和jstring从C/C++到Java的调用(回调)1.生成Java对象,可以使用函数NewObject();2.调用Java类的方法,例如,方法的返回值是int型,则需要调用函数callIntMethod()。3.存取Java类的域变量(得到、设置非静态域变量;得到、设置静态域变量)
2024-09-02 10:28:20
523
原创 [Android] Android四大组件
started service(启动服务)是由其他组件调用startService()方法启动的,当服务是started。(1)started(启动):当应用程序组件(如activity)调用startSerive()方法启动服务时,(2)bound(绑定):当应用程序组件调用bindService()方法绑定到服务时,服务处于。使用bindService()方法启用服务,调用者与服务绑定在一起,调用者一旦退出,服务也就。服务(service),后台运行服务,不提供界面呈现;服务处于started状态。
2024-09-02 10:26:31
670
原创 [Android] logcat抓取日志
Android日志系统主要由logd守护进程进行管理,liblog提供读写日志的接口,longcat提供读取日志的参数命令;日志抓取前使用adb logcat -c命令来清除缓冲区。可以通过宏定义日志的标签,并通过adb logcat | crgep “标签”来抓取指定的日志信息。日志的过滤并重定向到文件中的例子:adb logcat *:E > test.log。logcat抓log方法:adb logcat命令,可以加条件过滤。main:查看日志缓冲区(默认),不包含系统和崩溃日志消息。
2024-09-02 10:23:25
2957
原创 adb连接开发板出错
开发板上重新挂载分区:mount -o rw,remount 分区(/system)shell终端显示开发板:adb shell(断开:exit)上传文件:adb push 本地原文件 开发板路径。下载文件:adb pull 开发板路径 本地路径。查看ip地址:ip addr、ifconfig。断开连接:adb disconnect ip。连接开发板:adb connect ip。查看连接设备:adb devices。或者执行以下命令来开启adb。
2024-09-02 10:02:55
463
原创 Android中Bionic模块
在可执行文件的装载过程中,所有装载进来的动态库对应的soinfo结构都会放到一个链表中,当新装载一个动态库时,会首先检查它是否已经存在于链表中,如果不存在才会继续装载。而linker伪造了一个libdl.so的soinfo结构,并放在了链表第一个元素的位置,因此程序中链接的libdl.so并不会真正的装载。Hook API的原理是利用ptrace函数把一小段代码注入目标程序中,这小段代码的任务是:装载自己开发的动态库到目标进程中,然后查找目标进程中特定函数在全局偏移表中的位置,替换成自己动态库的函数地址。
2024-09-02 09:52:46
1705
原创 docker 常用命令
/上传镜像文件和 9 配套使用11>docker tag IMAGE_ID REPOSITORY:TAG //设置镜像的名和标签。//–dns 参数用于在 Docker 容器内部设置 DNS 解析服务器,如–dns 114.114.114.114。令 docker ps 获取,另外,若镜像名是当前所属的镜像的名字,则修改会被保存到当前的镜像中。//查看当前运行的镜像,-a 表示查看全部镜像。//运行指定镜像,-it 表示交互式操作,//启动一个已停止的容器。//查看当前所有的镜像。//指明谁创建的容器。
2024-08-30 13:38:06
302
原创 [驱动程序] 中断的实现(中断下半部)
上半部和下半部。上半部:上半部就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成。下半部:如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出。中断上半部是关中断的状态,也就是CPU不接收其他中断,因此中断上半部要快,不然会丢中断。中断下半部是开中断的状态,CPU可以接收其他中断。
2024-08-30 09:46:19
1677
原创 [驱动程序] 中断的实现(中断上半部)
如果使用request_threaded_irq,大都是使用第三种组合,irq_default_primary_harder返回IRQ_WAKE_THREAD,将工作交给thread_fn进行处理。第一种组合比较复杂,在handler中根据实际情况返回IRQ_WAKE_THREAD(唤醒内核中断线程)或者IRQ_HANDLED(中断已经处理完毕,不需要唤醒中断内核线程)。常见用法:中断服务函数调用disable_irq_nosync关闭中断,中断下半部调用enable_irq打开中断。
2024-08-30 09:45:22
1090
原创 [驱动程序] 常见OF操作函数
设备都是以节点的形式“挂”到设备树上的,因此要想获取这个设备的其他属性信息,必须先获取到这个设备的节点。Linux 内核使用 device_node 结构体来描述一个节点,此结构体定义在文件 include/linux/of.h 中。
2024-08-30 09:44:52
1567
原创 [驱动程序] 设备树语法
第 19 行,子节点 dcp: dcp@02280000 的 reg 属性值为<0x02280000 0x4000>,因为父节点设置了#address-cells = <1>,#size-cells = <1>,address= 0x02280000,length= 0x4000,相当于设置了起始地址为 0x02280000,地址长度为 0x40000。第一行,“/”是根节点,每个设备树文件只有一个根节点,而dts和dtsi的都会有一个根节点,这两个“/”或多个根节点的内容会合并成一个根节点的内容。
2024-08-30 09:44:26
1204
原创 RTC测试指令
设置系统时间:date -s “2024-08-29 09:28:30”将系统时间写入rtc: hwclock -w。读取rtc的时间:hwclock -r。查看系统时间:date。
2024-08-30 09:42:50
222
原创 i2c-tool工具
i2c-tool工具的使用方法 包括i2cdetect、i2cget、i2cset、i2cdump、i2ctransfer。
2024-08-30 09:41:55
2497
原创 Android性能测试工具:dumpsys
dumpsys 是一种在 Android 设备上运行的工具,可提供有关系统服务的信息。您可以使用 Android 调试桥 (ADB) 从命令行调用 dumpsys,也可以直接在串口中可调用,获取在连接的设备上运行的所有系统服务的诊断输出。此输出通常比您想要的更详细,因此您可以使用下文所述的命令行选项仅获取您感兴趣的系统服务的输出。显示当前所有stream type的音量状态、显示当前可用活跃的输入输出设备、显示当前音频流的输出输出策略。显示所有的activities的信息。显示按键,窗口和它们的关系。
2024-08-30 09:40:49
389
原创 [网络调试] 常用指令
cat /sys/bus/mmc/devices/sdio:0001/sdio:0001:1/device 查看wifi芯片型号。获取DHCP网络配置信息的命令行工具,动态获取IP地址、子网掩码、网关、DNS服务器等网络配置信息。
2024-08-30 09:32:46
905
原创 [驱动程序] 平台设备驱动程序示例
其中name 属性用于传统的驱动与设备匹配,也就是检查驱动和设备的 name 字段是不是相同。第 41~47 行,xxx_remove 函数,platform_driver 结构体中的 remove 成员变量,当关闭 platfor备驱动的时候此函数就会执行,以前在驱动卸载 exit 函数里面要做的事情就放到此函数中来。总体来说,platform 驱动还是传统的字符设备驱动、块设备驱动或网络设备驱动,只是套上了一张“platform”的皮,目的是为了使用总线、驱动和设备这个驱动模型来实现驱动的分离与分层。
2024-08-29 11:38:09
967
原创 平台设备驱动
device_driver 结构体(表示设备驱动)中有个名为of_match_table的成员变量,此成员变量保存着驱动的compatible匹配表,设备树中的每个设备节点的 compatible 属性会和of_match_table 表中的所有成员比较,查看是否有相同的条目,如果有的话就表示设备和此驱动匹配,设备和驱动匹配成功以后 probe 函数就会执行。第 1~4 行,of_device_id 表,也就是驱动的兼容表,是一个数组,每个数组元素为 of_device_id类型。
2024-08-29 11:29:49
1070
原创 [驱动程序] 内核GPIO相关函数
都推荐使用gpiod开头的接口,因为gpiod开头的接口传进去的是gpio_desc结构体,方便做资源管理,使用 gpiod 的好处是我们申请后不进行 free 也没有什么问题;传统的gpio接口传进去的是GPIO number,需要手动释放资源,不好做资源管理。函数返回一个 GPIO 描述符,或一个错误编码,可以使用 IS_ERR() 进行检查。#include //linux自带的。gpio,引脚的编号,依赖于芯片厂商提供的源代码,没有唯一的。gpio,引脚的编号。
2024-08-29 11:09:57
808
原创 [驱动程序] 内核内存分配
由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小可以比较大,关于申请内存的大小要根据/proc/meminfo文件中的“VmallocChunk”剩余多少空间可以申请。kzalloc() 函数与 kmalloc() 非常相似,参数及返回值是一样的,可以说是前者是后者的一个变种,因为 kzalloc() 实际上只是额外附加了 __GFP_ZERO 标志。kmalloc() 申请的内存虚拟地址是连续的,对应的物理地址上是连续的,即线性的。
2024-08-29 10:45:13
775
原创 [驱动程序] 内核延时函数
忙等待延时,对于长时间的忙等待意味这无谓的耗费着cpu的资源,就是独占CPU,常用于短延时。睡眠延时,会形成阻塞,导致进程调度(常用于长延时)。优点:优点不占用CPU资源。缺点:占用CPU资源。
2024-08-29 10:38:20
268
原创 [驱动程序] 用户空间和内核空间交互数据
失败返回:非0值,不能被拷贝的字节数,也就是有多少个字节没有被成功拷贝。from --> 内核空间数据的地址。失败返回:非0值,不能被复制的字节数。from --> 用户空间数据的地址。to --> 用户空间数据的地址。to --> 内核空间数据的地址。
2024-08-29 10:33:49
248
原创 [驱动程序] 申请物理内存区、映射和使用
分析原理图–>找到控制硬件的GPIO–>找GPIO的寄存器—>分析寄存器—>理解寄存器的控制顺序—>通过寄存器的地址来访问该寄存器裸机使用的是物理地址,所以直接使用CPU手册查到的地址可以编程。linux驱动使用的虚拟地址,不能直接使用物理地址。想办法,如果通过CPU手册查到的物理地址找到其对应虚拟地址?申请物理地址区作为一个资源----->将物理内存区做内存的动态映射,得到虚拟地址。资源—有限的,一旦一个物理内存区已经申请了,后面就不能再次申请。
2024-08-29 10:12:44
383
原创 字符设备驱动
dev_t dev;在linux内核中,使用cdev来描述一个字符设备,每个字符设备都有一个自己的cdev。设计字符设备首先定义一个cdev。每个设备文件(字符设备 or 块设备)都已一个设备号,相当于设备文件ID。设备号有主设备号和次设备号组成的。设备号是一个32bits的无符号整型值。
2024-08-29 09:52:56
650
原创 linux设备驱动的分类
数据交互的时候,是按照固定的顺序传输的;数据是实时传输的,是没有缓存的。应用程序和驱动程序之间进行数据读写的时候,数据是以“块”为单位,1block=1024KB。块设备是有缓存的,块设备是有文件系统的。绝大部分设备驱动是字符设备:LED、BEEP、按键、键盘、触摸屏、摄像头、液晶屏、声卡、IIC、SPI、…大容量的存储设备一般都是块设备:nand flash、eMMC、SD、U盘、硬盘、…标准IO函数:fopen()/fread()/fwrite()/fclose()网卡类的设备:有线网卡、无线网卡、…
2024-08-29 09:19:00
425
原创 Repo 使用指南
在Linux平台下进行Android系统项目开发时,需要git或repo管理来管理代码。Git和Repo的区别:Git:Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。Repo: Repo是谷歌用Python脚本写的调用git的一个脚本。主要是用来下载、管理Android项目的软件仓库(也就是说Repo是用来管理多个git库的)。
2024-08-29 00:41:22
1647
原创 修改上一次git提交本地记录
本地有两次及以上的commit状态,如果想要重新修改倒数第二次及以上的commit,可以参考以下方法。在回退之前当前是不能有修改的,建议先打补丁出来,使用该方法需要在clean状态。以下是重新修改倒数第二次的本地提交记录。
2024-08-29 00:33:56
399
原创 Git版本控制
Git是一款免费、开源、分布式版本控制系统。Git的绝大多数操作都只是需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。git一般只添加数据,你很难使用git从数据库中删除数据。git有三种状态:1、已提交 (committed)2、已修改 (modified)3、已暂存(staged)git项目有三个阶段:工作区、暂存区、Git目录工作区是对项目的某个版本独立提取出来的内容。这些内容放在磁盘上供你使用于修改。
2024-08-29 00:05:05
1143
原创 Android-SeLinux安全策略
DAC(Discretionary Access Control,翻译为自主访问控制)DAC的核心思想:进程理论上所拥有的权限与执行它的用户的权限相同,比如,以root用户启动Browser,那么Browser就有root用户的权限,在Linux系统上能干任何事情。MAC(Mandatory Access Control,翻译为强制访问控制)MAC的核心思想:即任何进程想在SELinux系统中干任何事情,都必须先在安全策略配置文件中赋予权限。凡是没有出现在安全策略配置文件中的权限,进程就没有该权限。
2024-04-20 18:57:00
1673
1
原创 Android 编译时:m、mm、mmm、mma、mmma的区别
要使用m、mm、mma、mmm、mmma 命令对Android代码进行模块编译,需要先执行如下命令初始化环境。
2022-09-01 15:32:19
3301
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅