C++零基础到工程实战(一) -环境搭建与 C++ 程序的生成过程

一、环境:装对工作负载,建对项目 1.1 Visual Studio 2022 Community 本文使用 Visual Studio 2022 Community,课程代码以 C++14 为最低标准。新版编译器可以选择旧语言标准,但是旧版编译器未必支持新标准加入的语法和库功能。 安装 Visual Studio 时,需要在工作负载列表中勾选「使用 C++ 的桌面开发」。漏掉这一项,新建项目时就

Android-Framework(十三)-普通应用的安装过程

本文探讨的问题是:用户在文件管理器中点开一个 APK 后,系统怎样把它放进 /data/app、解析包信息,并把安装结果送回界面?从源码看,这条链横跨 PackageInstaller 应用进程、system_server 和 com.android.defcontainer 三个进程。 一、安装入口:点开 APK 后系统处理了什么 1.1 确认界面属于 PackageInstaller 文件管理

Android-Framework(十二)-AMS与PMS的启动过程

素材来源于“AMS 的启动过程分析”“PMS 的启动过程分析”“安装包的解析过程分析”三段视频。 一、system_server 应用进程里的 Application.onCreate 已经处于启动链后段。此时系统早已知道包名对应哪个 UID、入口 Activity 是谁、它声明了哪些 intent-filter。这些数据若到 startActivity 时才从 APK 临时读取,每次组件解析

Android-Framework(十一)-彻底理解Handler的通信过程

一、Handler 的循环为何不烧满 CPU Looper.loop 中确实存在一个没有退出次数限制的 for (;;)。但“循环一直存在”和“CPU 一直执行循环体”是两回事。只要当前没有可立即处理的消息,Java 层就会把等待时间交给 nativePollOnce,native 层最终进入 epoll_wait。线程此时处于阻塞等待状态,不会反复读取队列。 这条等待链可以总结为3点: 延迟

Android-Framework(十)-彻底理解驱动层的通信流程

素材来源:sanyinchen/corpus 仓库,资料整理自哔哩哔哩 Android Binder 源码教程。 一、一次 startActivity 包含两次 Binder 通信 旧版 Android Framework 中,Activity.startActivityForResult 会经 Instrumentation.execStartActivity 触发这类调用: 这一行发生

Android-Framework(九)-从Java层跟踪服务的查找过程

视频素材:[01.驱动层单向通信流程回顾] App 调用 startActivity 时,代码里那个看似普通的 getDefault ,到底怎样找到另一个进程里的 ActivityManagerService(下文简称 AMS)? 答案不是“Binder 帮我们找到了”这么简单。沿调用栈往下走,会看到一次查询如何穿过 Java、native 和驱动,再原路带回一个 handle。 而且这里其

Android-Framework(八)-从驱动层来分析服务的添加过程

视频素材:[Android Binder驱动-从驱动层来分析服务的添加过程] Android Binder驱动:从驱动层分析服务的添加过程 一、Media 服务注册流程 一个 Media 服务调用 addService 时,用户态只是把服务名和 Binder 对象写进 Parcel,再发起一次 ioctl。驱动随后要解决三个问题:谁有资格接收“添加服务”请求,接收线程睡在哪里,以及带着 Binde

Android-Framework(七)-Binder驱动源码分析

Android 里的跨进程通信有不少选择。管道适合字节流,Socket 通用而且能跨设备,共享内存适合大块数据,Binder 则承担了系统服务通信的主干。应用拿系统服务、AMS 调度组件、Media 服务接受调用,最后大多会经过 Binder。 主要链路:binderopen 给进程建档,bindermmap 准备接收事务的内存,binder_ioctl 负责收发命令和调度事务。 一、Binder