- 博客(298)
- 资源 (6)
- 收藏
- 关注
原创 【Android】VehiclePropertyAccess引起CarService崩溃
对于车辆属性的操作,在Android11版本,调用CarService注册监听属性,如果违反了其权限规定,会导致CarService崩溃。编译时,会被转成VehiclPropConfig,记录到每个车辆属性中。某应用调用 CarPropertyManager的registerCallback接口,注册监听属性ID。VehiclePropertyAccess属性,用于定义车辆属性的访问权限。违反VehiclePropertyAccess权限,导致的CarService崩溃。android12已修复该问题。
2025-03-23 14:43:36
360
原创 LOCAL_PREBUILT_JNI_LIBS使用说明
使用my_prebuilt_jni_libs,对my_embedded_perbuilt_jni_libs赋值(找出@对应的lib),并将my_embedded_perbuilt_jni_libs赋值给embedded_prebuilt_jni_libs(见上图)使用embedded_prebuilt_jni_libs对PRIVATE_EMBEDED_JNI_LIBS赋值。使用LOCAL_PREBUILT_JNI_LIBS,可用于控制APK集成时,其相关so的集成方式。比如,用于将APK中的so,
2025-02-05 15:40:50
433
原创 【Linux】统计文本中每行指定位置出现的字符串的次数
某些项目,会把某个特定事件记录到Log中并且落盘(保持到硬盘)。可以写一个sh脚本,来解析某个文本指定的位置,出现指定字符串的次数。
2025-01-26 11:43:31
505
原创 【Qnx】Qnx常用工具
pidin命令,可以查看Qnx系统运行的进程信息,包括PID、TID、NAME、PRIO(优先级)、STATE、BLOCKED。Qnx的system log,类似于Android Log。可以使用use命令,来输出各命令的使用用法。
2025-01-12 18:20:51
432
原创 【Linux】RPMSG通讯协议介绍
RPMSG,全称Remote processor Messaging。是一种核间通讯协议。在Linux Kernel中,已经内置了RPMSG。Linux RPMSG基于共享内存,利用RPMSG可以高效的实现核间通信。比如Linux与FreeRTOS、Linux与Android,都可以使用RPMSG完成域间通信。Linux端 RPMSG架构图(图片摘自网络FreeRTOS端RPMSG架构图(图片摘自网络。
2025-01-05 16:03:42
937
原创 【车载】关于仪表车速小于实际车速
因为车载仪表显示的车速,并非实际的车速。对于车速,有其标准规定,《GB 15082-2008汽车用车速表》规定如下(如实际车速120KM/H,那么仪表显示的速度应在范围 120 ~ 125.2 之间。在仪表系统的开发过程中,不能直接使用车身信号上传的车速来显示。
2024-11-10 17:04:21
277
原创 【Android】tombstone.pb文件解析
Android系统新增使用 proto buf格式保存的墓碑文件,本篇介绍如何解析tombstone.pb格式的文件。
2024-10-26 15:35:26
491
原创 【Android】JNI报错 non-zero capacity for nullptr pointer分析
Android程序报错。Abort message: 'JNI DETECTED ERROR IN APPLICATION: non-zero capacity for nullptr pointer: 1
2024-10-20 15:33:43
438
原创 【Android】CarWatchDog I/O监控服务
Car WatchDog中的IO Monitor,会监监控所有应用或服务的磁盘I/O用量。后续通过复现,抓取IO相应日志,发现出现问题时该应用,在一天内的写入量超过3GB,这个值已经超过系统的阈值配置。通过日志分析,发现应用被系统的 Car WatchDog(喂狗服务)Disable掉了。Car WatchDog中的IO Monitor,会统计一天内的I/O使用情况。关于Android源码部分的实现,可以感兴趣的可以阅读如下源文件。该日志说明,这款应用因为I/O使用超过阈值,被系统Kill。
2024-10-05 14:40:54
884
1
原创 【Qnx】使用ClockCycles完成计时功能
定时器是很多需求场景下,会采用的功能实现。比如5秒内,进行计数。如果次数达到100次,执行某操作。如果超过5秒, 计数器清零。某条件触发后,3秒内,忽略从MCU接受的信号。3秒后,使用该信息最新值,进行HMI显示。状态机超时后的复归等等
2024-09-17 13:54:47
725
原创 【Android】SurfaceFlinger Dumpsys信息分析
dumpsys Surfaceflinger用来输出SurfaceFlinger服务的状态信息,利用这些信息可以分析Android 画面层次、Display配置等等信息。
2024-09-08 14:50:37
2730
原创 【车载】仪表功能安全的例子
仪表的部分功能,关系着车辆使用者的人身、财务安全。进而言之,现在在车上普及的功能安全、信息安全,这些安全的目标其实都是用来来保证车和人的安全。
2024-08-18 20:43:11
537
原创 【座舱域控器】座舱域的通信方案
座舱域控器作为整车的几大域控器之一,提供驾驶娱乐的功能。比如中控、副驾、仪表、HUD等。就座舱来说,座舱域控制器以及MCU,加上一系列的硬件外设。以及再此硬件之上的软件系统,构成了整个座舱系统。同时,通过车载网络线束与其他域相连(比如车身域、动力域等等),实现域间的互联控制。
2024-07-20 16:00:39
1203
原创 【Qnx】Qnx coredump解析
Qnx官网说明链接:https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.utilities/topic/g/gdb.html。这些信息,对了解程序崩溃的状态有些帮忙,但是对具体的问题解析,还是需要利用gdb工具。实际上,就是把coredump从Qnx系统中copy出来,然后放到本地有Qnx开发环境,以及相关二进制+库的PC上。解析coredump文件,可以帮忙加快分析程序崩溃的原因,比如了解崩溃的堆栈。
2024-06-14 22:00:08
1795
原创 【Qnx 】Qnx IPC通信PPS
Qnx自带PPS服务,PPS全称Persistent Publish/Subscribe Service,就是常见的P/S通信模式。Qnx PPS的通信模式是异步的,Publisher和Subscriber也无需关心对方是否存在。利用Qnx提供的PPS服务,Publisher可以通知多个Subscriber进行某种动作。Qnx 的PPS,是利用文件的方式实现的。所以使用起来,跟文件的读写差不多。该图是QNX官网的PPS示例场景。
2024-05-26 16:26:08
1474
原创 【QNX】Qnx IPC通信 Message-passing
QNX提供了多种IPC(Interprocess Communication )通信方式,包括Message-passing、Plus(脉冲)、Event、Signal、共享内存、Pipe,当然还有socket。Message-passing是Qnx IPC的主要形式。Message-passing提供了主从直接同步的双向消息传输,类似于Android 同步Binder。客户端向服务端请求(Request),服务端向客户端(Reply)。
2024-05-26 16:19:53
1380
原创 QNX SLM介绍
SLM是Qnx中用来加载Application的组件,它可以监控Application行为(比如异常退出时重新Application拉起)、控制Application间的启动时序。这个时候io-pkt对应的/sbin/io-pkt-v6-hc就执行了。通过slm启动Application,Application配置文件是slm-config-linduo.xml。SLM的配置文件,是xml的格式。关于SLM支持的全部命令的解释,可以参考QNX官网。关于SLM配置文件的具体写法,可以参考QNX官网。
2024-05-13 22:09:59
1361
原创 【Android】Android应用性能优化总结
最近大半年的时间里,大部分投在了某国内新能源汽车的某款AndroidApp开发上。由于该App是该款车上,常用+重点应用。所以车厂对应用性能的要求比较高。应用冷启动达到***ms。应用热(温)启动达到***ms应用内画面切换响应达到**ms应用内动效/动画/车模等交互时,画面不能有延迟感等等。应用不能有内存泄露,内存稳定在**MB诸如上面的内容,还有一些,就不详细列出来了。因为之前没有直接做过AndroidApp开发,之前大部分时间在做Framework/System开发。
2024-05-05 20:48:55
1172
1
原创 【通信中间件】Fdbus HelloWorld实例
Fdbus 全称(高速分布式总线),提供IPC+RPC功能。LinuxQNXAnroidOSWindowFdbus本质是Socket,IPC基于,RPC基于TCP。使用Google Protobuf进行序列化和反序列化。利用它,可以实现同域间的IPC通信,比如应用和OS间。也可以实现跨域、跨设备间通信,比如不同设备间数据传输,比如host/gust间的数据传输。Fdbus的一些特点支持多种通信模式,比如点对点、注册/发布、广播等等。支持服务动态发现。
2024-05-02 16:46:23
3859
8
原创 【Android12】Bugreport实现原理
Android Bugreport是一个用于记录和收集 Android设备上系统信息、日志和调试信息的工具。系统发生某些问题时,可以通过bugreport把系统当前时刻点(运行BugRepot的时刻)的系统相关的状态和信息都抓到一个zip中。通过bugreport可以帮忙开发人员分析和解决问题。Bugreport其实就是一系列的信息的汇总,包括日志、内存状态、进程信息、崩溃信息、服务状态等等。用一个大而近乎全的现场,来帮忙更好的分析问题。
2024-04-22 22:18:00
2912
2
原创 【Android】App通信基础架构相关类源码解析
应用通信基础架构相关类源码解析这里主要对Android App开发时,常用到的一些通信基础类进行一下源码的简单分析,包括:Handler、looper、runnable、Messagequeue、Thread。
2024-04-05 18:02:58
816
原创 【C++】std::set_new_handler使用场景
C++的STL提供了**std::set_new_handler**,new操作分配内存失败时,会先调用这个Handler。默认的new_handler行为是,抛出std::bad_alloc异常。
2024-03-31 14:38:38
1023
原创 【C++】智能指针shared_ptrs对于内存管理的陷阱
std::shared_ptr 是一种通过指针保持对象共享所有权的智能指针。内存管理是C++一个永远的话题,C++加入了std::shared_ptr帮助开发者更灵活的管理内存。但shared_ptrs对于内存管理,并非万能的。某些情况下的错误使用,会导致程序因为内存异常而崩溃。在gcc13上,支持给shared_ptrs设置为数组类型。因为std::shared_ptr销毁时,会自动释放指向的内容。那么如果用智能指针管理动态分配的数组,就会导致程序异常问题。
2024-03-24 20:18:20
582
原创 【Android12】Android性能调优工具SystemServerTiming日志
SystemServerTiming是Android原生系统中一个日志标签,也就是tag为SystemServerTiming的日志,这类日志信息会输出到Logd和Trace系统中。可以通过Android logcat 或者 抓取Systrace的方式取得。
2024-03-03 19:03:00
1126
原创 【Android12】Monkey压力测试源码执行流程分析
Monkey是Android提供的用于应用程序自动化测试、压力测试的测试工具。通过Monkey,可以模拟用户的Touch(单指、多指、手势)、按键(key)事件等,检测应用程序发生的ANR、Crash事件,并收集相关Debug信息等。
2024-02-25 18:27:45
1187
原创 【Java】Java类动态替换Class
基于上面的几个方法,可以实现动态替换Class对象。可以在代码中,利用上面的方式,将FunctionA动态替换为FunctionB。Java提供的ClassLoader可用于动态加载的Java类,可以通过多种形式获取ClassLoader。通过这个方法,可以获取类中所有声明的构造函数。要创建类对象的话,需要知道Class的构造函数,以及构造函数的各个参数。Method类提供的newInstance,可以用于创建并返回指定类的实例。通过Java的Class对象,可以实现动态替换Class。
2024-01-27 19:13:38
771
原创 【Android12】Android Framework系列---Adb和PMS安装apk源码流程
通过adb install安装apk,大概流程是 adb(client)端通过socke命令给adbd(service),然后adbd通过ServiceManager以Binder方式将命令发送给PackageManagerService。PackageManagerService解析命令,复制APK及相关资源到指定路径,并更新系统中APK相关配置信息。
2024-01-21 17:51:16
2561
原创 【Android12】Android Framework系列---tombstone墓碑生成机制
墓碑初始化及生成流程中,可以通过属性控制是否注册墓碑、是否生成墓碑,以及墓碑文件的数量等功能。同时,也可以根据业务需求,在墓碑中加入自定义内容,比如给墓碑文件的名字追加特殊的时间戳、追加一些自定义日志到墓碑中等等。
2023-12-30 21:44:02
3706
2
原创 【Android12】WindowManagerService架构分析
WindowManagerService(以下简称WMS) 是Android的核心服务。WMS管理所有应用程序窗口(Window)的Create、Display、Update、Destory。因为Android系统中只有一个WMS(运行在SystemServer进程),可以称其为全局的WMS。其主要的任务有两个:
2023-12-16 19:21:37
2198
1
原创 【Android12】Android Framework系列--AMS启动Activity分析
通过ActivityManagerService(AMS)提供的方法,可以启动指定的Activity。比如Launcher中点击应用图标后,调用AMS的startActivity函数启动应用。AMS提供的服务通过IActivityManager.aidl文件定义。
2023-12-10 18:18:54
1528
原创 【Android】Android Framework系列--Launcher3桌面图标加载流程
Android Launcher3(简称Launcher)启动后会加载桌面。基于Android12代码,分析一下桌面加载的流程。Launcher被Android AMS拉起后,进入自己的生命流程。Launcher.java 中的onCreate函数被调用,准备开始加载桌面。
2023-12-02 21:37:18
2639
原创 【Gstreamer】自定义Plugin及调用Plugin
Gstreamer支持开发者自己创建Plugin,创建后的Plugin可以通过工具查看,并在代码中调用自定义的plugin。Gstreamer 官网中给出了Plugin创建教程,但实际上如果按照教程一步步走,最后会因编译失败的问题无法编译出Plugin的lib库(至少目前在Ubuntu20.04是这样)自定义Gstreamer Plugin通过工具(gst-inspect-1.0)查看自定义Plugin信息调用自定义的Plugin系统:UbuntuGstream版本:1.0。
2023-12-02 18:49:31
2906
2
原创 【Yocto】yocto编译系统Image优化笔记
使用yocto编译出来的Image文件(比如ext4格式)有时候根据业务需求,是要进行剪裁以缩小Image的Size。比如系统有OTA需求,系统预留的OTA分析大小是500M。但是Image(ext4格式)是1G大小。即使使用压缩文件,也未达到500M。这种情况下,可能就需要进行剪裁了。
2023-11-26 17:30:06
2346
2
原创 【Android】Android Framework系列--Launcher3各启动场景源码分析
Launcher3的启动场景主要包括:开机后启动:开机时,android ams服务拉起Launcher按键启动:比如短压home键,android wms中的PhoneWindowManager拉起Launcher异常崩溃后启动:Launcher异常崩溃后,android ams再次拉起Launcher
2023-11-26 13:54:39
2306
原创 【Android】Android Framework系列--CarUsbHandler源码分析
CarUsbHandler是Android Car提供的服务之一,其用车载USB连接的场景。车载USB有其特殊应用场景,比如AndroidAuto、CarLife等。而Android的做法是在其原有的USB服务上,扩展了专门针对CarUSB的Service。
2023-11-19 14:19:58
1146
原创 【Git】Merge/Rebase/Cherriy-Pick的区别
Git merge、Git Rebase、Git Cherry-pick是Git 常用的三个命令,可以用于分支合并、纳入提交等。那么它们三个的区别以及共同点是什么?了解这些可以帮我们更好理解Git的工作原理,进而学习它的一些设计思想。
2023-11-11 18:43:09
599
原创 【Android】Android Framework系列---CarPower深度睡眠STR
Android进入Deep Sleep后,关闭屏幕、关闭CPU的电源,保持RAM的电源(激活状态)。深度睡眠会进行Suspend-to-RAM挂起到内存(做车载的经常会听到的STR)。当然深度睡眠,还一种是挂起到硬盘(Suspend-to-Disk),不过目前主要用的是STR。所以STR是深度睡眠时的状态,但STR不等于深度睡眠。
2023-11-05 13:18:33
3251
原创 【Android】Android Framework系列---CarPower电源管理
Vehicle HAL的电源状态一般来讲是来自于MCU的(can通信 或者以太网通信,具体形式由Vehicle HAL和相关供应商决定)。智能座舱通常包括中控系统、仪表系统、IVI系统 、后排娱乐、HUD、车联网等。由于汽车自身的特殊供电环境(相比手机方便的充电环境,汽车的蓄电池如果没有电是需要专业人士操作的),其电源状态会比较复杂,既要满足车内的座舱系统启动足够快,又要保证汽车蓄电池的可考性,所以出了开机(on)、关机(off)外,会多出来一些电源状态(Suspend、STR、SLEEP等等)
2023-10-29 19:24:51
1550
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人