主题
客户端开发:从 0 到 1 的调研笔记
本文目的:写给「只听过『写代码』,但没真正搞明白客户端到底是个啥」的小白。读完你能:
- 说清楚「客户端开发」与「前端 / 后端」到底是什么关系;
- 能列出移动端、桌面端、跨平台 3 大流派各自的语言、框架、工具链;
- 知道一个客户端 App 是怎么从一行代码变成手机里的图标、电脑桌面上的程序;
- 知道接下来该按什么路径学下去,不会一上来就被「Gradle / Xcode / Flutter / Compose / KMP」一堆名词砸晕。
0. 先回答一个灵魂问题:什么是「客户端」?
0.1 餐厅里的「客户端」与「服务端」
想象你周五晚上去吃饭:
┌─────────────────┐ 点单 / 上菜 ┌─────────────────┐
│ 你 + 服务员 │ ◄────────────────────► │ 后厨 │
│ (客户端 Client)│ │ (服务端 Server)│
└─────────────────┘ └─────────────────┘
看菜单 切菜炒菜
点菜 查库存
吃饭 结算- 客户端:直接面对人 的那一端 —— 菜单要好看、上菜要及时、坐着要舒服。
- 服务端:藏在厨房的那一端 —— 食材要新鲜、火候要稳、上百桌同时点单不能乱。
把这套搬到软件世界,几乎一一对应:
| 餐厅角色 | 软件世界对应 | 关心什么 |
|---|---|---|
| 菜单 / 桌椅 / 装修 | 客户端 App | 界面好不好看、点起来顺不顺手 |
| 服务员(点单 / 报菜) | 客户端代码 | 把用户的操作翻译成请求 |
| 后厨 | 服务器 | 业务逻辑、数据处理、并发量 |
| 食材仓库 | 数据库 | 数据存哪儿、怎么存、怎么备份 |
📌 一句话定义:客户端 = 装在用户设备上、直接跟用户打交道的那部分软件。
0.2 客户端 vs 前端 vs 后端:到底谁是谁?
很多人刚入行最头疼的一个问题。看这张图:
┌────────────────────────────────────────────────────────────────┐
│ 整个软件系统 │
├────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Web 前端 │ │ 移动客户端 │ │ 桌面客户端 │ │
│ │ (浏览器里跑) │ │ (Android/iOS) │ │ (Win/Mac/Linux)│ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └──────────────────┼──────────────────┘ │
│ │ │
│ ▼ HTTP / WebSocket / gRPC │
│ ┌─────────────────────────────┐ │
│ │ 后端 / 服务端 │ │
│ │ (Java / Go / Python ...) │ │
│ └─────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────┐ │
│ │ 数据库 / 缓存 / 消息队列 │ │
│ └─────────────────────────────┘ │
└────────────────────────────────────────────────────────────────┘| 名词 | 跑在哪 | 典型语言 | 用户眼中的样子 |
|---|---|---|---|
| Web 前端 | 浏览器 | JS/TS + HTML/CSS | 网页 |
| 移动客户端 | 手机 | Kotlin / Swift / Dart | App 图标 |
| 桌面客户端 | 电脑 | C# / C++ / Swift / Rust | 桌面程序 |
| 后端 / 服务端 | 机房服务器 | Java / Go / Python / Node | 看不见,但啥都靠它 |
📌 关键结论:「前端」是「客户端」的一个特例(专指浏览器里跑的那种)。在中文圈里,「客户端开发」通常默认指 Android / iOS / 桌面 App,不包括纯 Web 网页。
0.3 一个外卖 App 的横切面
来个特别具体的例子,看一份订单从你点击到吃上嘴的完整链路:
📱 你在 App 里点「川菜 · 麻婆豆腐」 ┐
│ │ ← 客户端
│ (1) 渲染菜品列表 / 监听点击 │ 做的事
│ (2) 把订单打包成 JSON │
▼ ┘
┌──────────────────┐
│ HTTPS 请求发到 │ ← 网络
│ 后端服务器 │
└──────┬───────────┘
│ ┐
▼ │
┌──────────────────┐ │
│ 后端处理订单 │ │
│ 扣余额 / 通知商家 │ │ ← 后端
│ 通知骑手 │ │ 做的事
└──────┬───────────┘ │
│ ┘
▼
┌──────────────────┐
│ 数据写到数据库 │
└──────────────────┘
▲
│ 推送 ┐
│ 「商家已接单」 │ ← 客户端
▼ │ 还要做
📱 你的 App 弹出通知 / 更新页面 ┘客户端开发就是负责图里 📱 那两块:让屏幕上的像素动起来 + 把用户行为翻译成网络请求 + 把后端返回的数据画回屏幕。
1. 客户端的「五大江湖」
客户端这个圈子很大,按运行环境可以分成 5 个流派:
★ 客户端开发的 5 大江湖 ★
移动端 桌面端
┌────────┐ ┌────────────┐
│Android │ │ Windows │
│ iOS │ │ macOS │
│ HarmonyOS │ Linux │
└────────┘ └────────────┘
│ │
└────────────┬─────────────────────┘
│
┌──────┴──────┐
│ 跨平台 │ ← 一套代码跑多端
│ Flutter / RN│
│ KMP / Tauri │
└──────┬──────┘
│
┌────────────┴────────────┐
│ │
┌──────┴───────┐ ┌──────┴───────┐
│ Web 客户端 │ │ 嵌入式 / IoT │
│ (浏览器内运行)│ │ 车机/手表/电视 │
└──────────────┘ └──────────────┘1.1 移动端:日活最高的战场
| 平台 | 占比(全球) | 操作系统 | 特点 |
|---|---|---|---|
| Android | ~70% | Linux 内核 + ART 虚拟机 | 开源、机型碎片化、上架自由 |
| iOS | ~28% | 类 Unix 内核 (Darwin) | 闭源、机型统一、上架严格 |
| HarmonyOS / 鸿蒙 | 小但增长快 | 自研内核 + ArkTS | 国内必学,多端协同 |
📌 生活化类比:Android 像 「安卓系统大集市」 —— 谁都能摆摊(厂商定制 ROM),机型从 599 元到 1.5 万元都有;iOS 像 「苹果直营专卖店」 —— 只卖苹果货、布局统一、价格统一、规矩也最严。
1.2 桌面端:被低估的老江湖
┌────────────────────────────────────────────────┐
│ 常见桌面客户端类型 │
├────────────────────────────────────────────────┤
│ ① 原生重应用:Photoshop / Office / IDE / 微信PC │
│ ② 工具类:截图 / 剪贴板 / 翻译 / 录屏 │
│ ③ 游戏:Steam / 原神 / 各种独立游戏 │
│ ④ 小工具:菜单栏挂件 / Dock 启动器 │
└────────────────────────────────────────────────┘桌面客户端比 Web 强的地方:
- 直接调系统能力:摄像头、麦克风、文件系统、通知、剪贴板 —— 浏览器很多权限拿不到。
- 离线可用:没网也能跑(Web 也有 PWA 但体验有限)。
- 性能上限高:可以吃满 CPU/GPU(视频剪辑、游戏、AI 模型本地推理都靠这个)。
1.3 跨平台:用一套代码省一份工资
痛点:一个公司想做 App,要请 Android 团队 + iOS 团队 + Web 团队 —— 3 套代码、3 个 bug 列表、3 套测试。
跨平台框架就是 「写一次,跑多端」 的承诺:
┌──────────────────────┐
│ 跨平台业务代码 │
│ (Dart / TS / Kotlin) │
└───────────┬──────────┘
│ 编译 / 渲染
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Android │ │ iOS │ │ Web │
└─────────┘ └─────────┘ └─────────┘- 代价:性能略损、平台特性需要"桥接"、版本兼容是另一个深坑。
- 收益:人力 ÷ N,迭代速度 × N。
1.4 Web 客户端:跑在浏览器里的那一种
严格说也是客户端,只是运行环境是浏览器。本笔记重点不在这(前端笔记单独写),简单贴个图占位:
开发语言:HTML + CSS + JavaScript / TypeScript
主流框架:React / Vue / Angular / Svelte / Solid
特点:跨平台天生免费、安装即用、SEO 友好、但性能/系统能力受限1.5 嵌入式 / IoT:屏幕越小越能秀
车机、手表、电视、智能音箱 —— 凡是带屏幕但不是手机/电脑的都算这一类。
- 车机:高德/百度地图 + 导航 + 在线音乐,框架常用 Android Automotive、QNX、HarmonyOS。
- 手表:Wear OS、watchOS、HarmonyOS、华米自家 OS。
- 电视盒子:Android TV、tvOS、各类自研系统。
📌 小白要不要学:先放放。等你把移动端或桌面端打通,再来看车机/手表会觉得「就是同款套路换了张屏幕」。
2. 各端的「母语」与「普通话」
每个平台都有 母语(系统钦定的语言)和 普通话(跨平台框架用的语言)。
2.1 母语清单
| 平台 | 母语(推荐) | 母语(旧的,但还活着) | 备注 |
|---|---|---|---|
| Android | Kotlin | Java | Google 钦定 Kotlin First |
| iOS / macOS | Swift | Objective-C | Apple 钦定 Swift |
| Windows | C# | C++ / VB.NET | .NET 生态完善 |
| Linux 桌面 | C / C++ / Rust | Python (脚本) | 没有"官方"指定,看 DE |
| HarmonyOS | ArkTS | (Java 兼容层) | 鸿蒙特有 |
2.2 普通话清单(跨平台)
| 框架 | 用的语言 | 渲染方式 | 一句话总结 |
|---|---|---|---|
| Flutter | Dart | 自绘(Skia/Impeller) | Google 出品,画得快、像素级一致 |
| React Native | TypeScript / JS | 桥接系统原生组件 | Meta 出品,前端友好 |
| Kotlin Multiplatform (KMP) | Kotlin | 各端用各自 UI | 业务逻辑共享,UI 仍原生 |
| Compose Multiplatform | Kotlin | 自绘(Skia) | KMP 的 UI 解决方案,跟 Jetpack Compose 同源 |
| Tauri | Rust + Web | 系统 WebView + Rust 后端 | 比 Electron 小 100 倍 |
| Electron | TypeScript / JS | 内嵌 Chromium | 能跑就行,资源吃得多(VSCode / Discord 都用它) |
| MAUI | C# (.NET) | 各端原生 | 微软的跨平台答卷 |
| Kuikly | Kotlin (KTV) | 自研引擎 | 腾讯自研,KMP 思路的中国版本 |
📌 生活化类比:母语像 「上海人在上海跟上海人讲上海话」 —— 最自然、最高效;跨平台像 「在上海跟全国客户开会,大家说普通话」 —— 沟通成本低,但失去了一些方言里独有的味道。
2.3 该学哪门语言?决策图
你的目标是什么?
│
├── 做 Android App ──────────► Kotlin(带一点 Java)
│
├── 做 iOS App ──────────► Swift(带一点 OC)
│
├── 做 Windows 工具 ─────────► C# / C++ / Rust
│
├── 做 macOS 工具 ─────────► Swift
│
├── 做 Web App ──────────► TypeScript + React
│
├── 一套代码跑多端 ─────────► Flutter (Dart) 或 KMP+Compose (Kotlin)
│
└── 不知道,想入门 ─────────► Kotlin(生态广 + 跨度大)3. 各端的「主流框架」一览
「框架」可以理解为 「别人帮你搭好的房子骨架」,你只需要装修和摆家具。
3.1 移动端框架对比
| 框架 | 平台 | 语言 | UI 范式 | 现状 |
|---|---|---|---|---|
| Jetpack Compose | Android | Kotlin | 声明式 | Google 推荐,写法简洁 |
| Android View 体系 | Android | Kotlin/Java + XML | 命令式 | 老但还在维护 |
| SwiftUI | iOS | Swift | 声明式 | Apple 推荐,必学 |
| UIKit | iOS | Swift / OC | 命令式 | 老但功能完整,存量多 |
| Flutter | 跨平台 | Dart | 声明式 | 稳定,国内大厂在用 |
| React Native | 跨平台 | TypeScript | 声明式 | 前端转客户端的首选 |
| KMP + Compose Multiplatform | 跨平台 | Kotlin | 声明式 | 增长最快,值得押注 |
| HarmonyOS ArkUI | 鸿蒙 | ArkTS | 声明式 | 国内必学 |
📌 「声明式」vs「命令式」生活化类比:
- 命令式:你跟厨师说 「开火 → 倒油 → 放葱花 → 放鸡蛋 → 翻炒 → 加盐 → 出锅」,每一步都要你下命令。
- 声明式:你跟厨师说 「我要一盘葱花炒蛋」,怎么炒厨师自己决定,你只管描述结果。
- 趋势:所有现代 UI 框架(Compose / SwiftUI / Flutter / React)全部转向声明式 —— 写得少、bug 少、可读性高。
3.2 桌面端框架对比
| 框架 | 平台 | 语言 | 特点 |
|---|---|---|---|
| WinUI 3 / WPF | Windows | C# | 微软原生,企业内部很常用 |
| AppKit / SwiftUI for Mac | macOS | Swift | macOS 原生,最优体验 |
| Qt | 全平台 | C++ / Python (PyQt) | 老牌跨平台,CAD/工业软件常用 |
| GTK | Linux 主 | C / Rust / Python | GNOME 桌面常用 |
| Electron | 全平台 | TypeScript | VSCode、Discord、Slack 都用它 |
| Tauri | 全平台 | Rust + Web | Electron 的 Rust 改良版 |
| MAUI | 全平台 | C# | 微软新一代跨平台方案 |
| Compose Multiplatform | 全平台 | Kotlin | JetBrains 的桌面方案 |
3.3 一个完整 App 的"标准技术栈"长啥样?
以「一个 Android 微博 App」为例,你大概会用到:
┌──────────────────────────────────────────────────────┐
│ UI 层 - Jetpack Compose │
│ (按钮 / 列表 / 主题 / 动画 / 屏幕适配) │
├──────────────────────────────────────────────────────┤
│ 状态层 - ViewModel + StateFlow │
│ (UI 现在该显示什么) │
├──────────────────────────────────────────────────────┤
│ 业务层 - UseCase / Repository │
│ (登录 / 发微博 / 拉时间线) │
├──────────────────────────────────────────────────────┤
│ 本地存储 - Room (SQLite) 网络 - Retrofit │
│ 图片缓存 - Coil 并发 - Coroutines │
│ 依赖注入 - Hilt 日志 - Timber │
├──────────────────────────────────────────────────────┤
│ 构建系统 - Gradle (Kotlin DSL) │
├──────────────────────────────────────────────────────┤
│ 运行时 - Android Runtime (ART) │
└──────────────────────────────────────────────────────┘📌 小白需要吓一跳吗:完全不用。这些库不是一次性学完,而是「用到哪个学哪个」。第一周你只要懂 Compose + ViewModel 就能写出能用的 App。
4. 客户端开发的「关键技术问题」
无论平台、无论框架,客户端开发永远绕不开下面这 7 个核心问题。看完你就建立了"全局地图"。
★ 客户端开发的 7 个永恒话题 ★
┌────┐ ┌────┐ ┌────┐ ┌────┐
│ UI │ │状态│ │网络│ │存储│
└────┘ └────┘ └────┘ └────┘
┌────┐ ┌────┐ ┌────┐
│并发│ │发布│ │监控│
└────┘ └────┘ └────┘4.1 UI 渲染:屏幕上的像素是怎么画出来的?
你写的代码: Text("你好")
│
▼
框架解析: 构建一棵 UI 树(Widget Tree)
│
▼
测量布局: 每个组件多大、放哪
│
▼
绘制: 转成 GPU 指令 (OpenGL/Vulkan/Metal)
│
▼
合成: 系统合成器把多个图层叠成最终画面
│
▼
屏幕显示: 60Hz / 120Hz 刷新,看起来"流畅"性能红线:每一帧(16.6ms 内)必须画完,否则就卡顿。这就是为什么客户端工程师对"主线程"特别敏感。
4.2 状态管理:UI 现在该显示什么?
生活化类比:状态 = 「点餐 App 顶部那个小红点显示的『未读消息数』」。它什么时候出现?怎么变化?被谁改的?怎么保证多个页面看到的数字一致?
主流方案:
| 平台 | 方案 |
|---|---|
| Android | ViewModel + StateFlow / LiveData |
| iOS | @State + @Observable (SwiftUI) |
| Flutter | Provider / Riverpod / Bloc |
| React Native | Redux / Zustand / Recoil |
4.3 网络请求:怎么跟后端"对暗号"
客户端 服务器
│ │
│ POST /api/login {user, pwd} │
│ ──────────────────────────────────► │
│ │
│ {token: "xxx", uid: 123} │
│ ◄────────────────────────────────── │
│ │
│ GET /api/timeline Authorization: ... │
│ ──────────────────────────────────► │
│ │
│ [{id:1, ...}, {id:2, ...}] │
│ ◄────────────────────────────────── │常用库:
| 平台 | HTTP 库 | JSON 库 |
|---|---|---|
| Android | OkHttp / Retrofit | Moshi / kotlinx.serialization |
| iOS | URLSession / Alamofire | Codable |
| Flutter | Dio / http | json_serializable |
4.4 本地存储:数据放哪儿?
┌─────────────────────────────────────────────────┐
│ 小数据 (Key-Value): SharedPreferences/UserDefaults│
│ 例:登录 token、用户偏好 │
├─────────────────────────────────────────────────┤
│ 关系型: SQLite (Room / GRDB / Drift) │
│ 例:聊天记录、订单列表 │
├─────────────────────────────────────────────────┤
│ 键值数据库: MMKV / LevelDB │
│ 例:高频读写的小数据 │
├─────────────────────────────────────────────────┤
│ 文件: 沙盒目录 (Documents / Cache) │
│ 例:图片、下载的安装包 │
└─────────────────────────────────────────────────┘4.5 并发:「主线程不能卡」铁律
生活化类比:主线程 = 餐厅里唯一的服务员。所有点单、上菜、收钱都得他来。如果他停下来「拧瓶盖拧 5 秒」,整个餐厅就卡了 5 秒。
所以耗时操作(网络、读文件、解码图片)必须扔到子线程。各端的方案:
| 平台 | 方案 |
|---|---|
| Android | Kotlin Coroutines + Dispatchers.IO |
| iOS | Swift Concurrency (async/await) / GCD |
| Flutter | Future + async/await / Isolate |
| Web | async/await + Web Worker |
4.6 发布与上架:写完代码 ≠ 用户能下载
开发完成
│
▼
打包 (APK / IPA / EXE / DMG)
│
▼
签名 (证书校验,证明是你写的)
│
▼
上传应用商店 / 分发渠道
│
▼
审核 (iOS 严,Android 松,HarmonyOS 看心情)
│
▼
灰度发布 (先放给 1% 用户)
│
▼
全量发布4.7 监控与稳定性:上线后才是真正的开始
常见监控指标:
┌─────────────────────────────────────────┐
│ Crash 率:千分之几崩溃了 │
│ ANR:界面无响应 │
│ 启动时长:冷启动 / 热启动 │
│ 内存峰值 / 帧率 │
│ 网络成功率 / 接口耗时 │
└─────────────────────────────────────────┘
常用平台:
Firebase Crashlytics / Sentry / 友盟 / Bugly / DataDog5. 构建与编译:源代码是怎么变成 App 的?
5.1 「构建」与「编译」的区别
很多人混着用,其实两个概念:
编译 (Compile) : 把源代码 → 可执行的机器/字节码
构建 (Build) : 从源码到最终发布产物的"全过程"
(含 编译 + 打包 + 签名 + 资源压缩 + ...)📌 生活化类比:
- 编译 = 「把面粉揉成面团」
- 构建 = 「从买面粉、揉面、发酵、烤、装盒、贴标签到送出门」的整个流程
5.2 各端的构建系统
| 平台 | 构建系统 | 入口文件 | 配套包管理 |
|---|---|---|---|
| Android | Gradle | build.gradle.kts | Maven Central / Google Maven |
| iOS / macOS | Xcode Build System + Swift Package Manager / CocoaPods | Package.swift / Podfile | SPM / CocoaPods |
| Windows (.NET) | MSBuild | *.csproj | NuGet |
| Flutter | Flutter CLI (内部封装 Gradle + Xcode) | pubspec.yaml | pub.dev |
| Web | Vite / Webpack / esbuild | package.json | npm / pnpm / yarn |
| Rust 桌面 (Tauri) | Cargo + Tauri CLI | Cargo.toml + tauri.conf.json | crates.io |
| 跨大型项目 | Bazel | BUILD | 自管 |
5.3 一个 Android App 的完整构建流程(必看)
src/main/ (你写的源码)
├── kotlin/com/myapp/*.kt ┐
├── java/com/myapp/*.java │
├── res/ │ ┌────────────────┐
│ ├── layout/*.xml │ ──► │ Gradle 编排 │
│ └── values/strings.xml │ └────────┬───────┘
└── AndroidManifest.xml ┘ │
▼
┌──────────────────────────┐
│ 1. 编译 Kotlin/Java → .class│
│ 2. .class → DEX 字节码 │
│ 3. 资源 (res) 编译为二进制 │
│ 4. 打包 .apk │
│ 5. 签名 (V1/V2/V3) │
│ 6. (可选)对齐/压缩/混淆 │
└────────┬─────────────────┘
│
▼
app-release.apk
(这就是用户下载的东西)执行命令一行就够:
bash
./gradlew assembleRelease5.4 一个 iOS App 的完整构建流程
*.swift / *.m / Storyboard / xcassets
│
▼
┌─────────────────┐
│ Xcode Build │
│ ───────────── │
│ Swift → .o │
│ 链接 → 二进制 │
│ 打包 .app │
│ 签名 (证书+描述文件)│
└────────┬────────┘
│
▼
*.ipa
(上传 App Store / TestFlight)执行:
bash
xcodebuild -scheme MyApp -configuration Release archive5.5 各平台的「最终产物」长啥样
| 平台 | 产物后缀 | 本质 |
|---|---|---|
| Android | .apk / .aab | ZIP 压缩包,里面装着 dex + 资源 |
| iOS | .ipa | ZIP 压缩包,里面装 .app + 元数据 |
| macOS | .app / .dmg / .pkg | 目录形式或安装镜像 |
| Windows | .exe / .msi | PE 二进制 / 安装器 |
| Linux | .deb / .rpm / .AppImage / .flatpak | 各发行版包格式 |
| Web | dist/*.js + *.html + *.css | 静态资源 |
6. 跑通你人生第一个客户端 Demo
6.1 最快入门方案:Android + Kotlin + Compose
为什么推荐这条路?
- 工具链完全免费(Android Studio)
- 模拟器自带,电脑上就能跑
- Kotlin 语法现代,比 Java/OC/C++ 都友好
- Compose 是声明式,写法直观
4 步跑通
① 装 Android Studio (官网一键下载)
② File → New Project → 选 "Empty Compose Activity"
③ 写代码
④ 点绿色三角 ▶︎ RunHello World 长这样
kotlin
package com.example.hello
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Text
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Text("你好,客户端世界!")
}
}
}按 ▶︎ 运行后,模拟器会启动一个 App,屏幕中央出现你写的字。
📌 小白第一次成功跑出 Hello World 那一刻 —— 那种"屏幕上的东西真的是我写的"的成就感,往往是入行的火种。
6.2 想做 iOS?最快入门:Swift + SwiftUI
swift
import SwiftUI
struct ContentView: View {
var body: some View {
Text("你好,客户端世界!")
.font(.title)
.padding()
}
} ① 在 Mac 上装 Xcode (App Store 免费下载)
② File → New → Project → App → 语言 Swift / 界面 SwiftUI
③ 写代码
④ 选模拟器 → ⌘R 运行⚠️ 现实问题:iOS 开发必须有 Mac。预算有限的同学先学 Android。
6.3 想跨平台一把梭?最快入门:Flutter
dart
import 'package:flutter/material.dart';
void main() => runApp(MaterialApp(
home: Scaffold(
body: Center(child: Text('你好,客户端世界!')),
),
)); ① 装 Flutter SDK (官网下载)
② flutter create my_app
③ cd my_app && flutter run一行命令,同时编译 Android、iOS、Web、Windows、macOS、Linux 6 个平台。
6.4 想做桌面工具?最快入门:Tauri (Rust + 前端)
bash
npm create tauri-app@latest
cd my-app
npm install
npm run tauri dev弹出来一个原生窗口,里面跑着 Web 页面,逻辑用 Rust 写,最终打包出来的程序只有几 MB(Electron 版动辄 100MB+)。
7. 学习路径推荐
7.1 0 → 1 阶段(前 1 个月)
┌─────────────────────────────────────────────────┐
│ Week 1: 选定一个平台(推荐 Android) │
│ 学语言基础(Kotlin 1~7 章) │
├─────────────────────────────────────────────────┤
│ Week 2: 跑通 Hello World,熟悉 Android Studio │
│ 学 Compose 基本组件 │
├─────────────────────────────────────────────────┤
│ Week 3: 写一个 Todo App │
│ (列表、增删改查、本地存储) │
├─────────────────────────────────────────────────┤
│ Week 4: 接入网络请求 (Retrofit) │
│ 做一个"和风天气"或"豆瓣电影" │
└─────────────────────────────────────────────────┘7.2 1 → 10 阶段(接下来 3~6 个月)
┌─────────────────────────────────────────────────┐
│ ① 状态管理 (ViewModel + StateFlow) │
│ ② 协程并发 (Coroutines + Flow) │
│ ③ 依赖注入 (Hilt) │
│ ④ 持久化 (Room / DataStore) │
│ ⑤ 架构 (MVVM / MVI / Clean Architecture) │
│ ⑥ Gradle 构建优化 │
│ ⑦ 性能调优 (启动 / 内存 / 渲染) │
│ ⑧ 上架 / 灰度 / 监控 │
└─────────────────────────────────────────────────┘7.3 推荐资源
| 类型 | 推荐 |
|---|---|
| 官方文档 | developer.android.com / developer.apple.com / flutter.dev |
| 视频教程 | YouTube: Philipp Lackner / Stevdza-San / Sean Allen |
| 中文社区 | 掘金、稀土、Gityuan、玉刚说 |
| 开源 App 阅读 | NowInAndroid / Tivi / Pokedex(Android)/ Telegram-iOS(iOS) |
8. 章末小结:建立你的「客户端世界观」
★ 客户端开发核心知识图谱 ★
│
┌────────────────────────┼─────────────────────────┐
│ │ │
┌────▼────┐ ┌─────▼──────┐ ┌────▼────┐
│ 是什么 │ │ 怎么做 │ │ 怎么发 │
├─────────┤ ├────────────┤ ├─────────┤
│面向用户 │ │ UI/状态 │ │ 编译 │
│运行设备 │ │ 网络/存储 │ │ 打包 │
│多端形态 │ │ 并发/性能 │ │ 签名 │
│多套技术 │ │ 监控/上报 │ │ 上架 │
└─────────┘ └────────────┘ └─────────┘
关键能力 = 语言 + 框架 + 工具链 + 工程化记住 3 个最重要的"心智模型",第 1 章就毕业了:
- 客户端 = 直接面对用户的那一端,跟"前端 / 后端"是横向并列关系,不是上下级。
- 每个平台有母语,跨平台是"普通话" —— 母语最快,普通话最省人力。
- 客户端开发的本质永远是 7 件事:UI、状态、网络、存储、并发、发布、监控。
🎤 9. 章末面试题(10 道高频题)
Q1. 客户端开发跟前端开发是同一回事吗?
答:不是。
- 前端通常专指浏览器里跑的网页(HTML/CSS/JS);
- 客户端通常指装在用户设备上的 App(Android/iOS/桌面)。
- 两者都属于"面向用户"的那一端,所以共享很多概念(UI、状态、事件循环),但运行环境、打包方式、能调的系统能力差别巨大。
Q2. 为什么客户端开发要分这么多平台?不能统一吗?
答:商业 + 技术双重原因。
- 商业:Apple 自闭生态、Google 自有生态、微软自有生态,各家都希望开发者依附自己。
- 技术:硬件能力差异(手机/电脑/手表/车机)天然要求不同的设计;操作系统底层 API 完全不同。
- 缓解方案:跨平台框架(Flutter / RN / KMP)正在不断收敛差异,但短期内"完全统一"做不到。
Q3. 一个 App 从你点击图标到首页出现,中间发生了什么?
答(以 Android 为例):
- 用户点击 → 系统 Launcher 收到事件;
- 系统 fork 一个新进程,加载 App 的 dex;
- 实例化
Application→ 调用onCreate; - 启动主 Activity → 走
onCreate / onStart / onResume; - UI 框架测量、布局、绘制第一帧;
- 屏幕显示首页。
中间任何一步耗时 > 5s,会被 ANR(应用无响应)。优化首屏速度是客户端核心 KPI 之一。
Q4. 「编译」和「构建」有什么区别?
答:
- 编译:把源代码翻译成机器/字节码(一步动作)。
- 构建:从源码到最终产物的整个流程,包括编译、资源处理、打包、签名、混淆等。
- 类比:编译是"揉面",构建是"从买面粉到把面包送出门"的完整过程。
Q5. 为什么客户端要特别在意「主线程」?
答:因为 UI 渲染只能在主线程做。如果主线程被一个耗时操作(网络、读文件)卡住,每一帧画不出来 → 界面卡顿 → 用户体验崩盘。所有耗时操作必须扔到子线程,结果回到主线程更新 UI。这也是为什么协程 / async-await 在客户端这么重要。
Q6. 跨平台框架(Flutter / RN)跟原生开发到底差在哪?
答:
| 维度 | 原生 | 跨平台 |
|---|---|---|
| 性能 | 上限高 | 略损(一般用户感知不到) |
| 开发速度 | N 倍工作量 | 1 倍 |
| 调用系统能力 | 直接 | 需要桥接 / 插件 |
| 包体积 | 小 | 略大(带 runtime) |
| 适合场景 | 性能敏感、深度依赖系统 | 业务为主、迭代快 |
现实选择:纯业务 App 多用跨平台;游戏 / 相机 / 音视频 / IDE 多用原生。
Q7. APK / IPA / EXE 这些产物里到底装了什么?
答:
- APK:本质是 ZIP,里面装着
classes.dex(字节码)、res/(资源)、AndroidManifest.xml(声明)、签名信息。 - IPA:本质是 ZIP,里面装着
.app目录(含可执行二进制 + 资源 + Info.plist)和签名描述文件。 - EXE:PE 格式的二进制,直接被 Windows 加载执行;通常配合 DLL 和资源文件。
Q8. 「声明式 UI」和「命令式 UI」的本质区别是什么?
答:
- 命令式:你亲自下命令告诉框架"这个按钮变红、那个文字变成 'Hello'"。代码长、容易漏改、状态散落各处。
- 声明式:你只描述当前状态对应的 UI 长什么样,框架自己算出哪里要变。代码短、状态集中、易测试。
- 现代框架(Compose / SwiftUI / Flutter / React)全部走声明式,是行业大趋势。
Q9. 学客户端开发,要不要懂后端?
答:不需要精通,但必须懂得「跟后端怎么对话」。具体要会:
- HTTP / HTTPS 协议基础(请求方法、状态码、Header);
- JSON 序列化反序列化;
- 抓包工具(Charles / Proxyman / mitmproxy);
- 简单理解 RESTful / GraphQL / gRPC 的差异。
高级客户端工程师常常 「半个后端」 —— 因为 BFF(Backend for Frontend)模式越来越流行。
Q10. 0 基础学客户端开发,多久能写出能上线的 App?
答:
- 第 1 个月:跑通 Hello World、能写简单页面、理解列表/事件/导航;
- 第 3 个月:能独立写一个完整 Demo(网络 + 存储 + 多页面);
- 第 6 个月:写出能上架的小工具,开始关注架构 / 性能;
- 第 12 个月:能独立负责一个完整 App 的开发,拥有"工程化"思维;
- 第 24 个月:进阶到性能调优、自定义引擎、深入框架源码,达到中级工程师水位。
💡 关键提醒:客户端开发是「越做越值钱」的方向,前期投入大(要熟一套语言 + 一套框架 + 一套构建系统 + 一套发布流程),但一旦上手,能力可以横向迁移(Android 转 iOS 比想象中快,因为底层模型相通)。
🚀 下一步
这篇是全景调研,建立的是地图。接下来按你选定的方向深入:
┌──────────────────────────────────────────────────────────┐
│ 方向 A:Android 路线 → 看 ./kotlin/ + ./gradle/ 系列笔记 │
│ 方向 B:跨平台路线 → 看 ./kuikly/ 系列笔记 │
│ 方向 C:iOS 路线 → (待补充) │
│ 方向 D:桌面端路线 → (待补充) │
└──────────────────────────────────────────────────────────┘📌 建议:先把一个端打通到能上线的程度,再去看跨平台或第二个端。基础不牢,跨平台框架的"漏抽象"会让你寸步难行。