manifest 文件是什么?

manifest 这个词在开发里出现频率极高,但指的是完全不同的东西。有人问"manifest 文件是什么",答案得看他是在哪个目录下看到的。下面按四种最常见的场景说。

一、Android 的 AndroidManifest.xml

每个安卓应用都必须有,位置在 app/src/main/AndroidManifest.xml。它是应用向系统"申报"自己的清单,内容包括:

  • 包名 package,应用的唯一身份
  • 应用组件:activity、service、receiver、provider,每个都要在这里注册,不写就启动不了
  • 权限声明:uses-permission,比如相机、定位、读写存储
  • 最低和目标 SDK 版本
  • 启动入口 intent-filter

装 APK 时系统第一件事就是读这个文件,权限弹窗里的内容也来自这里。改包名、加权限、注册新页面,都绕不开它。

二、Windows 程序的 manifest

Windows 上的 manifest 是一个 XML,编译进 exe 或者以 .manifest 文件放在程序旁边,主要作用是:

  • 声明需要的 Visual C++ 运行库版本,避免"应用程序配置不正确"的经典报错
  • 声明 UAC 权限级别,requireAdministrator 就是它让程序弹出"是否允许此应用更改设备"
  • 声明 DPI 感知,不写的话高分屏上程序界面会糊成一片
  • 声明 Windows 版本兼容性

用 mt.exe 或者 Visual Studio 的清单工具可以查看和修改。很多老程序在高分屏下字体发虚,就是 manifest 里没开 dpiAware。

三、Web 应用的 manifest.json

PWA(渐进式网页应用)用的,放在网站根目录,用 <link rel="manifest" href="/manifest.json"> 引入。作用是让网页能"安装"到桌面:

{
  "name": "我的应用",
  "short_name": "应用",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#1890ff",
  "icons": [
    { "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" }
  ]
}

Chrome 扩展的 manifest.json 也是同一类东西,只不过字段换成 manifest_version、permissions、background、content_scripts。

四、Git、Docker、构建产物里的 manifest

  • Git:.git 目录里有 MANIFEST 相关文件,记录对象索引,一般不用管。
  • Docker:docker manifest 描述多架构镜像,docker manifest inspect 可以查看某个镜像支持哪些平台。
  • Java JAR:META-INF/MANIFEST.MF 记录 Main-Class、版本、签名信息,java -jar 就是靠它找入口类。
  • npm/yarn 缓存:node_modules/.package-lock.json 有时被叫作 manifest,记录依赖树。

五、怎么快速判断你看到的是哪一种

  1. 看文件名:AndroidManifest.xml、manifest.json、MANIFEST.MF、*.manifest,后缀基本能定位。
  2. 看位置:在 apk 或安卓工程里就是 Android 的;在网站根目录就是 PWA 的;在 JAR 包里就是 Java 的。
  3. 看内容:以 <manifest> 开头的是 Windows 或 Android,以 { 开头的是 JSON。

弄不清是哪种就问自己一句:这个文件是谁在解析?系统、浏览器、还是构建工具?答案自然就出来了。