自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(12)
  • 收藏
  • 关注

原创 C++20高级编程读书笔记

一种固定大小的数组,不会自动转换成指针,具有迭代器支持CTAD,可以这样定义。

2025-07-02 02:14:44 526

原创 Android12 U盘挂载流程学习(二)

此时,执行操作的进程会被阻塞,同时fuse daemon通过读取/dev/fuse将request从内核队列中取出,并且提交操作到底层文件系统中(例如 EXT4 或 F2FS)。mount到/dev/fuse的目录才会被转到FUSE daemon,例如上一节的/mnt/user/0/usb0。作为FUSE daemon和FUSE deiver互相通信的桥梁,FUSE daemon会从/dev/fuse把FUSE driver传递的消息读取到,也会通过它把消息发送给FUSE driver。

2025-06-30 01:08:08 1098

原创 Android12 U盘挂载流程学习(一)

这是开机流程的一个重要步骤,标志着user正式启动,而系统启动的第一个用户的id就是0,会走到这里。// /data/media/0/Android/data挂载到/mnt/user/0/emulated/0/Android/data。// /data/media/0/Android/obb挂载到/mnt/user/0/emulated/0/Android/obb。// 挂载/dev/fuse到/mnt/user/0/usb0,访问/mnt/user/0/usb0就会指向/dev/fuse。

2025-06-30 01:05:54 1488 3

原创 Android12 LMKD学习文档(二)

当前还有一个比较好的方法就是提高自己的oom_score_adj,不过这个对于三方应用来说不太好搞,可以参考oom_score_adj计算时的各种判断选择一种非正常的方法(例如显示个ui、起个服务等等)。// 这里就是在/proc/vmstat中读取的数据,workingset_refault已经没有了,workingset_refault_file值是0。// swap_free_low_percentage与ro.lmk.swap_free_low_percentage这个prop值有关。

2025-06-30 00:57:38 683

原创 Android12 LMKD学习文档(一)

/ 订阅统计信息事件通知·在Linux中内存是以页面为最小单位分配的,当物理内存和交换空间不够用时,OOM Killer就会按照一定的算法选择杀死符合条件的进程,Linux的每一个进程都有一个oom_score(位于/proc/{pid}/oom_score),这个值。Linux中每个进程都有一个oom_adj(位于/proc/{pid}/oom_adj),范围是[-17,+15],会影响oom_score的计算,我们可以通过调小这个值来降低进程被OOM Killer杀死的概率。

2025-06-30 00:56:00 916

原创 Android12 音频播放流程学习(车载)(二)

cblk是一个audio_track_cblk_t 类型的数据,用于管理AudioTrack与音频硬件之间的数据交换,作为共享内存区域的控制块,协调生产者和消费者之间的数据同步。AudioTrack的write里,调完obtainBuffer写入数据后会调用releaseBuffer,这里并不是释放内存,服务端还没把数据拿走,这里是保存写入指针的状态。回忆一下AudioStreamOut的stream是哪里来的,AudioStreamOut是在AudioFlinger的openOutput_l里创建的。

2025-06-30 00:47:36 1669

原创 Android12 音频播放流程学习(车载)(一)

可以理解mBuffer是一个缓行缓冲区,rear是写入的位置指针,front是读取的位置指针,每次写入都会从rear地址处写入,每次读取都会从front读取;在上面的启动流程中,AudioFlinger与HAL建立了联系,AudioPolicyService解析了audio_policy_configuration.xml文件,针对每个module都open了其对应的so库;它们的源码在frameworks/av/services/audioflinger中,生成的库名是libaudioflinger。

2025-06-30 00:47:03 1646

原创 Android12 浅浅探索Binder调用流程(二)

这里调用了copy_to_user,把前面发送端进程传递过来的事务binder_transaction_data实例对象tr拷贝到接收方的用户空间的binder_write_read.read_buffer中(在此之前把内核映射到数据地址指针转换为用户空间的指针赋值给tr.data.ptr.buffer)。当进程已经没有可以请求的线程,并且也没有已经ready的线程时,binder驱动会发一个BR_SPAWN_LOOPER命令,通知IPCThreadState创建一个新的线程。

2025-06-30 00:39:43 704

原创 Android12 浅浅探索Binder调用流程(一)

asInterface方法中会调用queryLocalInterface,查找Binder本地对象,如果找到,说明Client和Server都在同一个进程,这个参数直接就是本地对象,直接强制类型转换然后返回,如果找不到,说明是远程对象那么就需要创建Binder代理对象,让这个Binder代理对象实现对于远程对象的访问首先用Parcel把数据序列化,然后调用mRemote.transact方法,mRemote就是new Stub.Proxy(obj)传进来的,即BinderProxy对象。

2025-06-30 00:34:54 981

原创 Android12应用启动流程学习(二)

ViewManager是通过Activity的getWindowManager获取的mWindowManager,mWindowManager是调用的PhoneWindow的getWindowManager获取的,PhoneWindow的getWindowManager是由其父类Window实现的,获取的是Window内部的mWindowManager,这个mWindowManager是一个WindowManagerImpl对象。Zygote进程会收到创建新的应用程序的请求。这里会根据参数调用不同的方法。

2025-06-30 00:26:05 1566

原创 Android12应用启动流程学习(一)

Android系统中,每个窗口容器Activitystack都有一个焦点栈,用于管理当前处于焦点状态的Activity,当用户切换到其他应用程序或任务时,焦点栈会发生变化。resumeFocusedTasksTopActivities的作用是恢复焦点栈顶部的activity,即将当前处于焦点状态的Activity恢复到栈顶,使其成为用户界面中可见和可交互的状态。// WindowProcessController负责协调进程与窗口系统的交互,管理应用进程的窗口声明周期、资源分配等。

2025-06-30 00:25:12 929

原创 Handler Looper Message学习

Android消息机制:Handler、Looper与MessageQueue 摘要:Android采用事件驱动架构,Handler是其核心消息处理工具,配合Looper和MessageQueue实现线程间通信。主线程默认包含一个Looper,通过无限循环处理消息队列中的任务;子线程需手动创建Looper。Handler负责将Message/Runnable投递到关联线程的MessageQueue,并按时间排序执行。创建流程涉及Looper初始化、Native层MessageQueue构建及epoll事件监

2025-06-30 00:19:00 769

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除