- 博客(96)
- 收藏
- 关注
原创 bash中如何区分系统命令和自定义函数
type 显示命令的类型(系统命令、函数、别名等) 通用检查。declare -F 检查函数是否已定义 判断函数是否存在。declare -f 列出或显示函数的定义 检查函数定义。command -v 显示命令的路径或名称 简洁检查。compgen 列出所有命令、别名、函数等 批量检查。系统命令:输出命令的路径(例如 /bin/ls)。通过以上方法,可以轻松区分系统命令和自定义函数。which 查找系统命令的路径 仅检查系统命令。函数:输出函数名(例如 myfunc)。方法 功能 适用场景。
2025-03-21 11:42:50
412
原创 Android/AOSP源码编译错误:TEMPORARY_DISABLE_PATH_RESTRICTIONS
分析操作流程,在同一个编译环境中,连续编译不同版本的Android源码(Android 11和Android 12),由于不同版本源码编译时设置不同的环境变量,并且不同版本源码对环境变量的检查条件不兼容导致的。,在Android12编译时,不兼容这个变量的设置,并且编译脚本不会取消这个变量,导致编译报错。具体到遇到的这个问题,在Android11上编译是,配置脚本设置。编译环境多次编译过源码,工具链等都是正确配置,不存在问题。取消次环境变量设置,再次编译源码,可正常编译。
2025-03-13 14:11:23
196
原创 Ubuntu上用adb连接Android提示无权限(no permissions (missing udev rules? user is in the plugdev group))
需要配置udev rule,在/etc/udev/rules.d/下创建对应的rule文件。重新插拔设备连接到PC上的USB线即可。
2025-03-11 13:39:59
178
原创 sudo免密码
Ubuntu上执行需要root权限的命令需要使用sudo命令,默认每次都需要输入密码进行授权。可以通过配置sudoer把用户添加到白名单中,执行sudo命令是不需要输入密码验证。
2025-03-10 10:42:47
123
原创 随机过程和马尔科夫过程
随机过程是一族随机变量 {X(t),t∈T}{X(t),t∈T},其中 TT 是参数集(通常是时间或空间),X(t)X(t) 是在每个时刻或位置 tt 的随机变量。例如,股票价格随时间的变化、天气温度的变化、电话呼叫的到达时间等都可以用随机过程来描述。随机过程 {Xn,n=0,1,2,… }{Xn,n=0,1,2,…状态空间:S={s1,s2,… }S={s1,s2,…}(可以是有限或无限的)。转移概率。
2025-02-24 14:28:13
624
原创 vs code配置Android native开发的include path
编辑settings.json(Ctrl + ,或者直接打开如下配置文件,在vs code的界面上只能逐项添加)为了方便修改,可以添加自动以变量,定义android源码的根目录,如果切换源码目录,只需要修改这个变量即可。修改属性:C_Cpp.default.includePath,追加include path。
2024-12-24 14:28:54
428
原创 记录一个Android编译中遇到的(有点)奇怪的问题vendor_available
这几个xml是对应工程中hal接口描述文件(学名叫兼容矩阵compatibility matrix,这里不展开),根据.bp文件中的配置vendor是否可用,选择是否在vendor目录下放置此文件。把上述几个.xml文件删除,重新make就可以正常编译通过。此时单独编译工程,使用mm或者mmm命令,可以正常编译。Android源码已经完整编译过。
2024-09-13 11:12:56
636
原创 DDS笔记: hello world解析
获取DomainParticipantFactory -> 创建participant -> 注册sub-pub type -> 创建topic(顺序可延后) -> 创建publisher / subscriber -> 创建writer / reader -> write / read / WaitSet.wait。创建subscriber时传入listener参数,通过listener回调事件和数据(on_subscription_matched, on_data_available)。
2024-08-18 14:47:03
332
原创 Android.bp编译报错
确认可用类型,查找编译目录,找到以下几种平台类型的静态库。前面几种arm类型的都能对应上,x86平台的只编译出来linux_glibc_x86_64_static版本,这个是和当前PC编译环境对应的,其他3中x86类型缺失是由于当前环境下不具备编译条件。这个例子中发现缺少:image:vendor.30。可以通过libc++fs库对应的.bp文件进行确认。同时,提示当前可用版本类型(available variants),每行是一个类型。把“期望类型”和“已有类型”对比差异,逐个字段比较,看缺少哪项。
2024-07-23 17:37:44
1829
原创 Android Hal service compatibility matrix
编译后文件保存的位置:(/etc —> /system/etc)2)在Android.bp中增加对应的编译选项。
2024-04-07 13:31:47
788
原创 Linux socket: udp server and client demo
(2)收到client请求后,在server fd上调用accept获得client fd,client sockaddr_in对象。1)创建socket,指定协议版本(v4,v6)、协议类型(udp、tcp),获得server fd。(3)bind和connect入参相同,server fd, addr, addr_length。server端,不指定具体的client地址,设置为INADDR_ANY。1)创建socket,指定协议版本和协议类型,获得server fd。4)接收client连接请求。
2024-01-04 15:01:55
930
原创 c++ asio: udp server and client demo
2)receive_from可以获取到client的endpoint,也可以用这个对象给client发送数据(send_to)2)创建一个udp::endpoint对象,指定协议版本(v4,v6)和端口号,初始化socket对象。执行收发动作,socket.receive_from和socket.send_to。1)需要创建一个io_context对象,初始化socket对象。1)收发都需要一个asio::buffer缓存。创建udp::socket,用于收发数据。一、server 端。
2024-01-04 14:45:06
1018
原创 Bash script进阶笔记
3)必须提供‘下标’,下标可用数字(此时和数组类似),可以是字符串(单引号、双引号都可以)2)需要使用declare -A声明,不能像数组那样可省略declare -a。declare是bash内置命令,可为变量设置属性(值类型、访问类型等)。1)最外面是小括号(),内部元素间用空格分隔,下标用中括号[]指定。-A: associative array Map类型。-a: indexed array 数组。-x: export,导出环境变量。Map类型(关联数组)
2023-12-14 14:29:30
658
原创 C++知识点梳理:C++ templates
这3种参数是不同维度的,尤其是类型参数和template template参数,容易混淆,在实例化时需要区分模板参数和普通类型参数,如果定义为模板参数则只能提供模板名(不能用具体类型实例化,如vector,不是vector< int >)6)匿名参数,在模板参数列表中定义匿名参数,这些参数在模板定义中没有用到,仅用于静态分发(通过类型选择不同的模板),或者为了应用SFINAE规则(阻止生成不符合某些规则的模板)。只需要类名和后面的类型说明,和定义时不同,此时需要提供具体的类型。
2023-11-17 12:43:16
538
原创 C++知识点梳理:移动语意、右值
a)传入lvalue调用,过程中分配内存2次:v->x复制一次(第一次分配内存),x move to data_由于data_内存不够大(data_默认构造的,除非v为空)需要在移动构造函数内再次分配内存(第二次分配内存)。本质上,就是这个局部变量是多余的,通过传值在函数参数初始化时创建一个临时变量(省略掉多余的局部变量),函数参数的变量名是必须有的,只是能够选择分配内存(传值、赋值)或不分配内存(传引用、右值)。如果是类成员变量,已经初始化了?b)返回值,NRVO优化,不会复制。
2023-11-13 16:40:32
165
原创 C++知识点梳理:包装类型/词汇类型 vocabulary types
2)std::get< index >(v) 通过索引检索当前保存的值,如果对应索引没有保存值,抛出异常:std::bad_variant_access。3)std::get< type >(v) 通过类型检索当前保存的值,如果对应类型没有保存值,抛出异常:std::bad_variant_access。std::get_if< index >(&v) 通过索引检索当前保存的值,如果对应索引没有保存值,返回nullptr。注意:传入指针,返回指针。注意:传入指针,返回指针。
2023-11-10 14:34:23
165
原创 Linux pipe()系统调用示例
一个pipe是单向数据传输的,不用用于父子进程双向读写。创建2个pipe实现父子进程间的双线读写。Linux系统调用pipe函数,创建一个pipe,通过传入的fd数组返回pipe的读、写两端。其中fd[ 0 ]用于读,fd[ 1 ]用于写。
2023-11-08 17:56:12
266
原创 Rust笔记【3】
Deref 强制转换可以将&String 转换为&str,因为String 实现了Deref trait 因此可以返回&str。Deref 强制转换(deref coercions)将实现了Deref trait 的类型的引用转换为另一种类型的引用。• 当T: DerefMut<Target=U> 时从&mut T 到&mut U。• 当T: Deref<Target=U> 时从&mut T 到&U。• 当T: Deref<Target=U> 时从&T 到&U。2)移动大量数据,避免赋值。
2023-11-07 15:43:01
101
原创 Rust笔记【2】
(3)如果定义中没有使用到lifetime参数,可使用匿名lifetime:'_ ,如下面的read()方法。(2)输出lifetime可自动推导的情况:唯一输入lifetime和方法&self的lifetime。语法示例,lifetime在函数、struct的语境中作为泛型参数使用,无法单独使用。(1)struct中有引用类型,就需要声明lifetime参数。(1)泛型参数列表中,lifetime在typename之前。适配器是惰性的,需要调用消费适配器的方法,才会实际执行。函数中的lifetime。
2023-11-01 09:23:22
363
原创 Rust笔记【1】
注意:作用域结束不是以大括号结束,是以变量最后一次使用结束变量作用域(是没有显式标志)。1)为所有情况单独处理每个分支,例如enum类型。Rust中match匹配必须是穷尽的。字符串slice类型声明:&str。2)使用通配模式,用到匹配的值。字符串字面值是slice。
2023-10-24 14:49:44
387
原创 DBus笔记
2)track life-cycle,application exit/crash notification,当app退出时,message bus通知其他应用对应的app name失去owner。1)[Bus Name],可选,如果没有使用dbus daemon就不需要bus name,相当于点对点通信。4)特例,不使用dbus daemon,需要明确server app和client app,以及它们的地址。1)方法调用,前3种消息,调用和返回双向,一对一。2)广播消息,第4中,单向,一对多。
2023-09-15 13:40:22
356
原创 vlan笔记
1)标签型VLAN:Tagging VLAN,IEEE 802.1Q协议(dot one Q),对数据帧附加识别信息。TPID的值固定为0x8100,它标示网络帧承载的802.1Q类型,交换机通过它来确定数据帧内附加了基于IEEE 802.1Q的VLAN信息。每个数据帧头部都会被附加26字节的“ISL包头(ISL Header)”,并且在帧尾带上通过对包括ISL包头在内的整个数据帧进行计算后得到的4字节CRC值。1)静态VLAN(基于端口的VLAN):将交换机的各端口固定指派给VLAN。
2023-09-04 13:56:29
507
原创 C++模板:用递归实现阶乘的几种方法
主要是演示C++模块的递归语法和实现机制,以阶乘为例。下面分别用类模板(factorial1)、函数模板(factorial3、factorial4)和变量模板(factorial2)分别实现。这里的模板递归都是在。
2023-08-21 10:08:51
1027
原创 C语言读写文件函数:read/write,pread/pwrite,readv/writev,preadv/pwritev,preadv2/pwritev2
read/write/pread/pwrite函数比较直观,这里仅示例readv/writev函数用法。把程序中定义的buf通过writev函数输出到屏幕上。
2023-08-18 11:11:15
805
原创 OBD针脚定义参考
2)其中一种4/5/7/8也是上下对应的;另一种4-5,12-13,7/8和15/16交叉连。OBD定义的一种标准的参考,不同的车场有不同的定义,貌似没有统一。1)1/2/3/6几个针脚都是一样的,分别上下针脚对应。
2023-08-08 16:28:50
3846
原创 AUTOSAR笔记2:AP主要模块
CM(Communication Management)组件提供独立于网络和协议的应用间通信服通信协议CM是独立于具体通信协议的通信管理框架,当前支持部署到不同协议,包括:数据分发服务协议(简称DDS)、车载以太网协议(简称SOME/IP)。DDS协议主要用于内部通信高性能场景;SOME/IP协议主要用于与外部部件对接的通信场景,如与Classic AUTOSAR对接,其中,SOME/IP支持采用两种序列化方式进行。
2023-08-07 10:27:25
1894
1
原创 Android native开发:system/core/libutils
文章目录1. AndroidThreads.h2. Atomic.h3. BitSet.h4. ByteOrder.h5. CallStack.h6. Compat.h7. Condition.h8. Debug.h9. Endian.h10. Errors.h11. FastStrcmp.h12. FileMap.h13. Flattenable.h14. Functor.h15. JenkinsHash.h16. KeyedVector.h17. LightRefBase.h18. List.h19.
2023-06-28 11:07:55
996
原创 Android native开发:system/core/base
跨平台支持获取thread id,在Linux上调用gettid()或syscal(__NR_gettid)2)ScopedLockAssertion,为了Clang做线程安全分析的辅助类。还提供一些assertion宏。1)一些thread相关的__attribute__宏定义。临时保存errno,作用域结束后恢复。
2023-06-19 17:00:17
1181
原创 PC - Android - QNX 传输文件
开发中需要把一些文件从PC(Windows或者Linux)上传输到Android或者QNX上。下面这个脚本,可以在Linux上执行,把文件复制到QNX系统上,即 PC --> QNX。如果需要可以参照编写一个QNX–>PC传文件的脚本。
2023-06-15 17:45:45
1298
原创 不常用的 Linux/C 函数/系统接口整理
如果通过编译参数(-fno-builtin)关闭内置函数,此时为了编译通过的方法:#define strcpy(d, s) __builtin_strcpy ((d), (s))(1)没有C标准库对应方法的__builtin_函数,这类方法总是被inline展开,没有入口地址,只能用在函数中(不能用在表达式中,内联展开会导致编译错误)。(2)有对应C标准库方法的__builtin_函数,内置函数和C库函数有完全相同的原型、入口地址。strp指向的内容,需要用free()函数释放。
2023-06-12 17:58:47
762
原创 Android native开发:systeom/core/libcutils
封装了user id, app id, uid, cache_gid, ext gid, ext cache gid, shared gid, share app gid获取和转换函数。定义了很多AID_xxx的宏,build/tools/fs_config用来生成Android文件的。获取init管理的文件,path是init.rc中的文件路径,返回fd。对__builtin_popcount的封装,计算二进制中1的个数。atomic相关的一些函数,遗留代码,不推荐使用。自定义list及相关操作函数。
2023-06-12 17:46:24
1778
原创 Android studio导入Android源码(AOSP Android 14)
说明:这些设置也可以在Android studio:project structure - project settings - modules - dependencies中修改,速度比较慢,直接编辑.iml文件方便。1)增加excludeFolder列表,排除不需要的源码路径,这样可以加快导入和创建文件索引的速度。说明:也可以通过修改development/tools/idegen/excluded-paths文件,增加排除的路径。删除后,则可以直接跳转到源码文件。
2023-06-10 17:46:30
6965
4
数据结构知识梳理汇总文档
2023-01-09
全面的Android view相关知识汇总整理
2023-01-09
Android面试必备参考提纲(2022)
2023-01-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人