manifest 文件有什么用?
很多人在项目目录里看到 manifest 文件,删了怕出问题,留着又不知道它干什么。它不是一个统一的东西,作用取决于哪个程序在读它。按场景分开说最清楚。
一、安卓应用:决定能不能装、能不能用
AndroidManifest.xml 是 APK 的"户口本"。安装时系统读它校验包名和签名,运行时读它注册组件、分配权限。具体作用:
- 声明四大组件,不写进 manifest 的 Activity 启动就崩溃,报 ActivityNotFoundException
- 申请权限,用户看到的权限弹窗就来自 uses-permission
- 指定启动页,intent-filter 里的 MAIN 和 LAUNCHER 决定了桌面上点图标进哪个页面
- 声明屏幕适配、硬件要求,不满足的设备在应用商店里看不到这个应用
- 配置 networkSecurityConfig,控制是否允许明文 HTTP
改 manifest 之后必须重新编译打包,直接改 APK 里的 manifest 会导致签名失效,装不上。
二、Windows 程序:解决兼容性和权限
Windows 上的 manifest 主要干四件事:
- 绑定运行库:程序启动时按 manifest 里的版本要求加载 VC++ 运行库,版本不符就报"应用程序配置不正确"。
- 提权:requestedExecutionLevel 设成 requireAdministrator,程序每次启动都会弹 UAC 提示;设成 asInvoker 则不弹。很多老软件必须管理员运行才能写系统目录。
- DPI 适配:不声明 dpiAware,高分屏上界面会被系统缩放拉伸,字看起来发虚。
- 系统版本兼容: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。实在不确定,用记事本打开看一眼根节点名,基本就能认出来。