解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# 新生命移动测试台(Mobile)
一个示例,四个项目:系统信息 + 21 个兼容性冒烟用例 + XTrace 日志。Android/iOS 桌面显示名为“新生命测试台”,桌面图标使用新生命四叶草,首页标题为“新生命移动测试台”。所有项目输出统一到仓库根目录 `Bin\Mobile.*`。
| 项目 | 用途 |
|---|---|
| `Mobile.Core` | `MachineInfoReport`(系统信息)与 21 个冒烟用例、`SmokeRunner` |
| `Mobile.Stardust.Core` | 可选星尘接入:`NewLife.Stardust` + `MobileAgent`,设备信息复用 `MachineInfo` |
| `Mobile.Console` | 桌面宿主:默认系统信息,`--smoke` / `--all` 跑冒烟 |
| `Mobile.Android` | 原生 Activity 控制台:系统信息 / 运行冒烟 / 连接星尘(可选) / 复制 / 清空 |
| `Mobile.iOS` | 原生 UIViewController:系统信息 / 运行冒烟 / 连接星尘(可选),CI 产出 `smoke.json` |
> 仓库根目录的 `AotSmoke` 是 Windows/Linux 的 NativeAOT 冒烟,不属于移动端示例。
## 桌面
```powershell
dotnet run --project Samples/Mobile.Console -c Release
dotnet run --project Samples/Mobile.Console -c Release -- --smoke
dotnet run --project Samples/Mobile.Console -c Release -- --all
```
输出目录:`Bin\Mobile.Console`。
## Android
1. 安装工具链(首次):
```powershell
pwsh Samples/Mobile.Android/setup-android.ps1
```
2. 连接手机并确认设备在线:
```powershell
adb devices
```
3. 构建、安装、启动并抓取系统信息:
```powershell
pwsh Samples/Mobile.Android/run-android.ps1
```
4. 跑冒烟测试(自动触发,不依赖 UI 点击):
```powershell
pwsh Samples/Mobile.Android/run-android.ps1 -Smoke
```
多台设备用 `-Device <serial>`;已有 APK 时可加 `-SkipBuild`。
日志与报告:
- logcat 标签:`Mobile`
- 屏幕:可滚动、可长按选择、可复制
- 应用外部目录:
```text
/storage/emulated/0/Android/data/com.newlife.mobile/files/Log/report.txt
/storage/emulated/0/Android/data/com.newlife.mobile/files/Log/smoke.txt
/storage/emulated/0/Android/data/com.newlife.mobile/files/Log/YYYY_MM_DD.log
```
- 脚本日志:`Bin\Mobile.Android\artifacts\android-*.log`
## 打包 APK
```powershell
pwsh Samples/Mobile.Android/pack-android.ps1 -Mode Aot
pwsh Samples/Mobile.Android/pack-android.ps1 -Mode Jit
pwsh Samples/Mobile.Android/pack-android.ps1 -Mode NativeAot # 实验性
```
产物统一在:
```text
Bin\Mobile.Android\apk\Mobile-Aot.apk
Bin\Mobile.Android\apk\Mobile-Jit.apk
Bin\Mobile.Android\apk\Mobile-NativeAot.apk
```
| 模式 | 运行时 | 实测大小 | 说明 |
|---|---|---:|---|
| `Jit` | Mono JIT | 9.40 MB | 构建最快,调试最方便;启动/JIT 开销较大 |
| `Aot` | Mono AOT(normal + profiled) | 12.47 MB | 默认交付;启动更快,Release 默认开启 |
| `NativeAot` | NativeAOT | 15.40 MB | 已实测可构建(实验性);需 Android NDK 26.3,`pack-android.ps1` 自动定位 clang/LLVM;API 36 x86_64 模拟器冒烟 21/21 通过,未在真机验证 |
> NativeAOT 模式需要 Android NDK:先执行 `sdkmanager "ndk;26.3.11579264"`;`pack-android.ps1` 会自动定位 NDK 并把 clang/LLVM 加入 PATH。
- APK 同时包含 `arm64-v8a` 和 `x86_64`,可安装到真机和模拟器。
- `-Signed.apk` 使用本机 debug keystore 签名,可拷贝到其他手机侧载安装;正式分发需配置 release keystore。
- 复制安装:
```powershell
adb install -r Bin\Mobile.Android\apk\Mobile-Aot.apk
```
## 星尘接入(可选)
默认构建**不引用** `NewLife.Stardust`,保持离线冒烟与全裁剪/AOT 门禁。需要把设备信息上报到星尘平台时,用 `-Stardust` 构建:
```powershell
# 构建、安装并跑冒烟(同时自动连接星尘)
pwsh Samples/Mobile.Android/run-android.ps1 -Mode Aot -Smoke -Stardust
# 只构建、安装并连接星尘
pwsh Samples/Mobile.Android/run-android.ps1 -Mode Aot -Stardust
```
- 服务端默认 `http://star.newlifex.com:6600`,产品编码 `StarAgent-Mobile`;
- 首次登录由服务端分配节点编码与密钥,保存在应用私有目录的 `staragent.json`;
- 设备信息优先读取厂商市场名称(如 `HONOR 20 PRO`)、系统设备名称(如 `FeiFan`)和 SoC 友好名称(如 `Huawei Kirin 980`);
- Android 10+ 普通应用无法读取 IMEI/MEID,序列号也通常不可读;此时硬件唯一标识继续使用 `android_id`;
- 服务端密钥校验失败时,客户端会自动清空本地密钥并重试一次,触发服务端动态注册;日志会输出 `Secret=已保存/空` 便于排查;
- 星尘构建使用 `TrimMode=partial` 裁剪并保持 AOT,避免 Android 10 真机 JIT 冷启动时 `n_onCreate` 未注册崩溃;默认冒烟构建不受影响;
- iOS:`INCLUDE_STARDUST=true bash Samples/Mobile.iOS/run-ios.sh`,`Info.plist` 已为 `star.newlifex.com` 添加 HTTP 例外。
## iOS
Windows 只能编译 iOS 类库/应用,不能运行模拟器。iOS 冒烟通过 macOS 或 GitHub Actions 的 `macos-26` 执行:
```bash
bash Samples/Mobile.iOS/run-ios.sh
```
脚本构建 `iossimulator-arm64`、启动模拟器、安装 `com.newlife.mobile`、以 `--smoke` 启动并轮询应用数据目录中的 `smoke.json`。产物复制到 `Bin/Mobile.iOS/artifacts/ios-smoke.json`。
## CI
`.github/workflows/mobile.yml`:
- Android:`ubuntu-latest` + KVM + `reactivecircus/android-emulator-runner`(API 36),运行 `run-android.ps1 -Smoke`。
- iOS:`macos-26` + iOS 模拟器(无需 Apple 账号),运行 `run-ios.sh`。
- 上传 `Bin/Mobile.Android/**` 与 `Bin/Mobile.iOS/**`。
|