打 Android 包,gradle 报 Manifest merger failed,后面跟着一串 attribute 冲突。改了半天才发现,是某个 SDK 的 minSdkVersion 比主工程高。

manifest 是描述文件,但换个场景完全不是一回事:安卓是 AndroidManifest.xml,PWA 是 manifest.json,Windows 程序是 .manifest,git 里还有 manifest 这个概念。

安卓的合并规则

主工程和依赖库的 manifest 会合并,属性冲突就报 merger failed。用 tools:replace 显式声明以谁为准,用 tools:node 控制节点去留;实在改不动,就在 gradle 里 exclude 那个库。

android:exported 在 Android 12 以后必须显式写,带 intent-filter 的组件漏了就装不上,报错信息还不直说,只在安装时提示解析失败。

PWA 的 manifest.json

四项必填:name、start_url、display、icons。图标至少 192 和 512 两个尺寸,路径相对 manifest 所在位置,写错了 Chrome 就不给安装提示。

display 选 standalone 最像原生,minimal-ui 会保留一点浏览器控件。scope 不写默认是 manifest 所在目录,容易把登录页排除在应用之外,装了打不开。

Windows 的 manifest

提权看 requestedExecutionLevel,asInvoker 和 requireAdministrator 差别很大,写错要么每次弹 UAC,要么直接起不来。高分屏模糊是 dpiAware 没写,PerMonitorV2 是目前最省心的值。

报错先看完整输出,合并冲突会指出是哪个库的哪个属性,加 tools:replace 通常就够,别急着删依赖。删掉之后功能没了,问题更大。