docs: 补充 Android 签名配置模板与完整 README

This commit is contained in:
SkyJourney
2026-05-14 12:55:55 +08:00
parent 61017f1c39
commit bb07828234
2 changed files with 137 additions and 11 deletions
+117 -11
View File
@@ -1,17 +1,123 @@
# sunny_mochi
# sunny_mochi — Flutter 企业级脚手架
A new Flutter project.
基于 Flutter 3.x 的企业级 APP 脚手架,开箱即用的基础设施底座。
## Getting Started
## 包含能力
This project is a starting point for a Flutter application.
| 模块 | 说明 |
|------|------|
| Flavor 三包 | dev / staging / prod 环境共存 |
| 加密数据库 | Drift + SQLCipher AES-256 |
| 网络层 | 7 拦截器 Dio(Token 刷新互斥、证书绑定、错误映射) |
| 崩溃日志 | 同步写文件 + 启动时弹窗上报 |
| 错误分类 | Sealed Failure 体系(Network / Auth / Server / Cache |
| 主题系统 | 5 套色板 + 深色模式 + Riverpod 持久化 |
| 开发者面板 | Talker UIInternal 包可见,Release 编译期关闭) |
| 认证骨架 | Clean Architecture:手机号 + 短信 / 密码双模式登录 |
| 本地错误日志 | 查看 + 一键上报 |
| i18n | Slang 4.xzh-CN 基准 + en 备用) |
A few resources to get you started if this is your first Flutter project:
---
- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter)
- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources)
## 克隆后首次设置
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
### 1. 安装依赖
```bash
flutter pub get
```
### 2. 代码生成
```bash
make gen # build_runner → .g.dart / .freezed.dart
make gen-i18n # slang → lib/i18n/strings.g.dart
```
### 3. 填入项目 API 路径
编辑 `lib/core/config/api_paths.dart`,将所有空字符串替换为实际路径。
### 4. 配置 Android 签名(发布版必须)
```bash
cp android/key.properties.template android/key.properties
# 编辑 key.properties,填入 keystore 路径和密码
```
### 5. 配置生产环境变量
```bash
cp dart-defines/prod.json.template dart-defines/prod.json
# 编辑 prod.json,填入 Sentry DSN、RSA 公钥等
```
### 6. iOS(首次或 Pod 变更后)
```bash
cd ios && pod install && cd ..
```
---
## 常用命令
```bash
make run-dev # 开发版调试运行
make run-staging # 测试版 Release 运行
make build-staging # 打测试包 APK
make build-prod # 打正式版 AAB(需先配置 prod.json + key.properties
make gen # 代码生成
make gen-i18n # i18n 生成
flutter analyze # 静态分析(目标 0 errors
flutter test # 单元测试
```
---
## 新项目初始化清单
- [ ] 替换包名 `com.example.sunny_mochi` → 项目包名(`android/app/build.gradle.kts` + `pubspec.yaml`
- [ ] 填入 API 路径(`lib/core/config/api_paths.dart`
- [ ] 配置 `android/key.properties`(从 `key.properties.template` 复制)
- [ ] 配置 `dart-defines/prod.json`(从 `prod.json.template` 复制)
- [ ] 替换 App 名称(`android/app/build.gradle.kts` `resValue``ios/Runner/Info.plist`
- [ ] 替换 App Icon`android/app/src/main/res/mipmap-*/``ios/Runner/Assets.xcassets/AppIcon.appiconset/`
- [ ] 实现 Tab 页面(替换 `lib/core/router/routes.dart` 中的 placeholder build
- [ ] 添加业务路由(`lib/core/router/routes.dart` 新增 `@TypedGoRoute`
- [ ] 配置 Sentry DSN`dart-defines/prod.json`
- [ ] 配置 RSA 公钥(`dart-defines/dev.json``staging.json``prod.json`
---
## 项目结构
```
lib/
├── main.dart # 6 步启动序列
├── app.dart # AppRoot → MaterialApp.router
├── i18n/ # Slang 翻译
├── core/
│ ├── config/ # Env / ApiConfig / ApiPaths(填入 API 路径)
│ ├── router/ # GoRouter + TypedRoutes(添加业务路由)
│ ├── network/ # Dio 7 拦截器 + MockAdapter
│ ├── storage/ # Drift + SQLCipher + SecureStorage
│ ├── crash/ # CrashReporter 生命周期
│ ├── error/ # Sealed Failure 分类
│ ├── theme/ # 5 色板 + 深色模式
│ ├── observability/ # Talker + Sentry
│ ├── sync/ # Offline-First 同步框架骨架
│ ├── crypto/ # RSA 加密
│ ├── extensions/ # BuildContext / String / num / DateTime
│ ├── utils/ # 验证器 / 密码强度 / SMS 倒计时
│ └── widgets/ # 通用 UI 组件库
└── features/
├── auth/ # 认证(完整 Clean Architecture,替换登录 UI 品牌)
├── dev_panel/ # Talker 调试面板(Internal 包)
└── error_report/ # 本地错误日志 + 上报
android/
├── app/build.gradle.kts # Flavor 三包 + SQLCipher + 签名配置
├── key.properties.template # 签名配置模板(复制为 key.properties 并填入密码)
└── keystore/ # 放置 .jks 文件(.gitignore 中,勿提交)
dart-defines/
├── dev.json # 开发环境变量(占位符,可提交)
├── staging.json # 测试环境变量(占位符,可提交)
├── prod.json.template # 生产环境变量模板
└── prod.json # 生产真实配置(.gitignore 中,勿提交)
```
+20
View File
@@ -0,0 +1,20 @@
# Android 签名配置
#
# 使用步骤:
# 1. 将此文件复制为 key.properties(与 build.gradle.kts 同级,即 android/ 目录)
# 2. 填入真实密钥信息
# 3. key.properties 已在 .gitignore 中,不会被提交(CI/CD 通过 secret 注入)
#
# 生成新 keystore(如果没有):
# keytool -genkey -v -keystore release.jks \
# -alias your-key-alias -keyalg RSA -keysize 2048 -validity 10000
#
# 注意:
# - storeFile 路径相对于 android/app/ 目录
# - 建议把 .jks 放在 android/keystore/(已在 .gitignore 中)
# - 妥善保管 keystore 文件,丢失后无法更新已发布 APP
storePassword=YOUR_KEYSTORE_PASSWORD
keyPassword=YOUR_KEY_PASSWORD
keyAlias=YOUR_KEY_ALIAS
storeFile=../keystore/release.jks