Skip to content

客户端开发:从 0 到 1 的调研笔记

本文目的:写给「只听过『写代码』,但没真正搞明白客户端到底是个啥」的小白。读完你能:

  1. 说清楚「客户端开发」与「前端 / 后端」到底是什么关系;
  2. 能列出移动端、桌面端、跨平台 3 大流派各自的语言、框架、工具链;
  3. 知道一个客户端 App 是怎么从一行代码变成手机里的图标、电脑桌面上的程序;
  4. 知道接下来该按什么路径学下去,不会一上来就被「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 / DartApp 图标
桌面客户端电脑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 母语清单

平台母语(推荐)母语(旧的,但还活着)备注
AndroidKotlinJavaGoogle 钦定 Kotlin First
iOS / macOSSwiftObjective-CApple 钦定 Swift
WindowsC#C++ / VB.NET.NET 生态完善
Linux 桌面C / C++ / RustPython (脚本)没有"官方"指定,看 DE
HarmonyOSArkTS(Java 兼容层)鸿蒙特有

2.2 普通话清单(跨平台)

框架用的语言渲染方式一句话总结
FlutterDart自绘(Skia/Impeller)Google 出品,画得快、像素级一致
React NativeTypeScript / JS桥接系统原生组件Meta 出品,前端友好
Kotlin Multiplatform (KMP)Kotlin各端用各自 UI业务逻辑共享,UI 仍原生
Compose MultiplatformKotlin自绘(Skia)KMP 的 UI 解决方案,跟 Jetpack Compose 同源
TauriRust + Web系统 WebView + Rust 后端比 Electron 小 100 倍
ElectronTypeScript / JS内嵌 Chromium能跑就行,资源吃得多(VSCode / Discord 都用它)
MAUIC# (.NET)各端原生微软的跨平台答卷
KuiklyKotlin (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 ComposeAndroidKotlin声明式Google 推荐,写法简洁
Android View 体系AndroidKotlin/Java + XML命令式老但还在维护
SwiftUIiOSSwift声明式Apple 推荐,必学
UIKitiOSSwift / OC命令式老但功能完整,存量多
Flutter跨平台Dart声明式稳定,国内大厂在用
React Native跨平台TypeScript声明式前端转客户端的首选
KMP + Compose Multiplatform跨平台Kotlin声明式增长最快,值得押注
HarmonyOS ArkUI鸿蒙ArkTS声明式国内必学

📌 「声明式」vs「命令式」生活化类比

  • 命令式:你跟厨师说 「开火 → 倒油 → 放葱花 → 放鸡蛋 → 翻炒 → 加盐 → 出锅」,每一步都要你下命令。
  • 声明式:你跟厨师说 「我要一盘葱花炒蛋」,怎么炒厨师自己决定,你只管描述结果。
  • 趋势:所有现代 UI 框架(Compose / SwiftUI / Flutter / React)全部转向声明式 —— 写得少、bug 少、可读性高。

3.2 桌面端框架对比

框架平台语言特点
WinUI 3 / WPFWindowsC#微软原生,企业内部很常用
AppKit / SwiftUI for MacmacOSSwiftmacOS 原生,最优体验
Qt全平台C++ / Python (PyQt)老牌跨平台,CAD/工业软件常用
GTKLinux 主C / Rust / PythonGNOME 桌面常用
Electron全平台TypeScriptVSCode、Discord、Slack 都用它
Tauri全平台Rust + WebElectron 的 Rust 改良版
MAUI全平台C#微软新一代跨平台方案
Compose Multiplatform全平台KotlinJetBrains 的桌面方案

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 顶部那个小红点显示的『未读消息数』」。它什么时候出现?怎么变化?被谁改的?怎么保证多个页面看到的数字一致?

主流方案:

平台方案
AndroidViewModel + StateFlow / LiveData
iOS@State + @Observable (SwiftUI)
FlutterProvider / Riverpod / Bloc
React NativeRedux / Zustand / Recoil

4.3 网络请求:怎么跟后端"对暗号"

   客户端                                    服务器
      │                                        │
      │  POST /api/login  {user, pwd}          │
      │ ──────────────────────────────────►    │
      │                                        │
      │           {token: "xxx", uid: 123}     │
      │ ◄──────────────────────────────────    │
      │                                        │
      │  GET /api/timeline  Authorization: ... │
      │ ──────────────────────────────────►    │
      │                                        │
      │           [{id:1, ...}, {id:2, ...}]   │
      │ ◄──────────────────────────────────    │

常用库:

平台HTTP 库JSON 库
AndroidOkHttp / RetrofitMoshi / kotlinx.serialization
iOSURLSession / AlamofireCodable
FlutterDio / httpjson_serializable

4.4 本地存储:数据放哪儿?

   ┌─────────────────────────────────────────────────┐
   │  小数据  (Key-Value):  SharedPreferences/UserDefaults│
   │           例:登录 token、用户偏好                  │
   ├─────────────────────────────────────────────────┤
   │  关系型: SQLite (Room / GRDB / Drift)             │
   │           例:聊天记录、订单列表                     │
   ├─────────────────────────────────────────────────┤
   │  键值数据库:  MMKV / LevelDB                       │
   │           例:高频读写的小数据                       │
   ├─────────────────────────────────────────────────┤
   │  文件:    沙盒目录 (Documents / Cache)             │
   │           例:图片、下载的安装包                     │
   └─────────────────────────────────────────────────┘

4.5 并发:「主线程不能卡」铁律

生活化类比:主线程 = 餐厅里唯一的服务员。所有点单、上菜、收钱都得他来。如果他停下来「拧瓶盖拧 5 秒」,整个餐厅就卡了 5 秒

所以耗时操作(网络、读文件、解码图片)必须扔到子线程。各端的方案:

平台方案
AndroidKotlin Coroutines + Dispatchers.IO
iOSSwift Concurrency (async/await) / GCD
FlutterFuture + async/await / Isolate
Webasync/await + Web Worker

4.6 发布与上架:写完代码 ≠ 用户能下载

       开发完成


       打包 (APK / IPA / EXE / DMG)


       签名 (证书校验,证明是你写的)


       上传应用商店 / 分发渠道


       审核 (iOS 严,Android 松,HarmonyOS 看心情)


       灰度发布 (先放给 1% 用户)


       全量发布

4.7 监控与稳定性:上线后才是真正的开始

   常见监控指标:
   ┌─────────────────────────────────────────┐
   │  Crash 率:千分之几崩溃了               │
   │  ANR:界面无响应                         │
   │  启动时长:冷启动 / 热启动               │
   │  内存峰值 / 帧率                         │
   │  网络成功率 / 接口耗时                    │
   └─────────────────────────────────────────┘

   常用平台:
   Firebase Crashlytics / Sentry / 友盟 / Bugly / DataDog

5. 构建与编译:源代码是怎么变成 App 的?

5.1 「构建」与「编译」的区别

很多人混着用,其实两个概念:

       编译 (Compile)       :  把源代码 → 可执行的机器/字节码
       构建 (Build)         :  从源码到最终发布产物的"全过程"
                              (含 编译 + 打包 + 签名 + 资源压缩 + ...)

📌 生活化类比

  • 编译 = 「把面粉揉成面团」
  • 构建 = 「从买面粉、揉面、发酵、烤、装盒、贴标签到送出门」的整个流程

5.2 各端的构建系统

平台构建系统入口文件配套包管理
AndroidGradlebuild.gradle.ktsMaven Central / Google Maven
iOS / macOSXcode Build System + Swift Package Manager / CocoaPodsPackage.swift / PodfileSPM / CocoaPods
Windows (.NET)MSBuild*.csprojNuGet
FlutterFlutter CLI (内部封装 Gradle + Xcode)pubspec.yamlpub.dev
WebVite / Webpack / esbuildpackage.jsonnpm / pnpm / yarn
Rust 桌面 (Tauri)Cargo + Tauri CLICargo.toml + tauri.conf.jsoncrates.io
跨大型项目BazelBUILD自管

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 assembleRelease

5.4 一个 iOS App 的完整构建流程

   *.swift / *.m / Storyboard / xcassets


       ┌─────────────────┐
       │   Xcode Build   │
       │  ─────────────  │
       │  Swift → .o     │
       │  链接 → 二进制    │
       │  打包 .app       │
       │  签名 (证书+描述文件)│
       └────────┬────────┘


            *.ipa
       (上传 App Store / TestFlight)

执行:

bash
xcodebuild -scheme MyApp -configuration Release archive

5.5 各平台的「最终产物」长啥样

平台产物后缀本质
Android.apk / .aabZIP 压缩包,里面装着 dex + 资源
iOS.ipaZIP 压缩包,里面装 .app + 元数据
macOS.app / .dmg / .pkg目录形式或安装镜像
Windows.exe / .msiPE 二进制 / 安装器
Linux.deb / .rpm / .AppImage / .flatpak各发行版包格式
Webdist/*.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"
   ③ 写代码
   ④ 点绿色三角 ▶︎ Run

Hello 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 章就毕业了:

  1. 客户端 = 直接面对用户的那一端,跟"前端 / 后端"是横向并列关系,不是上下级。
  2. 每个平台有母语,跨平台是"普通话" —— 母语最快,普通话最省人力。
  3. 客户端开发的本质永远是 7 件事:UI、状态、网络、存储、并发、发布、监控。

🎤 9. 章末面试题(10 道高频题)

Q1. 客户端开发跟前端开发是同一回事吗?

:不是。

  • 前端通常专指浏览器里跑的网页(HTML/CSS/JS);
  • 客户端通常指装在用户设备上的 App(Android/iOS/桌面)。
  • 两者都属于"面向用户"的那一端,所以共享很多概念(UI、状态、事件循环),但运行环境、打包方式、能调的系统能力差别巨大

Q2. 为什么客户端开发要分这么多平台?不能统一吗?

:商业 + 技术双重原因。

  • 商业:Apple 自闭生态、Google 自有生态、微软自有生态,各家都希望开发者依附自己。
  • 技术:硬件能力差异(手机/电脑/手表/车机)天然要求不同的设计;操作系统底层 API 完全不同。
  • 缓解方案:跨平台框架(Flutter / RN / KMP)正在不断收敛差异,但短期内"完全统一"做不到。

Q3. 一个 App 从你点击图标到首页出现,中间发生了什么?

(以 Android 为例):

  1. 用户点击 → 系统 Launcher 收到事件;
  2. 系统 fork 一个新进程,加载 App 的 dex;
  3. 实例化 Application → 调用 onCreate
  4. 启动主 Activity → 走 onCreate / onStart / onResume
  5. UI 框架测量、布局、绘制第一帧;
  6. 屏幕显示首页。

中间任何一步耗时 > 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. 学客户端开发,要不要懂后端?

不需要精通,但必须懂得「跟后端怎么对话」。具体要会:

  1. HTTP / HTTPS 协议基础(请求方法、状态码、Header);
  2. JSON 序列化反序列化;
  3. 抓包工具(Charles / Proxyman / mitmproxy);
  4. 简单理解 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:桌面端路线    → (待补充)                          │
   └──────────────────────────────────────────────────────────┘

📌 建议先把一个端打通到能上线的程度,再去看跨平台或第二个端。基础不牢,跨平台框架的"漏抽象"会让你寸步难行。