diff --git a/README.md b/README.md index 2363b12..a2778ce 100644 --- a/README.md +++ b/README.md @@ -71,42 +71,45 @@ flutter pub get ```bash adb devices adb reverse tcp:8081 tcp:8081 -flutter run -d \ - --dart-define=API_BASE_URL=http://127.0.0.1:8081 +flutter run -d ``` `adb reverse` 将手机的 `127.0.0.1:8081` 转发到电脑;USB 断开或重新连接后需要 -重新执行。 +重新执行。此时用调试条把地址改成 `http://127.0.0.1:8081`(见下节)。 -Android 模拟器访问宿主机时使用: - -```bash -flutter run --dart-define=API_BASE_URL=http://10.0.2.2:8081 -``` +Android 模拟器访问宿主机时,同样在调试条里填 `http://10.0.2.2:8081`。 ### iOS 手机与 Mac 需在同一网络,首次启动允许“本地网络”权限: ```bash -flutter run -d \ - --dart-define=API_BASE_URL=http://:8081 +flutter run -d ``` -### Debug 运行时地址 +### 服务地址配置 -debug 包在找剧页加载失败时会显示调试条,点其中的「修改服务器地址」可直接改成 -当前电脑 IP,保存后立即重载,不用重新打包。地址优先级: +地址是代码里的一个开关,**不做任何网络探测**,也不用传构建参数。两套环境各占 +一个文件: -```text -本地运行时设置 > --dart-define(API_BASE_URL) > AppConfig.defaultBaseUrl +| 文件 | 用途 | 默认值 | +| --- | --- | --- | +| `lib/core/config/dev_config.dart` | 开发 / 联调 | `http://192.168.31.243:8081` | +| `lib/core/config/prod_config.dart` | 生产 | `http://39.162.50.99:8081` | + +切换环境只改 `lib/core/config/app_config.dart` 里的一个布尔值: + +```dart +static const bool useDevConfig = true; // false 即用生产地址 ``` -`devHostBaseUrl` 默认写死为 `http://192.168.31.243:8081` -(`lib/core/config/app_config.dart`)。debug 包启动时按 -「环回 `127.0.0.1` → `devHostBaseUrl` → 公网」顺序探测可用地址;release 包不探测, -固定使用公网地址。换 Wi-Fi、路由器换网段后 `devHostBaseUrl` 会失效,此时要么传 -`--dart-define`,要么改这个常量。release 包不显示地址入口,也不读取本地覆盖。 +换 Wi-Fi 或换网段时只改 `dev_config.dart` 的 `baseUrl`。打生产包前把 +`useDevConfig` 改成 `false`;release 构建若仍为 `true` 会在启动时直接报错, +避免线上包连到开发机。 + +debug 包在找剧页加载失败时会显示调试条,点「修改服务器地址」可临时改成当前 +电脑 IP,保存后立即重载、不需要重新打包,该覆盖保存在本地偏好里(仅 debug +生效,release 不读取)。 ## 画中画 @@ -151,30 +154,26 @@ xcodebuild -resolvePackageDependencies \ ```bash adb uninstall com.stormg.lumadrama -flutter run -d \ - --dart-define=API_BASE_URL=http://127.0.0.1:8081 +flutter run -d ``` ## 生产打包(Android) -生产包只包含以下两个 ABI,**打成一个 APK**,不做 split: +两个渠道出两种产物,源码同一套: -| ABI | 适用设备 | -| --- | --- | -| `arm64-v8a` | 现代手机(64 位) | -| `armeabi-v7a` | 老 32 位机 | - -```bash -flutter build apk --release --target-platform android-arm64,android-arm -# 产出单个:build/app/outputs/flutter-apk/app-release.apk(约 37MB) -``` +| 渠道 | 产物 | 命令 | 体积 | +| --- | --- | --- | --- | +| Google Play | AAB(按设备下发) | `flutter build appbundle --release` | 上传 28MB,用户下载约 8MB | +| 国内各大市场 | 通用 APK(arm64 + v7) | `flutter build apk --release` | 约 13MB | 说明: - `android/app/build.gradle.kts` 的 `release` 已配置 `abiFilters`,只保留 `arm64-v8a` 与 `armeabi-v7a`,插件也不会再带入 `x86_64` 原生库。 -- `x86_64` 只用于模拟器,不进入生产包。 -- 不要直接运行 `flutter build apk --release`:默认会编译三套原生库,包体约 57MB。 -- 只有需要进一步压缩单机下载体积时,才考虑 `--split-per-abi` 出分架构包(arm64 约 21MB、armv7 约 19MB),默认不用。 +- `android/gradle.properties` 里固定了 `split-debug-info=build/symbols` 与 `dart-obfuscation=true`,**IDE 里点 Build APK / Build App Bundle 也会生效**:`libapp.so` 从 ~8MB/ABI 降到 ~1.1MB/ABI。 +- `useLegacyPackaging = true`:原生库以压缩形式存储,这是国内 APK 从 40MB 降到 13MB 的主要原因;代价是安装时解压。 +- **每次发版都要归档 `build/symbols`**,线上崩溃栈需要它还原。 +- release 仍在用 debug 签名(`build.gradle.kts` 的 TODO),上架前必须换成正式 keystore。 +- 不要用 `--split-per-abi`:与 `abiFilters` 冲突;Play 的 AAB 已经按设备拆好。 ## 生产打包(iOS)