2026/5/24 12:53:26
网站建设
项目流程
莱芜关于网站建设的公司,公司注册地址与经营地址不一致有什么问题,网站模板购买,盗版做的最好的网站说起 Android#xff0c;很多人第一反应是#xff1a;
Activity、Fragment、ServiceRecyclerView、Handler、Bitmap各种 UI、各种库
但这都还是“楼上的东西”。
要真想搞懂 Android 为啥能跑、App 为啥能起来、进程为什么不会互相乱搞、Java/Kotlin 代码到底怎么跑在手机 CP…说起 Android很多人第一反应是Activity、Fragment、ServiceRecyclerView、Handler、Bitmap各种 UI、各种库但这都还是“楼上的东西”。要真想搞懂 Android 为啥能跑、App 为啥能起来、进程为什么不会互相乱搞、Java/Kotlin 代码到底怎么跑在手机 CPU 上就绕不开一个问题Android 操作系统的底层支持组件到底有哪几类它们是怎么配合起来撑起这整套系统的本篇就试图用大白话把这套“底层班子”给你从整体到局部拆开讲清楚主要包括Android 的整体分层结构从 Linux 到 Java/Kotlin 应用支撑一切的 Linux 内核级组件进程、线程、内存、驱动、Binder、SELinux…C/C 层的系统库和运行时bionic、libc、图形/多媒体/数据库等Runtime 层ART 虚拟机、垃圾回收、JIT/AOTFramework 层的关键服务与系统进程system_server、Zygote、AMS、WMS 等Binder IPC 机制作为“胶水”的角色以及这些底层东西对我们日常开发有什么影响不搞玄学、不堆术语尽量用易懂的类比把这套复杂系统讲得人话一点。一、先从大局看Android 这栋楼是怎么分层的先给你一个脑补图文字版方便后面定位从下往上看Android 基本可以拆成四五层Linux 内核层Linux Kernel真正跟硬件打交道的那层CPU、内存、进程、文件系统、驱动、网络等再加上 Android 自己的一些增强Binder、wakelock、电源管理、SELinux 等系统库 原生层Libraries Native各种 C/C 库bionic libc、OpenGL ES、Media、SQLite、WebKit、SSL…还有一些 Native 守护进程SurfaceFlinger、MediaServer、keystore 等运行时层Android RuntimeART专门跑 Java/Kotlin/字节码的虚拟机环境包括核心类库java.、android.和垃圾回收、JIT/AOT 等框架层Framework对 App 暴露的各种 Java APIActivityManager、PackageManager、WindowManager 等再加一堆系统服务主要集中在 system_server 进程里应用层Applications你写的 App系统自带的拨号、短信、设置等大多数是 Java/Kotlin XML 少量 Native可以想象成一栋大楼地下室Linux 内核打地基、接电接水CPU、内存、硬件。一层系统库、Native 服务准备各种工具、设备、管道。二层ART 虚拟机给 Java/Kotlin 搭舞台。三层Framework 服务搭各种“系统级服务柜台”和 API。四层App小店铺、小摊位使用楼下的供水供电做生意。“底层支持组件”本质就是前面这几层构成的整套设施。下面我们就从最底层一路往上讲。二、最底层Linux 内核——Android 的“水电煤 物业”2.1 为什么 Android 要用 Linux 内核很多人会问Android 为什么不用自己写内核而要基于 Linux理由很现实成熟稳定Linux 已经在服务器、桌面、嵌入式上跑了几十年各种调度、文件系统、网络栈都很成熟。开源Android 想玩大规模生态当然要选个开源的底座方便各家手机厂魔改。社区驱动力Linux 内核不断优化Android 跟着坐顺风车。驱动生态很多芯片厂、硬件厂的驱动本来就围绕 Linux 做。所以 Android 干脆把 Linux 当底层地基在上面搭自己的一栋“高层公寓”。不过Android 并不是直接拿 Linux 原样照搬它做了很多定制增强Binder IPCwakelock 和电源管理机制ashmem 共享内存安全相关的 SELinux 策略集成一些特定硬件如手机电源、传感器等对应的驱动和接口2.2 Linux 内核提供了哪些关键能力我们说“底层支持”内核主要提供几块进程与线程管理fork/exec 建进程调度哪个进程/线程先跑、谁抢 CPU线程其实也是“轻量进程”内存管理虚拟内存、物理内存映射堆栈分配内存页置换、OOM Kill内存不够了杀进程Android 基于此再做 LMKLow Memory Killer等扩展文件系统与存储/system、/data、/sdcard 等挂载文件读写权限日志系统logcat 底层其实有内核日志支持设备驱动Drivers显卡、触摸屏、音频、摄像头、传感器、电池、WIFI/基带等内核把这些硬件抽象成驱动上一层通过文件或 ioctl 等方式访问网络栈TCP/IP 协议栈、路由、防火墙Socket 通信、VPN、WiFi 热点等核心能力安全机制权限用户/用户组UID/GID能力控制capabilitiesSELinux基于标签的访问控制更细粒度控制“谁能碰谁”对 Android 而言这些是“不动就不感知动就离不开”的基础设施。2.3 Android 特有的内核扩展Binder / wakelock / ashmem / SELinux几样非常“Android 味儿”的内核组件2.3.1 Binder系统的超级“对讲机”Binder 是 Android 独家的进程间通信IPC机制。你可以把不同进程想象成不同房间App A 是 101 房间App B 是 102 房间system_server 是物管办公室平常你在 Activity 中调的各种系统服务比如获取位置LocationManager打开摄像头CameraService获取剪贴板、包管理、通知等其实很多都不是同一进程内调用而是你给“物管办公室”打了个电话对方帮你干然后给你回话。这个“打电话”的底层机制就是 Binder它是一个内核驱动/dev/binder上层通过 Binder 驱动把方法调用封装成“消息”投递给目标进程里的“Service”Service 执行完再把结果通过 Binder 回给你。以后你看到AIDLAndroid Interface Definition LanguageBinderProxy、IBinder系统服务之间互相调用背后都是 Binder 在跑。2.3.2 wakelock别让手机“自己睡死”内核负责电源管理CPU 什么时候降频、休眠屏幕什么时候熄灭。但网络、音乐、导航这些场景又要求屏幕可以灭CPU 不能睡死或者下载没完成前不要休眠。为此 Android 引入了 wakelock系统或 app 可以申请一个 wakelock说“我还在干活呢先别睡”当没有任何 wakelock 时系统才会大胆地让 CPU 休眠、省电。底层实现也是内核里的一套机制Framework 暴露 PowerManager 给我们用。2.3.3 ashmem匿名共享内存Android 为了在不同进程之间传大块数据比如 Bitmap、媒体缓冲又不想到处复制于是基于内核搞了个 ashmemApp 和系统进程可以共享一块内存区域通过映射减少复制提高性能很多看似“轻松传大对象”的操作背后都可能在用 ashmem。2.3.4 SELinux严防死守的门禁系统SELinux 是 Linux 的安全扩展Android 把它用得很狠每个进程、文件、对象都有一个安全上下文标签如 u:r:system_server:s0每次访问都要过策略检查这个 label 能不能访问那个 label好处即使有人拿到了 root 或者利用了某个进程漏洞SELinux 策略也可能限制它能干的坏事范围。从 Android 5.0 以后SELinux 强制启用enforcing是底层安全的重要一环。三、系统库和 Native 组件C/C 打头阵从内核往上走就到了“系统库 Native 服务”这层。它们主要负责把内核提供的“粗糙接口”打磨成更易用、性能更好的库函数和服务。3.1 bionic libcAndroid 自家的 C 标准库在普通 Linux 上我们常见的 C 标准库是 glibc。Android 不用它用的是自己写的 bionic。为什么更轻量面向移动设备内存资源有限。许可问题bionic 使用 BSD/MIT 风格方便闭源商业化。可裁剪可以针对不同设备需求进行删减。bionic 提供标准 C 函数malloc/free、printf、strcpy 等POSIX API线程、文件操作、Socket 等对 Linux 系统调用做封装所有 Native 层的程序包括 ART、system_server 的部分 C 模块都要依靠 bionic。3.2 常见系统库图形、多媒体、数据库、安全Android 自带了一堆功能库通常在 /system/lib 或 /system/lib64 下图形相关OpenGL ES给 2D/3D 渲染用Skia2D 绘图库Canvas、View 的底层SurfaceFlinger负责把各个 Window/Surface 合成到屏幕上严格说是一个 Native 服务进程多媒体libmedia / MediaPlayerService音视频播放Stagefright旧、MediaCodec/MediaExtractor 等编解码、封装解析AudioFlinger / AudioPolicy音频混音、路由数据库SQLite轻量级关系型数据库Android 的数据库 API 底层就是它网络和安全OpenSSL / BoringSSLHTTPS、加密libcrypto、libssl各种加密算法、证书验证curl/http 库或基于它们的封装这些 C/C 库是所有上层的“高性能工具”Java 层的 API比如 MediaPlayer、SQLiteDatabase只是对它们再包一层外壳。3.3 一些关键 Native 服务进程除了库还有一些跑在 Native 层的“常驻服务”进程例如SurfaceFlinger图形合成服务把每个 App 绘制的 Surface/Buffer 合成最终的屏幕画面是显示系统的核心一环MediaServer或其他多媒体守护进程处理音视频编解码、录制、播放等不让每个 App 直接拿硬件集中管理keystore管理密钥提供安全存储配合硬件安全模块TEE/SE 等这些服务通过 Binder 暴露接口给 framework 和 App。四、Android RuntimeARTJava/Kotlin 代码的“执行引擎”上面说的是 C/C 世界那我们的 Java/Kotlin 是在哪里跑的呢答案就是ARTAndroid Runtime。4.1 ART 是干嘛的简单说ART 是 Android 上跑 Java 虚拟机字节码的一套运行时环境是以前 Dalvik 的进化版。主要职责加载 .dex / .oat / .odex 等字节码文件提供 Java 核心类库java.android.环境负责执行字节码解释、JIT、AOT 编译管理堆内存、GC你写的valshellolist.add(s)编译打包后变成 dexDalvik ExecutableART 负责把这些指令翻译成 CPU 能执行的机器码。4.2 Dalvik vs ART从解释器到“先编译后执行”早期 Android 用的是 Dalvik偏解释执行 一点 JIT性能有限安装时不用做太多编译工作后来引入 ART支持 AOTAhead-Of-Time编译安装时就把一部分字节码编译为本地机器码后期又加入 JIT Profile 引导编译根据实际使用情况决定哪些方法要编译这样冷启动时不需要每次都从解释器跑起热路径能编译成高效机器码性能比纯解释要好不少4.3 ART 的堆和 GC为 App 管内存的“垃圾清理工”ART 负责管理 Java/Kotlin 对象的堆内存new 出来的每个对象都放在 ART 的托管堆上定期通过 GC垃圾回收清理不再使用的对象GC 机制多年来也不断进化从 Mark-Sweep、Mark-Compact 到并行、增量 GC目标是在尽量减少“卡顿”的情况下回收内存这和普通 JVM 很像但针对移动设备内存少、响应敏感做了很多优化手段。对我们普通开发者来说虽然不用手动 free 内存但要理解频繁创建短生命周期大对象、Bitmap、String会给 GC 增加压力GC 攒多了UI 就会卡这些都和 ART 内部的 GC 策略息息相关属于“半底层”的影响。五、Framework 层system_server 各种系统服务再往上一层就是我们最常打交道的 Java Framework。但很多人不知道它背后其实是一个叫system_server的大进程。5.1 system_serverAndroid 的“中央管家”system_server 里跑着一大票系统服务这些服务负责启动 App、管理 Activity 栈ActivityManagerService管理窗口和显示层级WindowManagerService电源管理、电池策略PowerManagerService包管理、权限控制PackageManagerService通知栏、状态栏NotificationManagerService 等位置、传感器、音频、输入法…… 统统都是各种 XXXService每个服务通常用 Java 写逻辑通过 JNI 调到 Native 层再通过 Binder 与其他进程通信我们日常用ActivityManageram(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);拿到的其实是这些服务的一个 Proxy代理真正干活的是 system_server 进程里的那个 Service 对象。5.2 Zygote所有 App 的“共同祖先”整个 Android 系统里还有一个非常关键的进程Zygote。启动时Zygote 会提前加载常用类、资源、初始化虚拟机等。当新 App 要启动时系统不是从零创建一个新进程而是让 Zygote fork 自己出一个“儿子”儿子再加载目标 App 的代码跑 mainLooper。这种套路的好处省时间不用每个 App 从头初始化 ART 和一堆类库。省内存父进程Zygote与子进程可以共享不少只读内存页面COW 机制例如系统类库等。你可以把 Zygote 想象成预先生好一个“模子”每个 App 进程都是在这个模子上快速克隆出来再稍微个性化一下。六、Binder 作为“系统胶水”四处串联的通信大动脉在讲完 Linux 内核、Native 库、ART、Framework 后你会发现一个问题这么多进程、这么多服务它们怎么沟通App 怎么远程调用 system_server 的方法system_server 又怎么控制 MediaServer 或 SurfaceFlinger核心答案就是Binder IPC。6.1 Binder 的基本思路远程调用像本地调用想象一下你在 App 进程里写LocationManagerlm(LocationManager)getSystemService(LOCATION_SERVICE);Locationloclm.getLastKnownLocation(...);看起来只是普通方法调用但实际上lm 是一个 Binder ProxygetLastKnownLocation() 内部会把参数打包成 Parcel通过 Binder 驱动发给 system_server 里的 LocationManagerService后者处理后再把结果写入 Parcel 发回Proxy 把结果解包成 Location 返回给你整个过程像打电话一样但语法上像本地方法调用。Binder 的设计目标就是让跨进程调用尽量像本地调用同时保证安全、稳定、高效。6.2 AIDL自动生成 Binder 桥接代码Android 提供 AIDLAndroid Interface Definition Language你写一个.aidl文件定义接口方法系统帮你生成 Stub 和 Proxy 类你在 Service 端实现 Stub在客户端拿 Proxy 调用比如interface IRemoteService { int add(int a, int b); }底层就是在 Binder 上编/解码这些参数搞跨进程 RPC。系统的很多 Service 接口内部就是用 AIDL 之类的机制实现的。6.3 安全与性能为什么不是用普通 Socket你可能会问为啥不用 Socket 或者普通管道只要能通信不就好了Binder 的好处安全系统级别知道“谁在给谁发消息”UID/PID 信息直接可见方便做权限和身份检查。性能采用共享内存机制减少数据复制特别针对移动场景优化减少一次调用的开销。统一全系统框架围绕 Binder 设计系统服务全都用它。七、这些底层支持组件对我们普通开发有什么影响讲了这么多底层有人可能会想我平时写 App基本没碰过这些东西啊知道这些有啥用其实影响非常多只是你习惯了感觉不到App 进程生命周期由 AMS 在 system_server 控制Android 内核的 LMK/内存管理也会参与“谁该被杀”。多进程与 Remote Service你一旦用到 remote Service本质上就是在玩 Binder IPC。大数据传输、多次调用时要注意性能。性能调优冷启动速度与 Zygote 预加载、ART AOT/JIT 有关。滑动卡顿GC、Binder 延迟、主线程阻塞都有可能是幕后黑手。安全与权限SELinux、权限检查、UID/GID 隔离决定你能不能访问某些系统能力。NDK / Native 开发使用 C/C 时直接对接到 bionic、系统库、Native 服务接口。不理解底层很容易搞出崩溃和内存泄漏。系统定制 / ROM / 深度优化OEM 厂、ROM 制造者天天和这些底层组件打交道。你若想走系统开发方向这些就是“必须争取搞明白”的内容。总体来说你可以不天天写内核代码、写 Binder 驱动但至少要知道这一整套“底层班子”是如何支撑你平时的一行行 Java/Kotlin 代码的。八、收个尾把 Android 底层支持组件想象成一个“城市系统”最后把这篇长文用一个城市类比收尾让你脑中留一个整体画面。Linux 内核 城市基础设施 物业公司修路进程调度、供电供水内存、I/O、管理各种建筑文件系统、还有一堆安全摄像头和门禁系统权限、SELinux。系统库 Native 服务 城市里的各种专业公司、工厂自来水厂媒体服务、电力公司图形渲染、电信局网络、银行金库keystore……ART 一个专门为“Java/Kotlin 族人”建的生活区提供他们能读懂的语言环境字节码、生活设施类库、垃圾清理GC。Framework system_server 市政府 各个职能部门规划局ActivityManagerService、城管PackageManagerService、交警WindowManagerService、公安权限/安全服务……Binder 城市里的电话网 内部专线各部门之间打电话协作市民App拨打市政府热线getSystemService办事情。Zygote 统一建房子的开发商一栋栋住宅楼App 进程都从它的标准模子克隆省成本、效率高。应用 App 城市里的各种商铺、公司使用市政提供的电、水、网和政策服务API给用户提供具体功能。当你把这些关联起来后就会发现Android 不是“一个大黑盒子”而是一整套层次分明、分工明确的城市系统。你写的每一行代码都有对应的“底层工作人员”在帮你完成动作。理解这套底层支持组件不是为了装 X而是为了在你遇到「为什么这儿这么慢」「为什么这个调用会崩」「这个进程怎么就被杀了」「多进程怎么设计才靠谱」等问题时脑子里能浮现出一张“城市地图”从底层结构上去分析、定位、解决。这就是掌握 Android 的“底层思维”的价值所在。