.manifest是什么文件

Manifest是一种XML文件,用于描述应用程序配置和组件隔离,包括程序集和应用程序Manifests。在Windows XP及以上版本,Manifest处理方式改变,影响了DLL查找和版本重定向。它在VS2005后成为必要的配置,特别是对于使用C运行库的应用。
Manifest
Windows XP通过XML文件来实现这一功能,这些XML文件保存了有关应用程序配置的元数据,这里所说的XML文件,就是Manifest清单文件。
Manifest事实上就是一个以.manifest为后缀的XML文件,用于组织和描述隔离应用程序及并行组件,其内部的信息如<assemblyIdentity>元素则标识着一个唯一的程序集,和其他信息一起,他们用于COM类、接口及库的绑定和激活,而这些信息,以往都是存储在注册表中的。另外,Manifests也制定了组成程序集的文件及Windows类。

二、Manifest的分类
在Windows XP中,事实上是在.NET中,把Manifests分类为如下几种类型:
1、程序集Manifests(Assembly Manifests):主要用于描述程序集,管理程序集的名字、版本、资源、依赖程序集。其中共享程序集的Manifests存储在Windows的WinSxS目录中。私有的程序集Manifests则存可以作为一个资源存储在DLL中,也可以存储在应用程序目录下。
2、应用程序Manifests(Application Manifests):这类Manifests则用于描述隔离应用程序,它管理着此应用程序在运行时要绑定的共享的并行组件的名字、版本。该Manifests可以作为一个文件(.manifest文件)存储在应用程序相同的目录下,也可以作为一种资源嵌入在可执行文件内部(Embed Manifest)。
3、应用程序配置文件(Application Configuration Files):对于并行组件及隔离应用程序来说,使用这种Manifests来“Override and Redirect”所依赖程序集的版本。
4、发行配置文件(Publisher Configuration Files):用于重定向并行组件的版本到另外一个合适的版本的Manifests。此时,被重定向的新程序集应该和原来的旧程序集具有相同的主.次(majou.minor)版本号。

三、Windows对于Manifest的处理
XP以前版本的windows,会像以前那样执行这个exe文件,寻找相应的dll,没有分别,Manifest只是个多余的文件或资源,dll文件会直接到system32的目录下查找,并且调用。
而XP及其以后的操作系统,则会首先读取Manifest,获得exe文件需要调用的DLL列表(此时获得的,并不直接是DLL文件的本身的位置,而是DLL的manifest)操作系统再根据DLL的Manifest提供的信息去寻找对应的DLL ,这样就可能区别不同版本的同一个DLL文件。
这就说明了为什么我的程序可以在2000下面运行,而在XP及2003上无法运行。
这也使得很多木马可以利用这个特点实现限制安全软件。
 
所以在发布包的时候除了提供VC运行环境,也把manifest文件提供,如VS2008的VC运行库目录中Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\Microsoft.VC90.CRT.manifest,其中的内容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable></noInheritable>
    <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    <file <span style="color:#3366ff;">name="msvcr90.dll" </span>hashalg="SHA1" hash="9785b1c493deb5b2134dc4aef3719cee207001bc"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>VF5ECUAHPV7EnUf+/UIXMPizPvs=</dsig:DigestValue></asmv2:hash></file> 
   <file <span style="color:#3366ff;">name="msvcp90.dll"</span> hashalg="SHA1" hash="0f6bbf7fe4fb3fca2cb5b542eca1a1cad051f01c"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>3Wg+StVMq2uhx7POnAkl2w4dDmY=</dsig:DigestValue></asmv2:hash></file> 
   <file <span style="color:#3366ff;">name="msvcm90.dll"</span> hashalg="SHA1" hash="7f3290ab2b7444c2b4a9b1fedfdb16466d7a21bb"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>/YfRn7UQENzdMeoMHxTgdRMiObA=</dsig:DigestValue></asmv2:hash></file>
  </assembly>
 
