android

代码版本管理工具(git/gerrit/repo)

git

代码版本管理工具(git/gerrit/repo)

原文链接:https://ovea-y.cn/code_version_control_tools__git_gerrit_repo/ 一、版本控制工具的历史 1.1 版本控制雏形 在版本控制软件出现之前,就具备diff与patch工具来对源码进行比较和打补丁了,在CVS出来的一段时间里,Linus一直在使用diff与patch工具管理着Linux的代码。diff与patch也是源码版本控制中最基本的概念。 1.1.1 diff —— 用于比较两个文件或目录之间的差异 -u 表示使用 unified 格式 -r 表示比较目录 -N 表示将不存在的文件当作空文件处理,这样新添加的文件也会出现在patch文件中 diff -urN a.c b.c > c.patch 1.1.2 patch —— 用于应用差异修改 通过patch可以将原始文件变成目标文件,

By 夕元
Android Property模块

android

Android Property模块

原文链接:https://ovea-y.cn/android_property_module/ 一、导言 在Android系统中,属性模块具备记录和控制能力。它不仅记录着系统本身的硬件/软件信息、控制系统功能、在进程间传递信息,还可以调用系统预置功能。 本文将对Android Property机制进行深入解析。 二、属性分类 属性一共有两种大类型,一种是普通属性,一种是控制属性。 普通属性是我们最常见的属性,它们仅记录Key-Value信息,软件设计上可以通过这样的Key-Value值,实现进程间通信、功能控制、暴露内部信息等功能。 而控制属性则较为少见,它的功能预置在系统中,用于控制程序的运行状态,控制设备开关机,控制Selinux。 接下来,我们将对普通属性和控制属性分别进行介绍。 2.1 普通属性 2.1.1 常规属性 2.1.1.1 常规属性特点 * 常规属性可以设置多次,重启后丢失。

By 夕元
Init的工作职责

android

Init的工作职责

原文链接:https://ovea-y.cn/init_work_1/ 总览图 ueventd其实就是init,为了方便启动所以单独设置了一个链接 Init第二阶段初始化流程 PropertyInit 它的作用初始化属性,它在非常早期的阶段(此时没有执行init脚本指令,甚至没有初始化selinux)就会执行。 它会做下面这些操作: * 创建/dev/__properties__节点 * 解析序列化的属性(在文件{分区名}__property_contexts中),并且写入到/dev/properties/property_info * 解析Kernel Device Tree,设置到ro.boot.{}中 * 解析Kernel Command Line,设置到ro.boot.{}中 * 解析Boot Config,设置到ro.boot.{}中 * 将一些Kernel

By 夕元
F2FS介绍

android

F2FS介绍

原文链接:https://ovea-y.cn/f2fs_simple/ 一、背景介绍 一个对基于NAND并且具备FTL(闪存转换层)的闪存设备友好的文件系统,该文件系统依赖于FTL来处理写操作。F2FS对FTL的支持,在于一开始就将存储空间划分为若干个大小相同的segment,然后多个segment由section进行管理。F2FS期望section大小与FTL中垃圾收集单元大小相同。 需要注意的是,FTL一般处于具备SCSI/SATA/PCIe/NVMe接口的闪存中。 1.1 FTL的原理 FTL简单来说就是系统维护了一个逻辑Block地址(LBA,logical block addresses )和物理Block地址(PBA, physical block addresses)的对应关系。 这样就不需要操作系统额外针对闪存设备进行额外的优化了,优化由闪存本身内建的微型系统来完成(例如磨损均衡,废块回收等)。 举一个例子,FAT文件系统,它有很大的概率会在数据读写的过程中对同一逻辑地址的存储空间进行操作,如果没有优化操作,对应的

By 夕元
Fuse学习

fs

Fuse学习

原文链接:https://ovea-y.cn/fuse_simple/ 什么是Fuse? Fuse是一个用户空间文件系统的运行框架。它由一个内核模块(fuse.ko)、一个用户空间的库(libfuse.*)和一个挂载工具(fusemount)组成。 💡 ko是kernel object的缩写,和so库类似,都是为了模块化实现。内核把核心主干框架之外的功能拆解成模块,需要的时候就加载 ko 模块,不需要的时候卸载即可。这样带来的好处就是方便开发和使用,保持内核的核心代码极度精炼。 Linux的文件系统都是运行在内核态的,因此如果想实现一个新的文件系统,就需要让其运行在Linux Kernel中。 Fuse,即implementing filesystems in user space,在用户空间实现文件系统。 有了Fuse之后,开发者就可以在用户态开发自己的文件系统,相比于必须要运行在内核态,在用户态开发文件系统更好调试,并且不会导致Kernel崩溃,可以大大地缩短开发周期。 Fuse的文件系统类型 fuse 这是最常用的挂载Fu

By 夕元
使用Windows11 WSL2进行Android系统开发

android

使用Windows11 WSL2进行Android系统开发

原文链接:https://ovea-y.cn/using_windows_11_wsl2_for_android_system_development/ 背景介绍 由于Linux上缺少很多常用的软件,并且Linux加上图形界面时,有时会出现很多匪夷所思的BUG(包括但不限于压缩文件的默认打开方式变成了文本编辑器、界面卡死等情况),因此将工作流迁移到Windows上也不失为一种选择。 WSL 2相比WSL 1最大的缺点就是它运行在虚拟化层中,并且对Windows磁盘的读写性能极差!毕竟切换成使用网络实现方式将Windows的分区挂载到WSL 2了(还有一个问题是硬件和网络端口不再共享了)。但是优点是它是完整的linux系统,可以发挥Linux全部的功能(但是systemctl依旧不可用)。 如果要使用WSL 2进行日常工作,就必须避免使用NTFS,而是使用其他Linux上原生支持的文件系统。本篇文章的重点就是如何让WSL 2用上原生支持的文件系统,以及如何让USB设备接入WSL 2两大部分内容。 WSL2具备的优点: * 完整的Linux内核支持

By 夕元
lldb工具使用

android

lldb工具使用

原文链接:https://ovea-y.cn/lldb_tool_manul/ 背景介绍 有时会在native程序中遇到预期外的错误,此时可以通过加log的方式一步步定位,这样逐步缩小范围,但是需要重新编译,并且无法知道当前以及之后正在执行什么指令,因此需要学会使用lldb进行native调试。由于代码一般在编译时进行了优化,去除了符号,因此需要会一些汇编指令的作用。 简单说明 关于交叉编译 首先需要说明的是,llvm本身就是支持跨平台编译的编译器,不需要使用其他的编译器(虽然它们开箱即用,但是Android目前用的是llvm,不是gcc了)。下面说明一下llvm进行交叉编译的方法。 工具链 llvm进行交叉编译的关键就是工具链,在编译的时候通过-target指定具体使用的工具链。 构建可以在手机上运行的程序: clang++ --static -g -O0 -target aarch64-linux-gnu [源文件] 关于远程调试 由于lldb不能直接在AArch64架构上使用,所以需要借助中间工具lldb-server

By 夕元