manifest 文件有什么用?

很多人在项目目录里看到 manifest 文件,删了怕出问题,留着又不知道它干什么。它不是一个统一的东西,作用取决于哪个程序在读它。按场景分开说最清楚。

一、安卓应用:决定能不能装、能不能用

AndroidManifest.xml 是 APK 的"户口本"。安装时系统读它校验包名和签名,运行时读它注册组件、分配权限。具体作用:

  • 声明四大组件,不写进 manifest 的 Activity 启动就崩溃,报 ActivityNotFoundException
  • 申请权限,用户看到的权限弹窗就来自 uses-permission
  • 指定启动页,intent-filter 里的 MAIN 和 LAUNCHER 决定了桌面上点图标进哪个页面
  • 声明屏幕适配、硬件要求,不满足的设备在应用商店里看不到这个应用
  • 配置 networkSecurityConfig,控制是否允许明文 HTTP

改 manifest 之后必须重新编译打包,直接改 APK 里的 manifest 会导致签名失效,装不上。

二、Windows 程序:解决兼容性和权限

Windows 上的 manifest 主要干四件事:

  1. 绑定运行库:程序启动时按 manifest 里的版本要求加载 VC++ 运行库,版本不符就报"应用程序配置不正确"。
  2. 提权:requestedExecutionLevel 设成 requireAdministrator,程序每次启动都会弹 UAC 提示;设成 asInvoker 则不弹。很多老软件必须管理员运行才能写系统目录。
  3. DPI 适配:不声明 dpiAware,高分屏上界面会被系统缩放拉伸,字看起来发虚。
  4. 系统版本兼容:compatibility 段里声明测试过的 Windows 版本,影响系统的兼容性引擎行为。

没有 manifest 的老程序,Windows 会按默认规则处理,大多能跑,但在高分屏、UAC 场景下体验会打折。

三、PWA:让网页能装到桌面

网站根目录的 manifest.json 决定网页能不能变成"应用":

  • name 和 short_name 决定桌面上显示的名字
  • icons 里的图标决定安装后显示的图标,没有 192 和 512 尺寸的图标 Chrome 不给装
  • display: standalone 让它打开时没有地址栏,像原生 App
  • start_url 决定点图标后从哪个页面开始
  • theme_color 影响状态栏和任务栏颜色

没有这个文件,网页就只是个网页,不会出现"安装到桌面"的按钮。

四、Chrome 扩展:没有它就不算扩展

manifest.json 是扩展的唯一入口,manifest_version 决定用哪套规则(现在必须是 3)。permissions 决定能调用哪些 API,content_scripts 决定往哪些页面注入脚本,background 决定后台逻辑跑在哪。删掉它扩展直接失效。

五、JAR 包:决定 java -jar 怎么跑

META-INF/MANIFEST.MF 里的 Main-Class 指定入口类,Class-Path 指定依赖 jar 的位置,版本和签名信息也在里面。少了 Main-Class,java -jar 会报 "no main manifest attribute"。

六、什么时候可以删

类型能删吗
AndroidManifest.xml不能,删了应用无法编译安装
Windows 程序 manifest一般不建议,删了可能报运行库错误或 UAC 行为异常
PWA manifest.json能删,网站正常访问,只是失去安装能力
Chrome 扩展 manifest.json不能,删了扩展失效
JAR 内 MANIFEST.MF不能,删了无法以可执行 jar 运行

七、判断方法

看到 manifest 文件先看扩展名和所在位置。在 apk 或安卓工程里 → Android;在 exe 旁边 → Windows;在网站根目录 → PWA;在 jar 包里 → Java。实在不确定,用记事本打开看一眼根节点名,基本就能认出来。