四、VS2005种的Manifest配置
使用Visual Studio 2005以后的一个新问题是,VS2005带的8.0新版的C运行库(VC 8.0 CRT)文件在XP以后支持manifest的Windows版本中被调用时,将会check一下Application自身的Manifest,否则将会拒绝被调用,这也就是说,使用Visual Studio开发的Application,Manifest将是必不可少的(搞不懂MS为啥要这样设置,反正与VS2003.NET不同了,也许除了MS自己说的哪些冠冕堂皇的原因,至少这样一来Linux的Wine模拟要麻烦多了)
不过,如果你的程序是静态链接的,没有使用dll,且只使用了操作系统核心的 Kernel32.dll, User32.dll, Ole32.dll, 或ShDocVW.dll 等,那么你可以不需要考虑Manifest, 可以关掉它。此时,在VS2005种中,project的设置必须是Use Standard Windows Libraries、Not Using ATL、No Common Language Runtime support
<think>我们注意到用户的问题是关于android.Manifest类及其用途。但是,根据Android开发知识,我们需要澄清一个常见的误解:在Android开发中,并没有一个名为`android.Manifest`的公开类。通常,开发者操作的是`AndroidManifest.xml`文件,而不是一个Java类。 然而,在Android框架中确实存在一个`Manifest`类,但它是一个在`android`包下的类,全名为`android.Manifest`。这个类在API级别1就已经存在,但它的主要作用是定义一些权限常量,而不是用来表示整个清单文件。 因此,我们需要向用户解释清楚: 1. `AndroidManifest.xml`文件的作用和结构。 2. `android.Manifest`类的作用(主要是权限常量)。 同时,我们也要参考用户提供的引用内容,因为用户可能混淆了这些概念。 引用内容涉及: 引用[1]:关于Manifest中多个`android.intent.action.MAIN`的说明,这实际上是`AndroidManifest.xml`中`<activity>`的`<intent-filter>`配置。 引用[2]:关于`<meta-data>`元素的使用,这也是在`AndroidManifest.xml`中配置的。 引用[3]:关于权限声明`<uses-permission>`,同样在`AndroidManifest.xml`中。 所以,用户可能真正想了解的是`AndroidManifest.xml`文件,而不是`android.Manifest`类。但为了全面性,我们将两者都解释一下。 回答结构: 1. 澄清概念:区分`AndroidManifest.xml`文件和`android.Manifest`类。 2. 详细说明`AndroidManifest.xml`文件的作用和关键元素(包括用户引用中提到的内容)。 3. 介绍`android.Manifest`类的作用(主要是权限常量)。 4. 如何在实际开发中使用这些内容。 注意:由于用户问题中提到了“android.Manifest类”,所以我们不能忽略它,但也要指出通常开发者操作的是XML文件。 另外,生成相关问题。</think>在 Android 开发中,`android.Manifest` 类实际上是一个**权限常量容器**,而非表示 AndroidManifest.xml 文件本身。以下是详细说明: ### 一、android.Manifest 类的作用 1. **权限常量定义**: - 提供所有 Android 系统权限的常量字符串 - 例如:`Manifest.permission.CAMERA` = `"android.permission.CAMERA"` - 包含 200+ 系统权限常量(如 `READ_CONTACTS`, `ACCESS_FINE_LOCATION` 等) 2. **主要用途**: - **运行时权限检查**: ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // 请求权限 } ``` - **避免硬编码权限字符串**,减少拼写错误风险 3. **类结构说明**: ```java package android; public final class Manifest { public static final class permission { public static final String INTERNET = "android.permission.INTERNET"; public static final String CAMERA = "android.permission.CAMERA"; // 其他权限常量... } } ``` ### 二、AndroidManifest.xml 文件(与类区分) 虽然类名相似,但 `AndroidManifest.xml` 是应用的**配置文件**,包含: ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app"> <!-- 1. 权限声明 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <!-- 如引用[3]的存储权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <!-- 2. 应用组件声明 --> <application> <activity android:name=".MainActivity"> <!-- 如引用[1]的MAIN入口 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 3. 元数据配置(如引用[2]) --> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="YOUR_API_KEY"/> </application> </manifest> ``` ### 三、关键区别 | **特性** | `android.Manifest` 类 | `AndroidManifest.xml` 文件 | |------------------------|----------------------------------------|--------------------------------------| | **类型** | Java 类(权限常量容器) | XML 配置文件 | | **位置** | `android.Manifest` 包 | `app/src/main/AndroidManifest.xml` | | **主要用途** | 代码中安全引用权限字符串 | 声明应用组件、权限、硬件要求等 | | **修改方式** | 只读(系统预定义) | 开发者直接编辑 | | **运行时访问** | 通过类名引用 | 通过 `PackageManager` 读取 | ### 四、实际使用示例 1. **动态请求权限**: ```java // 使用 Manifest 类避免硬编码 String[] permissions = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE }; requestPermissions(permissions, REQUEST_CODE); ``` 2. **读取 Manifest 中的 meta-data**: ```java // 获取引用[2]中的API密钥 ApplicationInfo ai = getPackageManager().getApplicationInfo( getPackageName(), PackageManager.GET_META_DATA ); String apiKey = ai.metaData.getString("com.google.android.maps.v2.API_KEY"); ``` ### 五、最佳实践 1. **权限使用原则**: - 最小权限原则:只声明必要的权限 - 危险权限(如相机、位置)必须动态请求 2. **Manifest 文件优化**: - 使用 `<uses-feature>` 声明硬件要求 - 通过 `<permission>` 定义自定义权限 3. **常量引用**: - 始终通过 `Manifest.permission.XXX` 引用权限 - 避免直接使用字符串 `"android.permission.XXX"` > 总结:`android.Manifest` 类本质是**权限常量工具类**,而应用配置在 `AndroidManifest.xml` 中实现。两者协同工作确保应用安全声明和运行时权限管理[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值