README.md

May 30, 2026 · View on GitHub

English

一款基于 Compose Multiplatform 的开源 Github 客户端 App,从同一份 Kotlin / Compose 代码同时跑通 Android / Desktop JVM (macOS + Windows + Linux) / iOS / macOS Native 共 5 端,提供更丰富的功能、更一致的跨端体验,旨在更好的日常管理和维护个人 Github,提供更好更方便的驾车体验~~Σ( ̄。 ̄ノ)ノ。本仓库 rootProject 为 GSYGithubAppCompose,并提供丰富的同款对比:

公众号掘金知乎CSDN简书
GSYTech点我点我点我点我

公众号

基于 Compose Multiplatform 1.10.3 + Kotlin 2.3.20 开发的跨端 App。
单一代码仓同时交付 Android / Desktop JVM (macOS + Windows + Linux) / iOS / macOS Native 5 端。

项目的目的是为方便个人日常维护和查阅 Github,同时适合 Compose Multiplatform 练手学习,
覆盖 KMP target、expect/actual、跨端导航、跨端 ViewModel/Lifecycle、Ktor 网络、Koin DI、
Coil 图片、Apollo GraphQL 等多种跨端框架的使用。

随着项目的使用情况和反馈,将时不时根据更新并完善用户体验与功能优化,欢迎提出问题。

Github Actions GitHub stars GitHub forks GitHub issues GitHub license

5 端一览(Compose Multiplatform Targets)

KMP Target入口模块关键标识
AndroidandroidTargetandroidAppapplicationId com.shuyu.gsygithubappcompose,minSdk 24,compileSdk 36
Desktop JVM (macOS + Windows + Linux)jvmdesktopAppmainClass com.shuyu.gsygithubappcompose.desktop.MainKt,targetFormats Exe / Msi / Dmg / Deb
iOS (真机)iosArm64iosAppXcodeGen + bundle id com.shuyu.gsygithubappcompose,deploymentTarget iOS 15.0
iOS (Simulator)iosSimulatorArm64iosApp同上,跑在 Apple Silicon Simulator
macOS NativemacosArm64composeShared framework + 宿主壳Apple Silicon 原生 framework

跨端共享代码集中在 composeSharedcoredatafeature 下的 commonMain;各端入口仅承担最小宿主职责。

编译运行流程

环境要求:

  • 项目使用 AGP 9.0.0,至少需要 Android Studio Otter (2025.1.1) Feature Drop 或更高版本才能正常编译运行。
  • Compose Multiplatform 1.10.3 + Kotlin 2.3.20,建议使用对应工具链的 IntelliJ IDEA 或 Android Studio。
  • iOS / macOS Native 端需要 macOS 主机,安装 Xcode 15+、xcodegenxcodebuild
  • Desktop JVM 打包 (Dmg / Msi / Deb) 由 Compose Desktop 提供,跨发行版需在对应宿主上执行。

重点:你需要在项目根目录下,配置 local.properties 文件(可参考 local.properties.sample),然后输入你申请的 Github client_id 和 client_secret。

ndk.dir="xxxxxxxx"
CLIENT_ID = "xxxxxx"
CLIENT_SECRET = "xxxxxx"

注册 Github APP 传送门 ,当然,前提是你现有一个 github 账号 (~ ̄▽ ̄)~ 。

Github API 需要使用安全登录(授权登录),那么在上述注册 Github App 的 Authorization callback URL 一栏必须填入

gsygithubapp://authed

5 端构建命令一览

# 1) Android(debug apk,安装到 [androidApp](file:///Users/guoshuyu/workspace/android/GSYGithubAppCMP/androidApp) 上)
./gradlew :androidApp:assembleDebug

# 2) Desktop JVM 直接 run(开发态:macOS / Windows / Linux 任一宿主)
./gradlew :desktopApp:run

# 3) Desktop JVM 平台原生安装包
./gradlew :desktopApp:packageDmg     # macOS  → .dmg
./gradlew :desktopApp:packageMsi     # Windows → .msi
./gradlew :desktopApp:packageDeb     # Linux   → .deb

# 4) iOS:用 XcodeGen 生成工程,再用 xcodebuild 构建(在 [iosApp](file:///Users/guoshuyu/workspace/android/GSYGithubAppCMP/iosApp) 目录下)
cd iosApp && xcodegen generate
xcodebuild -project iosApp.xcodeproj -scheme iosApp -configuration Debug \
  -destination 'generic/platform=iOS Simulator' build

# 5) Compose Multiplatform Framework 产物(供 iOS / macOS 宿主壳链接)
./gradlew :composeShared:linkDebugFrameworkIosSimulatorArm64
./gradlew :composeShared:linkDebugFrameworkMacosArm64

