1. 内容整体设计与思路拆解
1.1 为什么 Day2 选“多终端验证 + 代码托管”这个组合
做开源鸿蒙(OpenHarmony)跨平台开发,第一天的任务通常是搭环境、建工程、跑通第一个 Hello World。到了 Day2,最该做的不是急着堆业务代码,而是把“一套代码在不同终端上跑起来”这条链路彻底打通,同时把代码迁到线上仓库做版本管理。这个组合看起来是两个独立主题,实际上是一条完整开发流水线的上下半场。
先说多终端验证。开源鸿蒙最大的卖点就是分布式、多设备协同,但这也意味着同一个工程可能跑在手机、平板、开发板、电视等不同硬件上。你是不是也遇到过这种情况:在模拟器上一切正常,一换到真机就白屏、闪退、布局错乱?这不是代码写得不行,而是你没有从第一天就建立“多终端同步验证”的意识。Day2 把这一步补上,等于给整个项目打了一剂预防针。
再说 Atomgit 托管。代码写完只是第一步,托管到 Git 仓库才是工程化的起点。Atomgit 是国内团队常用的代码托管平台,支持 Git 全流程操作,和 GitHub、Gitee 的用法基本一致。用它托管开源鸿蒙项目,有几个实实在在的好处:一是国内访问速度快,push/pull 都不闹心;二是可以建私有仓库,商业项目不用裸奔;三是团队协作时 issue、PR、Code Review 这些功能都是现成的。对你个人开发者来说,多一个远端备份,电脑硬盘崩了也不至于几个月的心血全泡汤。
所以 Day2 这套组合拳打下来,你手上的项目就完成了从“本地能跑”到“多端兼容”再到“云端管理”的三级跳。这篇文章面向的是已经搭好开发环境、能创建 OpenHarmony 工程、但还没在真实多终端场景验证过代码的开发者,照着做一遍,你就能收获一套稳定可靠的多端工作流。
1.2 多终端验证怎么做才不算白做
很多人对多终端验证有一个误区:以为把 APK 或者 HAP 装到手机上,能打开界面就算完事。这种验证方式对普通 App 也许够用,但对开源鸿蒙项目来说远远不够。
OpenHarmony 的跨平台能力体现在哪里?第一是 UI 自适应,一套 ArkUI 代码要能在不同屏幕尺寸、不同分辨率的设备上正常显示;第二是硬件能力差异适配,比如手机有陀螺仪、开发板可能只有基础的 GPIO 接口,你的代码必须能识别并降级处理这些差异;第三是分布式能力,这也是 OpenHarmony 和 Android、iOS 最大的不同——多设备之间要能互相发现、组网、协同工作。
所以我在 Day2 定义的多终端验证标准是:同一个 HAP 包,至少在三类终端上安装并跑通核心流程——模拟器、开发板、电视或车机类大屏设备。这三类基本覆盖了 OpenHarmony 最常见的运行场景。如果你手头硬件有限,最低门槛也得是模拟器加一块真实开发板,纯模拟器之间验证,意义就打折扣了。
1.3 Atomgit 托管,托管的不只是代码
把代码推到 Atomgit 仓库,这件事看起来简单,几条命令的事。但托管背后的意义远不止“多一个备份”这么简单。
从项目管理角度看,托管是版本控制的延伸。你本地可能有十几个备份文件夹,叫“项目最终版”“项目真最终版”“项目打死不改版”,这种模式在单人开发时还能勉强维持,一旦要给别人发代码、或者隔一个月回看自己的代码,立刻乱成一锅粥。代码托管到远端之后,每一次提交都有记录,想回退到任何历史版本都只是一条命令的事。
从协作角度看,托管是团队的粘合剂。Atomgit 的 PR 机制让你可以先把代码推到自己的分支,测试通过后再合入主分支;issue 功能可以把 bug 和需求都记录下来,不会做完就忘。即使你现在是单兵作战,养成这个习惯,以后加入团队或者开源项目,切换成本几乎为零。
从项目背书角度看,一个管理规范的 Atomgit 仓库,本身就是你技术能力的名片。面试官打开你的仓库,看到的不是一堆“初始化提交”“修改代码”这种没营养的提交记录,而是清晰的目录结构、规范的 commit message、完善的项目说明文档,高下立判。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心细节解析与实操要点
2.1 三个终端的适配差异,比你想的更复杂
在做多终端验证之前,先把三个典型终端的差异掰开揉碎看一下,这决定了你后面适配工作的方向。
PC 模拟器(x86_64):这是最基础的验证环境,好处是启动快、调试方便、不用折腾硬件。但它也有个天然缺陷——x86 架构与大多数真机的 ARM 架构有差异,一些依赖 CPU 指令集的库可能出现“模拟器正常、真机崩溃”的情况。另外模拟器通常没法完整模拟 OpenHarmony 的分布式硬件能力,像多设备组网这种特性,模拟器上只能做个样子。
开发板(ARM):这是最接近真实部署环境的设备。DAYU200 这类开发板用的是 RK3568 芯片,四核 ARM 架构,性能比手机弱不少,但能真实反映代码在低配硬件上的运行状态。内存占用、CPU 负载、渲染帧率这些指标,在开发板上测试才有参考价值。平台的传感器、网络、存储等硬件接口也是真实可用的,这是模拟器比不了的。
大屏设备(TV/车机):分辨率高、操作方式以遥控器为主、没有触摸屏,这些交互差异都会直接影响 UI 设计。在手机上居中的按钮可能在天电视上太靠边;手机上可用的下拉手势在遥控器上根本没法操作。如果你的应用要上架到智慧屏生态,这个终端的适配工作必须提前规划。
我用一张表把三者的关键差异整理出来:
| 对比项 | PC模拟器 | 开发板 | 大屏设备 |
|---|---|---|---|
| CPU架构 | x86_64 | ARM | ARM/ARM64 |
| 屏幕尺寸 | 可变 | 7-10寸 | 55寸+ |
| 输入方式 | 鼠标键盘 | 触摸/鼠标 | 遥控器 |
| 硬件能力 | 模拟 | 完整 | 视型号而定 |
| 性能水平 | 中等 | 弱 | 强 |
| 验证价值 | 基础功能 | 真实兼容性 | 交互适配 |
2.2 DevEco Studio 的签名配置,多终端跑通的第一个关键
多终端验证的第一步不是项目构建,而是检查签名配置。OpenHarmony 应用安装到真机(开发板、大屏设备)上,必须使用签名后的 HAP 包,这和 Android 的签名机制是一个道理。很多新手在这一步就卡住了,不是因为操作有多难,而是不明白签名的作用,导致出问题了不知道从哪排查。
签名的作用有两层:一是认证应用来源,确保安装包是开发者的合法产物;二是保证应用完整性,防止安装包被篡改。在 DevEco Studio 中,签名配置在 File > Project Structure > Signing Configs 面板,勾选 Automatically generate signature 后,IDE 会自动完成签名证书的生成和配置。这个选项适合个人开发调试,因为它会自动处理开发证书、Profile 文件等一堆繁琐的东西。
但这里有一个很多人不知道的坑:自动生成的签名文件默认是 debug 类型的,这种签名安装的 HAP 包不能用于发布,而且部分系统能力(比如分布式软总线)在 debug 签名下的行为可能和 release 签名不一致。如果你在做多终端验证时发现某些分布式功能异常,可以先检查是不是签名类型的问题——换成 release 签名再试一次,没准问题就直接没了。
2.3 hdc 工具链,OpenHarmony 的调试灵魂
hdc(HarmonyOS Device Connector)是 OpenHarmony 提供给开发者的命令行调试工具,地位相当于 Android 的 adb。多终端验证过程中,安装应用、查看日志、传输文件都离不开它。
hdc 工具的路径在 DevEco Studio 的 SDK 目录下,通常位于 [SDK路径]/toolchains/hdc。为了方便调用,我建议你把这个路径加到系统环境变量里,不然每次敲命令都要写一长串绝对路径,烦得很。Windows 用户加到 Path 环境变量,macOS/Linux 用户加到 .bashrc 或 .zshrc。
hdc 最常用的几个命令我在实战中测试过,效果很稳定:
bash复制# 查看当前连接的设备列表
hdc list targets
# 安装 HAP 包到指定设备(-r 表示覆盖安装)
hdc install -r com.example.myapp.hap
# 启动应用
hdc shell aa start -b com.example.myapp -a MainAbility
# 实时查看设备日志
hdc shell hilog
# 查看设备 CPU 和内存信息
hdc shell cat /proc/cpuinfo
hdc shell cat /proc/meminfo
有一个细节需要特别注意:hdc list targets 显示的设备列表是实时变化的。当你拔插 USB 或者开发板重启后,设备号会改变,所以在写自动化脚本时不要硬编码设备号,而是先获取一次设备列表再动态拼命令。我在做多终端验证脚本时就是这么处理的,省了不少反复修改的麻烦。
3. 实操过程与核心环节实现
3.1 第一步:三个终端的连接与工程配置
我以 OpenHarmony 官方推荐的 DevEco Studio 4.0 Release 版本为准,搭配 DAYU200 开发板、像是 TV 模拟器以及 PC 模拟器作为验证终端,把整套流程完整走一遍。
PC 模拟器侧:在 DevEco Studio 的 Device Manager 里,创建一个 Phone 类型的模拟器镜像。创建的时候可以选择 API 版本,建议选和你的 compileSdkVersion 匹配的版本,不匹配的话虽然也能装,但可能出现 API 差异导致的兼容问题。模拟器启动后,在 hdc list targets 里应该能看到一个以 emulator 开头的设备号。
开发板侧:DAYU200 开发板通过 USB 连接电脑,正常的话驱动会自动识别。如果设备列表里看不到开发板,排查步骤是:换了根 USB 线试试(数据线不等于充电线,这个坑我踩过好几次)、检查开发板是否已经进入系统桌面、重新插拔 USB。
大屏设备侧:如果你手头没有真实的智慧屏设备,可以创建一个 TV 模拟器来近似验证。TV 模拟器的焦点控制逻辑和真实遥控器一致,用它来验证焦点导航逻辑问题不大。创建方式同样是 Device Manager,设备类型选 TV 即可。
设备都就绪后,检查 DevEco Studio 能否同时识别三个设备终端,从而通过 hdc 的 -t 参数指定设备进行操作。注意修改工程里的签名配置,且把 build-profile.json5 里的 signingConfigs 指向 release 签名,这样构建出来的 HAP 包才是真机可用的完整版本。
3.2 第二步:编译打包,生成可多终端安装的 HAP
工程配置完成后,开始编译打包。在 DevEco Studio 中点击 Build > Build Hap(s)/APP(s) > Build Hap(s),IDE 会开始 Gradle 构建流程。构建产物默认输出在 entry/build/default/outputs/default/entry-default-unsigned.hap(未签名包)和 entry-default-signed.hap(签名包)。
需要说明一下,unsigned 后缀的 HAP 包是没法直接安装到开发板和大屏设备上的,一定要用 signed 的那个。如果你点击构建按钮后只看到 unsigned 文件,多半是签名配置没有生效。这时回到 Project Structure > Signing Configs,确认勾选了 Support HarmonyOS 和 Automatically generate signature,重新构建一次就正常了。
构建过程中有概率报签名相关的错误,比如 Signing certificate is not valid 或者 Profile not exist。这类错误九成是签名配置缓存问题,清理一下项目缓存(File > Invalidate Caches > Invalidate and Restart),然后重新配置签名即可。Windows 下偶尔会遇到文件占用导致的构建失败,把 DevEco Studio 或 Java 进程关掉重开就能解决。
3.3 第三步:三个终端逐机安装与验证
打包完成后,用 hdc 命令把 HAP 包装到三个终端上。
先装 PC 模拟器,因为模拟器的安装速度最快,可以作为冒烟测试。如果模拟器安装都失败,说明 HAP 包本身有问题,没必要再折腾真机了:
bash复制hdc -t [模拟器设备号] install -r entry-default-signed.hap
安装成功后,用 aa start 命令启动应用,确认基础页面能正常显示,这一步就过了。把设备号对应关系写在笔记里,免得后面搞混。
接着装开发板。开发板的安装过程比模拟器慢不少,尤其是第一次安装时系统要进行包解析和权限分配,等十几秒很正常。如果你的 HAP 包比较大(几十 MB 以上),建议用 hdc install 而不是拖拽安装,因为命令行的安装过程有输出日志,卡住了能看出来是哪一步的问题。
最后装大屏设备(TV 模拟器)。TV 模拟器的安装方式和其他终端没有区别,hdc install 同样是通用的。装完之后重点验证的不是功能逻辑,而是焦点控制——使用遥控器的方向键能否在界面上正常移动焦点、能否正常点击按钮。如果你之前的代码使用的是点击事件而不是焦点事件,在 TV 屏幕上可能出现焦点无法到达按钮的问题,这个要在这一步暴露出来。
3.4 第四步:全流程功能回归
三个终端都装好之后,别急着收工。多终端验证的另一个核心任务是功能回归,确保同一套代码在不同终端上行为一致。
我建议准备一份简单的功能回归清单,逐个验证:
- 页面加载:应用启动后首页能否在 3 秒内加载完成
- 基础交互:点击按钮、切换 Tab、列表滑动是否流畅
- 数据持久化:重启应用后,本地数据是否保留
- 网络请求:接口数据能否正常拉取和展示
- 异常场景:断网、弱网下应用的提示和降级逻辑是否正常
在跑回归的过程中,要打开 hilog 日志实时观察异常信息:
bash复制hdc -t [设备号] shell hilog | grep "Error"
这个命令会实时过滤出 Error 级别的日志。如果某个终端上功能异常,日志里通常会直接打出具体的报错栈,定位起来很快。我见过不少开发者只在模拟器上跑一次回归就以为万事大吉,结果换到开发板上各种崩溃,然后连夜排查——如果每次跑完多终端都完整回归一遍,这类问题早就暴露了。
3.5 第五步:Atomgit 仓库创建与远程托管
多终端验证通过后,代码到了上库环节。先说 Atomgit 远程仓库的创建。注册账号这步按下不表,登录后在右上角头像菜单里找到 新建仓库,填写仓库名称、描述,选择仓库类型(私有/公开)。开源鸿蒙项目建议至少把默认分支设置为 main,而不是 master,因为新版 Git 生态都以 main 为主流了。
仓库创建后,Atomgit 会给你一段提示,内容大致是:
bash复制git remote add origin https://atomgit.com/你的用户名/你的仓库名.git
git push -u origin main
现在把注意力放回本地项目的 Git 初始化。DevEco Studio 新建的项目默认已经是一个 Git 仓库了,你在工程目录下执行 git status 就能看到未跟踪的文件列表。如果项目还没有初始化,手动执行:
bash复制cd 你的项目目录
git init
git add .
git commit -m "chore: 初始化开源鸿蒙跨平台项目,完成三层终端验证"
提交信息的命名规范值得认真对待。我在大厂带团队的时候,要求所有提交信息必须遵循 Conventional Commits 规范——feat表示新功能,fix表示修复 bug,chore表示构建或辅助工具变动,docs表示文档更新。这个做法在单人项目里也能让你在回溯版本时省下不少力气。如下是一些现成的提交信息模板:
text复制feat: 实现首页多终端自适应布局
fix: 修复开发板上闪退问题,增加异常保护
docs: 更新README,补充多终端验证结果
refactor: 重构网络请求模块,统一错误处理
3.6 第六步:本地分支与远程仓库关联
本地提交完成后,把本地仓库和 Atomgit 远程仓库关联起来:
bash复制git remote add origin https://atomgit.com/你的用户名/你的仓库名.git
git branch -M main
git push -u origin main
这里有个容易踩的坑:如果你在执行 git remote add origin 时,远程仓库已经存在同名远程(比如 DevEco Studio 已经帮你加了一个),会报 fatal: remote origin already exists。解决方法是先删后加:
bash复制git remote remove origin
git remote add origin https://atomgit.com/你的用户名/你的仓库名.git
git push -u origin main 第一次推送时,Atomgit 会要求输入账号密码。这里有个安全细节:建议不要在命令行里直接输密码,而是用个人的访问令牌(Personal Access Token)。在 Atomgit 设置页面申请一个 token,clone 或 push 时用它代替密码,就算 token 泄露,也可以在后台一键撤销,不必改密码那么兴师动众。
推送成功后,打开 Atomgit 仓库页面,确认代码已经同步到远端。到这里,Day2 的核心流程就跑通了:多终端验证通过,代码安全托管在远端。
4. 常见问题与排查技巧实录
4.1 问题速查表
实操过程中踩过的坑,整理成速查表分享给你,都是真金白银换来的经验:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| hdc list targets 看不到开发板 | USB线是充电线/驱动异常 | 换数据线,重装驱动,检查开发板供电 |
| 安装 HAP 报 FAILED | HAP 包未签名/签名过期 | 确认使用 signed 包,重新生成签名 |
| 开发板运行应用闪退 | 架构不兼容/内存不足 | 检查 arm64-v8a so库,优化内存占用 |
| 模拟器能跑真机崩溃 | 模拟器与真机 API 差异 | 增加真机专项适配代码,不要全信模拟器 |
| 推送代码提示认证失败 | 密码错误/未用 token | 生成 Personal Access Token 替代密码 |
| git push 报 rejected | 远程有本地没有的提交 | 先 git pull --rebase,解决冲突后再 push |
| 电视上按钮无法点击 | 未处理焦点事件 | 在组件上添加 focusable 和 keyEvent 处理逻辑 |
4.2 终端真机指纹校验失败的处理
连接开发板时常见的一个问题是 RSA 指纹确认弹窗。hdc 连接开发板时,如果开发板此前没有和你电脑进行过配对,会在终端输出类似 [E] 驱动: 无法连接 192.168.x.x:5037 的错误,然后提示你是否信任此设备。
严格来说这不是 hdc 的 bug,而是一种安全机制——首次连接需要确认 USB 调试授权。解法很简单:在开发板系统设置里找到开发者选项,关闭再重新打开 USB 调试 开关,弹窗就会出现,点击确认即可。
另外要注意的是,开发板默认只开启 USB 调试模式,如果你连的是开发板的 IP 网络口,需要手动开启 网络 调试模式。DAYU200 开发板在设置里没有这个选项时,可以通过命令行开启:
bash复制hdc tconn 192.168.x.x:5555
4.3 真机日志刷屏,如何精准定位有效信息
开发板上的 hilog 默认会输出系统所有日志,刷屏速度堪比瀑布。每次都好几百行刷过去,真正有用的错误信息早就被冲走了。
我的做法是:先启动一个干净的 hilog 会话,再复现问题,配合日志过滤器精确定位。具体操作如下:
bash复制hdc shell "hilog -Q pidoff && hilog" | grep -E "ERROR|FATAL|com.example.myapp"
-Q pidoff 是关闭日志缓冲,这样日志能实时输出。后面的 grep 会过滤出 Error 级别和你包名相关的日志。如果你的代码里有自己的日志标签,也可以追加到 grep 条件里。这样过滤之后,问题定位的效率能提升一个量级。
4.4 内存优化不够,开发板上面板卡死无响应
开发板的性能和手机没法比,RK3568 的 GPU 能力有限,遇到复杂动画或者高分辨率图片,掉帧是家常便饭。我在跑多终端验证时遇到过开发板面板卡死无响应的问题,杀应用都杀不动。
排查下来是图片压缩问题:原图一张 2K 分辨率的宣传图,在手机上显示毫无压力,到开发板上直接吃掉了大量 GPU 显存带宽,导致渲染管线阻塞。解决方法是三管齐下:
第一,图片资源裁剪,针对开发板的分辨率单独出一套低分辨率图标,通过资源限定符自动选择对应资源。
第二,优化布局层级,尽量少用嵌套的 Row/Column,能用 Flex 就用 Flex,减少渲染树深度。
第三,避免在列表滑动过程中加载大图,使用轻量级的高频刷新策略,等滚动停止后再加载。
这三步做完,开发板上的流畅度明显改善。这个优化思路对手机端低端机型同样有效,属于是“开发板上调优,全平台受益”。
5. 从 Day2 到长期项目,托管与多端验证的深度扩展
5.1 跨终端验证自动化,把手动操作变成脚本
多终端验证手动来一遍,熟练了也要十五分钟。如果是团队协作,每个人的验证步骤还不一样,效率和规范性都很难保证。我在项目推进中把多终端验证做成了自动化脚本,把安装、启动、日志抓取都串起来放着,每天跑一遍,有异常就自动告警。
脚本的逻辑不难:读取终端设备列表,按类型分组,然后逐台执行安装、启动、抓日志的操作。核心部分大概长这样:
bash复制#!/bin/bash
# 安装并启动应用的通用函数
install_and_launch() {
local device_id=$1
local hap_path=$2
local bundle_name=$3
echo "正在安装到设备: $device_id"
hdc -t "$device_id" install -r "$hap_path"
echo "正在启动应用: $bundle_name"
hdc -t "$device_id" shell aa start -b "$bundle_name" -a MainAbility
}
# 获取设备列表
devices=$(hdc list targets | grep -v "List of devices")
echo "检测到设备: $devices"
# 对每台设备执行操作
for device in $devices; do
install_and_launch "$device" "entry-default-signed.hap" "com.example.myapp"
done
配合 Atomgit 的 Webhook 能力,我甚至实现了“push 代码后自动触发远程构建,构建完成后自动把 HAP 分发到各台测试机并执行冒烟测试”的流水线。这套流水线上线后,多终端回归彻底从我的待办事项里消失了,自动化脚本自己就能完成。
5.2 Atomgit 托管进阶:Branch 保护与 PR 工作流
代码托管到 Atomgit 后,单人开发可能感受不到分支策略的压力,但如果项目开始有第二个、第三个人加入,分支管理混乱就会拖垮协作效率。
我在 Atomgit 仓库里开启了 main 分支的保护功能。在仓库“设置-分支设置”里找到“添加保护分支”,选择 main,然后勾选“不允许直接推送”。这样一来,任何人都不能直接把代码推送到 main 分支,必须先创建功能分支,然后发起 Pull Request,经过 Code Review 通过后代码才能合入主干。
这个机制看起来像是给团队协作设门槛,实际上是对所有人都有利的保护。代码合入前多一道审查,很多低级问题(比如调试代码忘了删、硬编码了测试路径)都能在合并前被拦下来。单人开发开着这个功能也不亏,它能帮你养成“每次提交都是可审查的工作单元”的习惯。
5.3 文档与 Release 管理:让项目状态对所有人透明
Atomgit 不只是一个代码仓库,它还带了 issue、Wiki、Release 等功能模块。我在项目里最常用的三件事:
第一,用 GitHub 风格/简化的 Markdown 写 README。README 里除了项目简介,还会放“多终端验证状态”表格,列出各个终端的验证时间、验证结果、遗留问题。这样不管是自己还是后来加入的同事,打开仓库首页就能知道项目的健康状况。
第二,把每个版本对应的 HAP 包上传到 Atomgit 的 Release 页面。每个 Release 的说明里写清楚这个版本改了什么、验证过哪些终端、已知问题有哪些。这个习惯帮我在回滚版本时省了大力气——不用翻代码历史找哪个提交是稳定的,直接看 Release 列表就能锁定目标版本。
第三,用 issue 记录 bug 和优化项。发现一个 bug 就记一个 issue,修复后在 commit message 里关联对应的 issue 编号,比如 fix: 修复开发板闪退问题 #12。这样每个 fix 都能追踪到最初的问题源头,代码和问题之间就有了可追溯性。
5.4 下一阶段的演进方向
Day2 的多终端验证和代码托管,解决的是“代码能稳定地跑在多台设备上、并且有可靠版本管理”的问题。这套基础设施架好之后,后面的工作就可以往三个方向推进:
分布式能力开发:既然多终端环境已经在手上,下一步就可以开始玩 OpenHarmony 最核心的分布式特性了——跨设备流转、分布式数据库、分布式软总线。这些能力在单设备上无从体验,但在多终端验证中已经搭建起来的设备矩阵正好是现成的实验场。
自动化测试体系:手工多终端验证效率再高,也没有自动化测试来得可靠。单元测试(UT)、UI 测试、性能测试可以逐步接入,把关键路径的验证交给机器来做。这一步做完,项目的质量保障就从“人肉测试”升级到了“体系化测试”。
性能监控与优化:开发板上跑出来的性能数据,是优化方向的指南针。接入性能监控工具,统计关键页面的启动耗时、帧率、内存占用,把数据沉淀下来,通过版本对比找到性能劣化的根因。这种数据驱动的优化方式,比凭感觉调参数靠谱得多。
我在实际项目里就是沿着这个路径推进的,每次升级都在前一步建好的地基上进行,踩的坑越来越少,产出效率越来越高。你现在做好的 Day2 这一步,某种程度上是整个项目后续能否顺利推进的分水岭。
