# AndroidLearningProject **Repository Path**: ZhuXiuLong/AndroidLearningProject ## Basic Information - **Project Name**: AndroidLearningProject - **Description**: Android学习项目,包含基础Android应用结构和Gradle构建系统详解 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-17 - **Last Updated**: 2026-01-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Android 操作系统分层详解 ## 一、Android 官方标准五层架构 从**最底层(硬件)** 到**最顶层(用户能看到的App)** 依次是: **硬件层 → Linux内核层 → 硬件抽象层(HAL) → 系统运行库层 + 应用框架层 → 应用层** (简化版四层架构:把 HAL 并入内核层,就变成 硬件层 → 内核层 → 框架层 → 应用层,本质完全一致) --- ## 二、逐层详解 ### 第1层:硬件层(Hardware Layer) #### 核心组成 手机的所有物理硬件:CPU(高通/联发科/麒麟)、内存RAM、存储ROM、屏幕、摄像头、传感器(陀螺仪/重力/指纹)、蓝牙/WiFi/基带、电池、扬声器、麦克风等。 #### 核心作用 Android系统的**物理载体**,是所有软件运行的最终硬件基础,也是所有指令的最终执行对象。 #### 层间关系 唯一关系:**被Linux内核层直接管理和驱动**,硬件层不与任何上层发生直接交互,所有硬件操作必须经过内核。 > 补充:Android 对硬件有统一的兼容性要求(CTS认证),所以不同品牌手机的硬件,能跑同一个Android系统。 --- ### 第2层:Linux内核层(Linux Kernel Layer) #### 核心组成 Android 基于 **Linux 长期支持版(LTS)** 内核(比如Android 14基于Linux 5.15),包含核心模块: - 硬件驱动程序(CPU驱动、屏幕驱动、相机驱动、传感器驱动、蓝牙/WiFi驱动等) - Linux内核原生能力:进程管理、内存管理、文件系统(ext4/f2fs)、网络管理(TCP/IP)、权限管理、安全机制、中断管理、电源管理。 #### 核心作用 1. **硬件的直接管理者**:是操作系统和硬件之间的**唯一桥梁**,所有对硬件的操作,最终都由内核的驱动程序执行。 2. **核心资源调度**:为上层所有进程分配CPU、内存、磁盘IO等硬件资源,保证系统有序运行。 3. **安全与基础保障**:提供进程隔离、用户权限、内存保护,防止某一个App崩溃导致整个系统宕机。 4. **提供基础内核服务**:比如多线程、进程间通信(IPC)、网络协议栈等。 #### 关键特性 Android的Linux内核**不是原生Linux**:Google做了大量定制化修改,比如增加了Binder(Android核心IPC通信机制)、Ashmem(匿名共享内存)、wakelock(休眠锁,保证后台进程运行)、Parcel(序列化机制)等,这些是Android最核心的内核特性,原生Linux没有。 #### 层间关系 向下:**直接对接硬件层**,通过驱动程序操控所有硬件,是硬件的唯一入口。 向上:**为硬件抽象层(HAL)提供底层API**,HAL所有的硬件操作都要通过内核实现,内核不直接对接上层的应用框架。 --- ### 第3层:硬件抽象层(Hardware Abstraction Layer,HAL) 这一层是**Android设计最精妙的一层,也是区分Android和普通Linux系统的核心**,很多人讲Android分层会忽略这层,但这层是Android能做到「**兼容不同硬件、内核不暴露给上层**」的核心,**必须重点理解**。 #### 为什么要设计HAL? Linux内核的驱动是**开源的**,如果让应用框架直接调用内核驱动,会有两个致命问题: 1. 手机厂商的**硬件驱动是商业机密**(比如高通的相机驱动、联发科的基带驱动),开源后会泄露核心技术; 2. 不同厂商的硬件驱动接口不一致,会导致上层框架需要为不同硬件写不同的适配代码,系统臃肿且兼容性差。 👉 HAL的出现,就是为了解决这两个问题:**做一层「硬件能力的封装」**。 #### 核心组成 由一系列的**硬件模块库(*.so)** 组成,比如相机HAL、音频HAL、传感器HAL、蓝牙HAL、WiFi HAL、GPS HAL等,每个硬件对应一个HAL模块。 #### 核心作用 1. **封装硬件驱动**:把内核的硬件驱动接口,封装成**统一的、标准的HAL接口**,上层框架只需要调用HAL的标准接口,不需要关心底层硬件的具体型号和驱动实现。 2. **隔离内核与上层**:HAL是内核的「门面」,**上层所有模块都不能直接访问内核,必须通过HAL**,既保护了厂商的驱动机密,也保证了系统的兼容性。 3. **硬件能力适配**:不同厂商的硬件,只要实现了Android标准的HAL接口,就能无缝接入Android系统,Google只需要制定HAL标准,不用关心硬件细节。 #### 层间关系 向下:**依赖Linux内核层**,HAL的所有硬件操作,最终都会调用内核的驱动程序执行。 向上:**为系统运行库层提供标准的硬件访问接口**,运行库层通过HAL获取硬件能力(比如相机拍照、传感器数据)。 > 关键总结:HAL是「内核硬件能力」到「上层软件能力」的**唯一中转站**,没有HAL,Android的上层就无法调用任何硬件。 --- ### 第4层:系统运行库层 + 应用框架层(Library + Framework Layer) 这一层是Android的**核心服务中枢**,也是**Android应用开发的核心基础**,官方把这两层合并为一层(因为耦合度极高),我们分开讲,**逻辑更清晰**,这两层共同构成了Android的「软件生态核心」,**所有应用的能力,都来自这一层的提供**。 #### 子层1:系统运行库层(Native Libraries & Runtime) 分为**两部分**:**原生C/C++库** + **Android运行时环境**,全部是**底层原生代码(C/C++)实现**,性能极高,是Android的「底层服务引擎」。 ##### 核心组成 - **原生C/C++库**:Android核心的底层库,比如: - libc:标准C库,提供文件、内存、字符串操作; - libm:数学库; - libsurfaceflinger:图形渲染核心库(负责屏幕显示); - OpenGL ES:3D图形渲染库; - Skia:2D图形渲染引擎(Android的绘图核心); - SQLite:轻量级数据库库(App的本地存储核心); - WebKit:网页渲染引擎(WebView的核心)。 - **Android运行时环境**: - 早期Android:**Dalvik虚拟机**(为移动设备定制,低内存、多实例); - Android 5.0及以后:**ART虚拟机**(Android Runtime),取代Dalvik,支持AOT预编译,性能提升50%+,是现在Android的核心运行时。 - 核心作用:**负责运行Android的应用程序(APK)**,把开发者写的Java/Kotlin代码,编译成能在手机上执行的机器码,同时提供垃圾回收(GC)、内存管理、线程管理等核心能力。 ##### 核心作用 1. **提供底层软件服务**:为应用框架层提供高性能的底层支持(比如图形渲染、数据库操作、网络请求); 2. **应用运行环境**:ART虚拟机是所有Android App的「运行容器」,没有它,Java/Kotlin写的App无法执行; 3. **封装HAL能力**:把HAL的硬件接口,封装成更易用的软件服务(比如把相机HAL封装成拍照服务,把传感器HAL封装成传感器数据服务)。 #### 子层2:应用框架层(Application Framework) 这一层是**Android的「上层服务核心」**,也是**Android开发者最熟悉的一层**,**全部由Java/Kotlin实现**,提供了Android所有的**系统API**,是连接「底层服务」和「上层应用」的**核心桥梁**。 ##### 核心组成 是一系列的**系统服务和核心API类库**,都是我们开发中天天用的,比如: - 四大组件核心:ActivityManagerService(AMS)、PackageManagerService(PMS)、WindowManagerService(WMS); - 系统服务:通知服务、闹钟服务、蓝牙服务、WiFi服务、位置服务、传感器服务、相机服务; - 核心API:View体系(TextView/Button/RecyclerView)、Intent(页面跳转)、ContentProvider(数据共享)、BroadcastReceiver(广播)、Service(后台服务)、Handler(线程通信)等。 ##### 核心作用 1. **提供标准化的系统API**:为上层的应用层(App)提供**所有的系统能力**,开发者写的App,本质就是**调用这一层的API实现各种功能**(比如打开相机、发送通知、联网请求、页面跳转)。 2. **统一管理应用生命周期**:比如AMS负责管理所有App的Activity生命周期,PMS负责管理App的安装、卸载、权限,WMS负责管理所有App的窗口显示。 3. **封装底层服务**:把系统运行库层的原生服务,封装成Java/Kotlin的API,让开发者不用写C/C++代码,就能轻松调用底层能力。 #### 这两层的层间关系 + 整体对外关系 内部关系:**应用框架层依赖系统运行库层**,框架层的所有Java/Kotlin API,最终都会调用运行库层的C/C++库实现,运行库层是框架层的「底层引擎」。 向下关系:**系统运行库层依赖HAL层**,运行库层的硬件相关操作(比如相机拍照),都会调用HAL的标准接口。 向上关系:**为应用层提供所有的系统API**,应用层的App只能通过调用框架层的API,获取系统的所有能力,**App不能直接调用HAL、内核、硬件**。 > 开发者核心认知:**我们平时写Android代码(Java/Kotlin),本质就是调用「应用框架层」的API**,比如`startActivity()`是调用AMS的API,`takePicture()`是调用相机服务的API,这些API最终都会层层调用到HAL和内核,最终实现功能。 --- ### 第5层:应用层(Application Layer)—— 最顶层,用户直接感知的层 #### 核心组成 所有运行在Android系统上的**应用程序**,分为两类: 1. **系统应用**:Android原生自带的App,由Google/手机厂商开发,比如桌面(Launcher)、电话、短信、相机、相册、设置、浏览器、应用商店等,这类App和系统深度绑定,拥有更高的系统权限。 2. **第三方应用**:开发者开发的App,比如微信、抖音、淘宝、B站、王者荣耀等,就是我们平时从应用商店下载的所有App。 #### 核心组成补充 Android的应用都是以 **APK**(Android Package)为安装包格式,所有App的代码都是基于Java/Kotlin(主流)或Flutter/React Native(跨平台)开发,最终运行在ART虚拟机中。 #### 核心作用 1. **为用户提供具体的功能服务**:是Android系统的**最终呈现形式**,用户通过App完成所有操作(社交、娱乐、办公、购物等)。 2. **调用系统能力**:所有App的功能,都是通过调用「应用框架层」的API实现的,比如微信的拍照功能调用相机API,抖音的视频播放调用多媒体API,淘宝的支付调用网络API。 #### 层间关系 唯一关系:**完全依赖应用框架层**,应用层是Android分层的「最终消费者」,**只能被动调用上层框架提供的API,无法直接访问任何底层模块**。 > 重要规则:Android是**沙箱机制**,每个App都是一个独立的进程,拥有独立的内存空间和权限,App之间相互隔离,一个App崩溃不会影响其他App和系统,这也是Android系统稳定性的核心保障。 --- ## 三、Android 五层架构的完整调用链路+层间关系总结 我们用一个**最常见的场景:打开相机App拍照**,来梳理**从上层到下层的完整调用链路**,你会瞬间明白所有层的关系,所有Android操作的调用链路都是这个逻辑: > **应用层(相机App)** → 调用 → **应用框架层(相机服务API)** → 调用 → **系统运行库层(相机相关C/C++库)** → 调用 → **硬件抽象层(相机HAL模块)** → 调用 → **Linux内核层(相机驱动程序)** → 操控 → **硬件层(相机传感器)** → 完成拍照 → 结果原路返回给相机App。 ### 层间关系核心 1. **从上到下:依赖关系** → 上层依赖下层,上层的所有能力都由下层提供,没有下层就没有上层; 2. **从下到上:支撑关系** → 下层支撑上层,下层为上层提供标准化的接口和能力,下层不关心上层的具体实现; 3. **层间隔离原则** → 层与层之间有清晰的接口,修改某一层的实现,只要接口不变,其他层完全不受影响,这是Android的核心设计思想。 --- ## 六、Android分层的核心价值 Android设计成分层架构,不是为了复杂,而是为了解决**移动端操作系统的核心痛点**,总结下来有3个核心价值: 1. **兼容性**:不同品牌的硬件,只要实现了标准的HAL接口,就能无缝接入Android系统,Google只需要制定标准,不用关心硬件细节; 2. **稳定性**:层间隔离,一个层出问题不会影响其他层,比如App崩溃不会导致内核宕机; 3. **易开发/易扩展**:开发者只需要调用应用框架层的API,不用关心底层硬件和内核,降低了开发门槛;厂商可以轻松定制硬件和驱动,不用修改上层系统。 --- ### Android 分层与开发的关联 1. 做**Android应用开发**(Java/Kotlin/Flutter):只需要掌握 **应用层 + 应用框架层** 即可,这是我们的主战场; 2. 做**Android系统开发**(定制ROM/系统服务):需要掌握 **应用框架层 + 系统运行库层 + HAL层**; 3. 做**Android底层开发**(驱动/内核定制):需要掌握 **HAL层 + Linux内核层 + 硬件层**。 # MyApplication 项目结构分析 ## 项目概述 这是一个使用 Kotlin 和 Jetpack Compose 开发的 Android 应用程序。项目采用现代化的 Android 开发架构,使用 Gradle Kotlin DSL 作为构建系统。 ## 目录结构及说明 ### 根目录文件 - **README.md** - 项目说明文档 - **作用**:提供项目概述、结构说明和使用指南 - **项目阶段**:整个项目生命周期,用于文档化和项目交接 - **说明**:帮助开发者快速理解项目结构、技术栈和构建方法 - **build.gradle.kts** - 项目级构建配置文件 - **作用**:定义所有子模块共享的插件和配置 - **项目阶段**:项目初始化和构建阶段 - **说明**:在此文件中声明的插件会应用到所有子模块,但使用 `apply false` 表示仅在根项目声明,不在根项目应用 - **settings.gradle.kts** - 项目设置文件 - **作用**:配置仓库、插件管理和包含的模块 - **项目阶段**:项目初始化阶段,Gradle 首先读取此文件 - **说明**:定义了项目名称、包含的模块以及依赖解析的仓库配置 - **gradle.properties** - Gradle 属性配置文件 - **作用**:配置 Gradle 构建过程的全局属性和 JVM 参数 - **项目阶段**:构建过程全程 - **说明**:可以设置内存分配、并行构建、编码格式等影响构建行为的参数 - **gradlew** - Gradle 包装器的 Unix/Linux 脚本 - **作用**:在 Unix/Linux/macOS 系统上启动 Gradle 构建,可以直接把这个脚本当作gradlew命令来使用,因为这个脚本会自动执行gradle-wrapper.jar来下载gradle,并且使用你预先下载好的JAVA_HOME,然后执行gradle命令,并且把你执行脚本传入的gradle命令参数拼接到gradle中。 - **项目阶段**:构建阶段 - **说明**:确保使用项目指定的 Gradle 版本,无需系统预装 Gradle - **执行逻辑**: 1. **初始化阶段**:确定脚本位置,处理符号链接,设置 APP_HOME 为项目根目录 2. **环境配置阶段**:设置应用名称和默认 JVM 选项("-Xmx64m" "-Xms64m"),检测操作系统类型 3. **Java 环境检测阶段**:优先检查 JAVA_HOME,验证 Java 可执行文件存在性,失败时尝试系统 PATH 4. **系统优化阶段**:提高文件描述符限制(非 Windows),为 macOS 添加 Dock 设置,为 Cygwin/MSYS 转换路径格式 5. **执行阶段**:设置类路径为 gradle-wrapper.jar,收集命令行参数,执行 GradleWrapperMain - **gradlew.bat** - Gradle 包装器的 Windows 批处理脚本 - **作用**:在 Windows 系统上启动 Gradle 构建,可以直接把这个脚本当作gradlew命令来使用,因为这个脚本会自动执行gradle-wrapper.jar来下载gradle,并且使用你预先下载好的JAVA_HOME,然后执行gradle命令,并且把你执行脚本传入的gradle命令参数拼接到gradle中。 - **项目阶段**:构建阶段 - **说明**:与 gradlew 功能相同,但适用于 Windows 命令行环境 - **执行逻辑**: 1. **初始化阶段**:设置本地变量作用域,获取脚本目录,设置应用名称和主目录 2. **环境配置阶段**:设置默认 JVM 选项("-Xmx64m" "-Xms64m") 3. **Java 环境检测阶段**:检查 JAVA_HOME 环境变量,未定义时尝试系统 PATH 中的 java.exe,验证 Java 可用性 4. **执行阶段**:设置类路径为 gradle-wrapper.jar,执行 GradleWrapperMain 并传递所有参数 #### Gradle Wrapper 最终效果 两个脚本实现相同的核心功能: - **自动下载和管理 Gradle 版本**:首次运行时自动下载项目所需 Gradle 版本到 ~/.gradle/wrapper/dists - **版本一致性保证**:确保所有开发者和 CI/CD 环境使用完全相同的 Gradle 版本 - **构建环境隔离**:不依赖系统全局安装的 Gradle,避免版本冲突 **执行流程**:脚本启动 → 环境检测 → Java 验证 → 设置类路径 → 启动 GradleWrapperMain → 下载/使用 Gradle → 执行构建任务 **实际效果**: - 开发者只需安装 Java 即可参与项目构建 - 项目构建行为在所有平台上保持一致 - 新团队成员无需手动安装和配置 Gradle - CI/CD 环境可以快速设置构建环境 - **local.properties** - 本地配置文件 - **作用**:存储本地开发环境特定的配置,如 Android SDK 路径 - **项目阶段**:构建阶段 - **说明**:此文件由 Android Studio 自动生成,不应提交到版本控制系统,包含敏感的本地路径信息 - **.gitignore** - Git 忽略文件配置 - **作用**:指定 Git 版本控制系统应忽略的文件和目录 - **项目阶段**:版本控制全程 - **说明**:防止构建产物、临时文件和敏感信息被提交到代码仓库 ### .gradle 目录 Gradle 构建系统的缓存和工作目录,包含: #### 目录出现时机 - **首次出现**:当项目第一次执行 Gradle 命令(如构建、同步等)时自动创建 - **创建时间**:2025年12月16日 23:59:25 CST(根据 config.properties 的时间戳) - **创建条件**:执行任何 Gradle 任务,包括 Android Studio 的项目同步 #### 目录作用与发挥时间 - **8.13/** - Gradle 版本相关缓存 - **作用**:存储 Gradle 8.13 版本特定的缓存数据 - **发挥时间**:构建过程全程,从第二次构建开始显著提升速度 - **说明**:包含构建执行历史、文件哈希、变更记录等,用于增量构建和构建缓存 - **checksums/** - 校验和缓存,确保依赖完整性 - **executionHistory/** - 构建执行历史记录,用于优化后续构建 - **fileChanges/** - 文件变更记录,支持增量构建 - **fileHashes/** - 文件哈希值缓存,用于检测文件变更 - **gc.properties** - 垃圾回收配置 - **buildOutputCleanup/** - 构建输出清理配置 - **作用**:管理构建输出的清理策略 - **发挥时间**:执行 `clean` 任务或构建前清理阶段 - **说明**:记录哪些构建输出可以被安全清理,以节省磁盘空间 - **vcs-1/** - 版本控制系统相关缓存 - **作用**:缓存与版本控制系统相关的信息 - **发挥时间**:构建初始化阶段,检查 VCS 状态时 - **说明**:存储 VCS 状态信息,用于优化与版本控制系统的交互 - **config.properties** - Gradle 配置属性 - **作用**:存储 Gradle 的全局配置,如 Java 路径 - **发挥时间**:Gradle 守护进程启动时读取 - **说明**:包含 Gradle 守护进程和其他全局设置的配置 #### 重要性说明 这个目录是 Gradle 高性能构建的关键,通过缓存机制实现: 1. **增量构建**:只重新编译变更的文件 2. **任务缓存**:复用未变更任务的输出 3. **依赖解析缓存**:避免重复解析依赖关系 4. **构建加速**:从第二次构建开始显著提升构建速度 ### .idea 目录 Android Studio IDE 配置目录: - **.gitignore** - Git 忽略配置 - **workspace.xml** - 工作区配置文件 ### gradle 目录 Gradle 相关配置: - **wrapper/** - Gradle 包装器相关文件 - **gradle-wrapper.jar** - Gradle 包装器 JAR 文件 - **作用**:包含启动 Gradle 构建所需的核心代码 - **项目阶段**:构建初始化阶段 - **说明**:这个 JAR 包是 Gradle Wrapper 的核心组件,负责下载并运行正确版本的 Gradle。它确保所有开发者和 CI/CD 系统使用相同的 Gradle 版本,无需在系统中预装 Gradle。当执行 `gradlew` 或 `gradlew.bat` 时,实际上是这个 JAR 包被启动。 - **gradle-wrapper.properties** - Gradle 包装器属性配置 - **作用**:配置 Gradle Wrapper 的行为和下载源 - **项目阶段**:构建初始化阶段 - **说明**:指定要使用的 Gradle 版本(当前为 8.13)和下载地址,以及本地存储路径 - **libs.versions.toml** - 版本目录文件 - **作用**:统一管理项目中所有依赖库和插件的版本号 - **项目阶段**:构建配置和依赖解析阶段 - **说明**:使用 TOML 格式集中定义版本号,避免在多个 build.gradle 文件中重复声明,便于版本管理和升级 ### app 目录 应用程序主模块,包含所有源代码和资源: #### app/build.gradle.kts 应用模块的构建配置文件,定义了: - 应用 ID:com.example.myapplication - SDK 版本:最小 24,目标 36 - 依赖项:包括 AndroidX、Compose 相关库 - 构建特性:启用了 Compose 支持 #### app/src 目录 源代码目录,分为三个主要部分: ##### main 目录 主要源代码和资源: - **java/com/example/myapplication/** - Kotlin 源代码 - **MainActivity.kt** - 应用主活动,使用 Compose 构建 UI - **ui/theme/** - UI 主题相关文件 - **Color.kt** - 定义应用颜色方案 - **Theme.kt** - Material 3 主题配置 - **Type.kt** - 文字排版样式定义 - **res/** - Android 资源文件 - **drawable/** - 图片资源 - **ic_launcher_background.xml** - 应用图标背景 - **ic_launcher_foreground.xml** - 应用图标前景 - **mipmap-*/** - 不同密度的应用图标 - **values/** - 值资源 - **colors.xml** - 颜色资源 - **strings.xml** - 字符串资源 - **themes.xml** - 主题资源 - **xml/** - XML 配置文件 - **backup_rules.xml** - 备份规则 - **data_extraction_rules.xml** - 数据提取规则 - **AndroidManifest.xml** - Android 应用清单文件 ##### test 目录 单元测试代码: - **java/com/example/myapplication/ExampleUnitTest.kt** - 示例单元测试 ##### androidTest 目录 Android 设备上的集成测试: - **java/com/example/myapplication/ExampleInstrumentedTest.kt** - 示例仪器化测试 #### app/.gitignore 应用模块的 Git 忽略配置 #### app/proguard-rules.pro ProGuard 混淆规则配置文件 ## 技术栈分析 - **编程语言**: Kotlin - **UI 框架**: Jetpack Compose - **最低 Android 版本**: Android 7.0 (API 24) - **目标 Android 版本**: Android 15 (API 36) - **构建系统**: Gradle with Kotlin DSL - **测试框架**: JUnit, Espresso ## 应用功能 当前应用是一个简单的"Hello Android"应用,显示一个带有问候语的界面。应用支持: - 浅色/深色主题切换 - 动态颜色(Android 12+) - 边缘到边缘显示 ## 构建和运行 1. 使用 Android Studio 打开项目 2. 确保已安装 Android SDK 和必要的构建工具 3. 连接 Android 设备或启动模拟器 4. 点击运行按钮或使用项目中的gradlew脚本: ```bash ./gradlew installDebug ``` ## 测试 - 运行单元测试:`./gradlew test` - 运行仪器化测试:`./gradlew connectedAndroidTest` 这是一个标准的 Android 项目模板,可以作为开发更复杂应用的基础。 # 接下来 - [app模块](./app/README.md)