更详细的开发者上手步骤见 QUICK_START.md

项目结构图

KeyFeatures

Core Technologies

Layer Structure

Technology Stack

Data Flow Architecture

整体架构图

┌─────────────────────────────────────────────────────────────────────────┐
│                          GSYGithubAppCompose                            │
│              (Compose Multiplatform + KMP + MVVM + Koin)                │
└─────────────────────────────────────────────────────────────────────────┘

        ┌──────────────┬────────────┼────────────┬──────────────┐
        │              │            │            │              │
   ┌────▼───┐    ┌─────▼────┐  ┌────▼───┐  ┌────▼───┐    ┌─────▼─────┐
   │androidApp│  │desktopApp│  │ iosApp │  │macosApp│    │ Web 预留   │
   │(android  │  │  (jvm)   │  │(iosArm/│  │(macos  │    │ (规划中)   │
   │ Target)  │  │          │  │ iosSim)│  │ Arm64) │    │            │
   └────┬─────┘  └────┬─────┘  └────┬───┘  └────┬───┘    └────────────┘
        │             │             │           │
        └─────────────┴──────┬──────┴───────────┘

                ┌────────────▼────────────┐
                │      composeShared      │
                │ (跨端 UI / 入口聚合)     │
                └────────────┬────────────┘

        ┌────────────────────┼────────────────────┐
        │                    │                    │
 ┌──────▼──────┐    ┌────────▼────────┐    ┌─────▼──────┐
 │  feature/*  │    │      data       │    │   core/*   │
 │ (13 modules)│    │ Repository 层   │    │ network/db │
 └─────────────┘    └─────────────────┘    │ common/ui  │
                                           └────────────┘

模块依赖关系图

                ┌────────────┐ ┌────────────┐ ┌────────┐ ┌─────────┐
                │ androidApp │ │ desktopApp │ │ iosApp │ │macosHost│
                └─────┬──────┘ └─────┬──────┘ └────┬───┘ └────┬────┘
                      │              │             │          │
                      └──────┬───────┴─────────────┴──────────┘

                       ┌─────▼─────┐
                       │composeShared│
                       └─────┬─────┘

        ┌────────────────────┼────────────────────────┐
        │                    │                        │
 ┌──────▼──────┐      ┌──────▼──────┐         ┌──────▼──────┐
 │  feature/*  │      │    data     │         │   core/ui   │
 │             │      │             │         │             │
 │ 所有功能模块 │◄─────┤ Repository  │         │ 通用 UI 组件 │
 │             │      │             │         │             │
 └──────┬──────┘      └──────┬──────┘         └──────┬──────┘
        │                    │                       │
        │            ┌───────┼────────┐              │
        │            │       │        │              │
        └────────────┼───────┼────────┼──────────────┘
                     │       │        │
         ┌───────────▼─┐  ┌──▼────────▼──┐  ┌──────────────┐
         │core/network │  │core/database │  │ core/common  │
         │             │  │              │  │              │
         │ Ktor 3.1.0  │  │   Room KMP   │  │ DataStore    │
         │ Apollo      │  │   Entity/DAO │  │  Token       │
         │ Models      │  │              │  │  Resources   │
         └─────────────┘  └──────────────┘  └──────────────┘

依赖规则:
  androidApp / desktopApp / iosApp / macosHost → composeShared
  composeShared → feature/*, core/ui, data
  feature/*    → data, core/ui, core/common
  data         → core/network, core/database, core/common
  core/ui      → core/common
  core/network → (独立模块)
  core/database→ (独立模块)
  core/common  → (独立模块)

模块详细结构

GSYGithubAppCompose/

├── androidApp/                             # Android 入口宿主(applicationId com.shuyu.gsygithubappcompose)
│   ├── MainActivity.kt                     # 主入口,挂载 composeShared
│   ├── GSYApplication.kt                   # Application,Koin 启动
│   └── di/AppModule.kt                     # Android 端专属 module

├── desktopApp/                             # Desktop JVM 入口(mainClass com.shuyu.gsygithubappcompose.desktop.MainKt)
│   ├── Main.kt                             # singleWindowApplication 入口
│   ├── language/JvmLanguageDataStore.kt    # JVM 端 DataStore 适配
│   ├── session/DesktopUserSession.kt       # 桌面会话
│   └── diagnostics/StartRouteDiagnostics.kt# 启动路由诊断

├── iosApp/                                 # iOS 入口宿主(XcodeGen + Swift 壳)
│   ├── project.yml                         # XcodeGen 工程描述
│   ├── iosApp/iOSApp.swift                 # SwiftUI App 入口
│   ├── iosApp/ContentView.swift            # 调用 composeShared 的 MainViewController
│   └── iosApp/Assets.xcassets/             # AppIcon / launch_image(与 Android 同源)

├── composeShared/                          # 跨端 UI 聚合 + iOS 入口胶水
│   └── src/iosMain/kotlin/.../MainViewController.kt

├── core/                                   # 核心基础模块(commonMain 优先)
│   │
│   ├── network/                            # 网络层(Ktor 3.1.0 + Apollo GraphQL)
│   │   ├── api/GitHubApiService.kt         # GitHub REST API 接口(commonMain)
│   │   ├── graphql/                        # Apollo schema + queries
│   │   └── di/NetworkModule.kt             # Koin 4.2.1 module
│   │
│   ├── database/                           # 数据库层(Room KMP)
│   │   ├── entity/                         # Entity(commonMain)
│   │   ├── dao/                            # DAO
│   │   └── AppDatabase.kt
│   │
│   ├── common/                             # 公共资源 / DataStore / 多语言
│   │   ├── composeResources/               # Compose Multiplatform 资源(drawable / files / values)
│   │   │   ├── drawable/ic_launcher.png    # 5 端共享 AppIcon 源
│   │   │   ├── drawable/launch_image.png   # 5 端共享 LaunchScreen 源
│   │   │   └── files/launcher_lottie.json
│   │   └── androidMain/res/                # Android 端 mipmap 资源(与 commonMain 同源)
│   │
│   └── ui/                                 # UI 组件 / 主题 / 导航
│       ├── components/                     # GSYPullRefresh / GSYTopAppBar 等
│       ├── theme/                          # Material 3
│       └── navigation/                     # 基于 jetbrains-navigation-compose 2.9.1

├── data/                                   # 数据层(Repository + expect/actual Dispatcher)
│   ├── commonMain/.../repository/          # 跨端 Repository 实现
│   ├── androidMain/.../Dispatchers.android.kt
│   ├── jvmMain/.../Dispatchers.jvm.kt
│   ├── iosMain/.../Dispatchers.ios.kt
│   └── macosMain/.../Dispatchers.macos.kt

└── feature/                                # 13 个 feature 模块(全部 commonMain)
    ├── welcome/                            # 欢迎页
    ├── login/                              # OAuth 登录
    ├── home/                               # 主页(底部导航)
    ├── dynamic/                            # 动态(事件流)
    ├── trending/                           # 趋势
    ├── profile/                            # 个人中心
    ├── search/                             # 搜索
    ├── detail/                             # 仓库详情
    ├── code/                               # 代码浏览
    ├── issue/                              # Issue 管理
    ├── push/                               # 推送管理
    ├── list/                               # 列表
    ├── notification/                       # 通知
    ├── info/                               # 信息
    └── history/                            # 浏览历史

各模块对应的 build 脚本入口:androidApp/build.gradle.ktsdesktopApp/build.gradle.ktscomposeShared/build.gradle.ktsiosApp/project.yml;版本目录见 gradle/libs.versions.toml

技术架构图

┌─────────────────────────────────────────────────────────────────────┐
│                         技术栈 (Tech Stack)                          │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  跨端框架              Compose Multiplatform 1.10.3                  │
│                        Kotlin 2.3.20 + AGP 9.0.0                    │
│                        KMP targets: androidTarget / jvm /            │
│                        iosArm64 / iosSimulatorArm64 / macosArm64    │
│  ├─────────────────────────────────────────────────────────────┤   │
│                                                                     │
│  UI 层                 Compose Multiplatform + Material 3            │
│                        jetbrains-navigation-compose 2.9.1            │
│                        jetbrains-lifecycle 2.10.0                    │
│                        Coil 2.7.0(图片加载)                        │
│                        Lottie(复杂动画)                            │
│  ├─────────────────────────────────────────────────────────────┤   │
│                                                                     │
│  状态管理              StateFlow + ViewModel(KMP)                    │
│                        Kotlin Coroutines + Flow                     │
│  ├─────────────────────────────────────────────────────────────┤   │
│                                                                     │
│  依赖注入              Koin 4.2.1(跨 5 端统一)                     │
│  ├─────────────────────────────────────────────────────────────┤   │
│                                                                     │
│  网络层                Ktor 3.1.0(commonMain)                      │
│                        Apollo GraphQL                                │
│                        Kotlinx Serialization                         │
│  ├─────────────────────────────────────────────────────────────┤   │
│                                                                     │
│  数据库层              Room KMP                                      │
│                        DataStore(替代 SharedPreferences)          │
│  ├─────────────────────────────────────────────────────────────┤   │
│                                                                     │
│  架构模式              MVVM + Repository Pattern                     │
│                        Clean Architecture                           │
│                        Unidirectional Data Flow                     │
│                        expect / actual 平台分发                      │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

数据流向图

┌──────────────┐        ┌──────────────┐        ┌──────────────┐
│              │        │              │        │              │
│   Screen     │◄───────┤  ViewModel   │◄───────┤  Repository  │
│  (Compose MP)│ State  │   (KMP)      │  Flow  │  (commonMain)│
│              │        │              │        │              │
└──────┬───────┘        └──────┬───────┘        └──────┬───────┘
       │                       │                       │
       │ User Action           │ Business Logic        │ Data Source
       │                       │                       │
       ▼                       ▼                       ▼
┌──────────────┐        ┌──────────────┐        ┌──────────────┐
│              │        │              │        │              │
│   onClick    │───────►│  loadData()  │───────►│ Ktor 3.1.0 / │
│   onRefresh  │ Event  │  refresh()   │ Call   │  Room KMP    │
│              │        │              │        │              │
└──────────────┘        └──────────────┘        └──────────────┘

数据流:
1. 用户操作触发 UI 事件(5 端同一份 Composable)
2. ViewModel 处理业务逻辑(KMP commonMain)
3. Repository 协调数据源(网络 Ktor / 数据库 Room KMP)
4. 数据通过 Flow 返回到 ViewModel
5. ViewModel 更新 UiState
6. UI 自动重组显示新状态(Android / Desktop / iOS / macOS 一致)

分层职责

层级模块职责主要技术
表现层feature/UI 渲染、用户交互、状态展示Compose Multiplatform、jetbrains-navigation-compose 2.9.1
业务层data (ViewModel)业务逻辑、状态管理、数据编排StateFlow、Coroutines、jetbrains-lifecycle 2.10.0
数据层data (Repository)数据访问、缓存策略、数据映射Repository Pattern、expect/actual
网络层core/networkAPI 调用、网络请求、数据模型Ktor 3.1.0、Apollo GraphQL
存储层core/database本地缓存、数据持久化Room KMP、DataStore
基础层core/common / core/ui公共工具、UI 组件、资源composeResources、Koin 4.2.1、Coil 2.7.0

真机回归测试(Manual Test Playbooks)

跨 Android / iOS / macOS-Desktop / Windows-Desktop / Linux-Desktop 多端的可 copy-run 手动回归剧本:

平台入口工具栈
Android (uiautomator)testing/uiautomator/playbook.mdadb + input swipe x y x y 80 + screencap
iOS Simulatortesting/ios/playbook.mdxcrun simctl + idb ui tap + pasteboard
macOS Desktop (DMG)testing/macos-desktop/playbook.mdcliclick + osascript + screencapture

E2E 双轨脚本(13 路由全 PASS):

13 路由覆盖:welcome / login / home / dynamic / profile / trending / search / repodetail / code / issue / push / notification / history / info,双轨截图 + log 全 PASS,产物分别落在 tools/screenshots/iostools/screenshots/macostools/logs/iostools/logs/macos

iOS 端的 AppIcon 与 LaunchScreen 已与 Android 同源(统一来自 core/commonic_launcher / launch_image),见 iosApp/iosApp/Assets.xcassets/AppIcon.appiconsetiosApp/iosApp/Assets.xcassets/launch_image.imageset

先看哪一份:跨平台差异速查表 → testing/PLATFORM_DIFF.md

每条 P-XX 剧本(P-00 Cold Boot / P-01 Login / P-02 Dynamic / P-03 RepoDetail / P-04 PushDetail / P-05 Trending / P-06 Profile / P-08 Notification)在三套 playbook 中结构与验证点完全一致,只是工具命令不同。每个平台的设备 / 窗口元数据见各自 device.md,每个屏幕的元素中心坐标见各自 screen_map.md。

⚠️ "本文档比 README 更重要" —— 改 UI 后第一件事是 update screen_map,其次才是回归。

下载

Apk下载链接: Apk下载链接

桌面端 Dmg / Msi / Deb 与 iOS ipa 暂随 Release 滚动发布;如未发布,请按上文 5 端构建命令本地产出。

示例图片(截图并非完全对应)

感谢

https://deepwiki.com/CarGuo/GSYGithubAppCompose

LICENSE

CarGuo/GSYGithubAppCMP is licensed under the
Apache License 2.0

A permissive license whose main conditions require preservation of copyright and license notices.
Contributors provide an express grant of patent rights.
Licensed works, modifications, and larger works may be distributed under different terms and without source code.