AndroidManifest.xml 是 Android 项目的核心配置文件,它定义了应用的基本信息、所需权限、组件、功能等。它为 Android 系统提供了关于应用如何运行的重要信息。每个 Android 应用程序必须包含这个文件,而且这个文件的配置直接影响到应用的行为和安装要求。
下面是一个具体的 AndroidManifest.xml
配置文件的完整代码示例,并结合注释解释每一部分的作用。最后,我还会对这个配置文件做一个总结。
AndroidManifest.xml
示例
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp"
android:versionName="1.0"
android:installLocation="auto"
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.screen.portrait" android:required="false" />
<supports-screens
android:smallScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:resizeable="true"
android:anyDensity="true" />
<application
android:icon="@mipmap/ic_launcher"
android:theme="@style/AppTheme"
android:allowBackup="true"
android:hardwareAccelerated="true"
android:debuggable="false">
<activity
android:name=".MainActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
<activity
android:name=".SecondActivity"
android:label="Second Activity"
android:theme="@style/AppTheme" />
<service android:name=".MyService"
android:enabled="true"
service>
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true">
<intent-filter>
<action android:name="com.example.myapp.ACTION_RECEIVE" />
intent-filter>
receiver>
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapp.provider"
android:exported="false"
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:label="My App"
android:icon="@mipmap/ic_launcher"
android:theme="@style/Theme.AppCompat.Light">
<activity android:name=".MainActivity"
android:label="MainActivity"
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
<activity android:name="com.example.library.LibraryActivity"
android:label="Library Activity"
android:theme="@style/Theme.AppCompat.Light">
<intent-filter>
<action android:name="com.example.library.OPEN_LIBRARY" />
intent-filter>
activity>
application>
manifest>
package
属性冲突app
和 library
模块中的 package
属性值不同。package
属性已经不允许在合并时重复声明,因此 Gradle 会报错:
Multiple declarations of the same package name detected.
app
的 AndroidManifest.xml
中保留 package="com.example.myapp"
。library
的 AndroidManifest.xml
中的 package
属性。如果两个模块声明了相同的权限(例如 android.permission.INTERNET
),Gradle 会自动合并它们。
android.permission.INTERNET
和 android.permission.ACCESS_NETWORK_STATE
。android.permission.INTERNET
和 android.permission.ACCESS_WIFI_STATE
。在合并后,权限不会重复声明,它们会被合并成一个声明。
如果 app
模块和 library
模块中都声明了 Activity
,Gradle 会合并它们。例如,如果 app
中有 MainActivity
,而 library
中有 LibraryActivity
,合并后就会有两个 Activity
声明。
这种合并是 自动的,并且不会报错。
但是,如果组件的配置(如 theme
、intent-filter
等)不兼容,则需要手动调整。
tools:node="remove"
来移除某个组件,或者使用 tools:node="replace"
来替换冲突的配置。Activity
被合并,可以在 app
的 AndroidManifest.xml
中使用以下代码:<activity
android:name="com.example.library.LibraryActivity"
tools:node="remove" />
如果遇到 Manifest 合并问题,你可以通过 Gradle 构建来查看合并的具体结果。运行以下命令:
./gradlew :app:processDebugManifest
或者,在 Android Studio 中查看 Manifest 合并报告:
AndroidManifest.xml
。在多个模块之间,AndroidManifest.xml
的合并是常见的操作,特别是当你有多个库和应用模块时。可能会遇到以下冲突:
package
属性冲突:只允许在应用模块中设置 package
,库模块中不设置 package
属性。Activity
、Service
等),Gradle 会合并它们,但如果配置冲突(如主题或 intent-filter
),你需要手动解决。使用 tools
属性来精细控制 Manifest 合并行为,查看 Gradle 输出和 Manifest 合并报告可以帮助你解决问题。
这是一个从头到尾的完整示例和解决方案,希望它能帮助你理解如何处理 Manifest 合并冲突。如果你有任何问题,或者需要进一步的帮助,请告诉我!