华为和荣耀应用市场如何关闭「平行视界」

184 阅读4分钟

华为和荣耀应用市场如何关闭「平行视界」

1 背景

在华为平板或者折叠屏设备上,系统会为 TOP 级别且默认仅支持竖屏的 App 自动打开 平行视界(App Multiplier) 功能。该功能通过系统侧分屏把同一个 Activity 渲染到左右两侧,理论上可以提升大屏可用性。但如果你的应用:

  • 只针对竖屏做了 UI 适配;
  • 两侧窗口抢占资源导致逻辑/渲染混乱;
  • 业务场景就是单屏显示(例如短视频、游戏、在线课堂)

那么,被 “强开” 平行视界不仅不会改善体验,反而会带来 UI 错位、资源浪费甚至 Crash。

  • 问题:怎样优雅地告诉华为系统 "别给我分屏" ?

2 方案概览

官方公开文档只描述了如何启用 “平行视界”,而没有一句话告诉你 “关闭” 怎么做。经过实际踩坑与和 HUAWEI AppGallery 运营侧沟通,总结出两条可行路径:

路径是否修改代码生效粒度建议场景
A. 运营商白名单下架整个应用极少数:和商务/运营对接即可,但周期不可控
B. 在 APK 内显示声明排除设备代码内可控开发者最常用、可随版本迭代

本文只聚焦 B 方案——在 easygo.json 里加入一行配置,即可让平板 & 折叠屏默认 不开启 平行视界。

3 什么是 easygo.json

easygo.json 是华为 MagicWindow 组件(平行视界的实现载体)的 声明式配置文件。系统解析该 JSON 后决定:

  • 是否对 App 打开分屏;
  • 分屏模式(购物 / 导航 / 自定义);
  • 活动对 (activityPairs) 规则;
  • UX 补偿参数(拖拽、旋转兼容、分屏比例等)。

更详细的字段含义,可以去查阅官网示例等文档说明。

4 核心配置:excludeDevice

经过实际测试及社区交流,MagicWindow 在 body 节点里支持一个 内部字段

{
  "logicEntities": [{
    "body": {
      "excludeDevice": "PAD|FOLD"
    }
  }]
}

含义一目了然:

  • PAD:华为 & 荣耀所有平板设备
  • FOLD:Mate X、Pocket S 等折叠屏设备

只要命中这两个类型,系统就视同「该设备不支持 MagicWindow」,即使 App 属于 TOP 级别也不会再被分屏。

⚠ Tips:

  • 1)该字段目前只在内部邮件和运营伙伴 FAQ 里出现,公开文档暂时缺失;未来 SDK 或文档可能补齐;
  • 2)如果后续华为或荣耀将该字段改名/下线,可以改用运营白名单方案兜底。

5 完整实现步骤

5.1 Manifest 保持原样或添加 EasyGoClient

如果你之前为了适配平行视界加过:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  package="cn.xxx.xxxxx">
  
  <application
    android:name=".XxxApplication"
    ...
    >
    ...
    
    <meta-data
      android:name="EasyGoClient"
      android:value="true" />
      
    ...
  </application>
</manifest>
  • 注意:若从未加过,添加即可;若已加过,保持现状即可。

5.2 在 assets 根目录创建/修改 easygo.json

路径:app/src/main/assets/easygo.json 一个最小化、只做 "排除设备" 声明的模板如下(其余字段按需增删即可):

{
  "easyGoVersion": "1.0",
  "client": "com.huawei.demo",
  "logicEntities": [{
    "head": {
	  "function": "magicwindow",
	  "required": "true"
	},
	"body": {
	  "mode": "1",
	  "excludeDevice": "PAD|FOLD",
	  "activityPairs": [],
	  "transActivities": [],
	  "Activities": [],
	  "UX": {
	    "supportRotationUxCompat": "true",
		"isDraggable": "true"
	  }
	} 	
  }]
}

注意:

  • 1)easyGoVersion、head.function、head.required 为 MagicWindow 固定占位字段,照抄即可;
  • 2)mode 设置成 1(或其他任意值)并不会阻止系统去解析 MagicWindow;真正起决定作用的是 excludeDevice;
  • 3)excludeDevice 可单独写 "PAD",如果仅想屏蔽大屏平板、继续允许折叠屏分屏;
  • 4)JSON 语法必须绝对正确,系统解析失败就会退回默认策略。

5.3 打包 & 自测

  • 1)安装到平板/折叠屏:首次启动应为 单屏
  • 2)打开 设置 > 显示与亮度 > 平行视界,App 不会再出现在可开启列表内;
  • 3)用 adb shell dumpsys window 确认 Activity 没有带 hw-magic-windows 标记。

6 常见问题 & 排坑

问题解决方案
App 在某些 Pad 还是被分屏检测是否有历史版本没有携带 easygo.json,升级流程里市场可能读取了旧缓存,全量更新后再试
线上老版本需要同时关闭无法 retre patch,需上架一个 minSDK/VersionName 小变的版本,让所有用户都拉新

7 结语

  • 只要一行 excludeDevice,就能让华为平板和折叠屏 彻底 “忘记” 你的应用还能分屏。这样既保住了竖屏专注体验,又避免了额外的 UI/逻辑适配成本。
  • 注意:如果你打算后续针对大屏做完整双列 / 三列布局,也可以随时把 excludeDevice 去掉,再切换到 mode=0/1 按需分屏;配置同一个文件即可轻松版本控制。
  • 解题思路:可以参考华为应用市场 TOP 级别的应用,将这些 .apk 下载下来,然后改成 .zip 文件后解压缩,然后查看其 assets/easygo.json 作为参考。

8 参考资料