关于Android Studio的AndroidManifest.xml的详解

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>

5. 可能的 Manifest 合并冲突

冲突 1:package 属性冲突

applibrary 模块中的 package 属性值不同。package 属性已经不允许在合并时重复声明,因此 Gradle 会报错:

Multiple declarations of the same package name detected.
解决方法
  • 应用模块:在 appAndroidManifest.xml 中保留 package="com.example.myapp"
  • 库模块:移除 libraryAndroidManifest.xml 中的 package 属性。
冲突 2:权限冲突

如果两个模块声明了相同的权限(例如 android.permission.INTERNET),Gradle 会自动合并它们。

  • 应用模块:声明了 android.permission.INTERNETandroid.permission.ACCESS_NETWORK_STATE
  • 库模块:声明了 android.permission.INTERNETandroid.permission.ACCESS_WIFI_STATE

在合并后,权限不会重复声明,它们会被合并成一个声明。

冲突 3:组件冲突

如果 app 模块和 library 模块中都声明了 Activity,Gradle 会合并它们。例如,如果 app 中有 MainActivity,而 library 中有 LibraryActivity,合并后就会有两个 Activity 声明。

这种合并是 自动的,并且不会报错。

但是,如果组件的配置(如 themeintent-filter 等)不兼容,则需要手动调整。

解决方法
  • 你可以使用 tools:node="remove" 来移除某个组件,或者使用 tools:node="replace" 来替换冲突的配置。
  • 如果你不希望某个库中的 Activity 被合并,可以在 appAndroidManifest.xml 中使用以下代码:
<activity
    android:name="com.example.library.LibraryActivity"
    tools:node="remove" />

6. 进一步调试 Manifest 合并

如果遇到 Manifest 合并问题,你可以通过 Gradle 构建来查看合并的具体结果。运行以下命令:

./gradlew :app:processDebugManifest

或者,在 Android Studio 中查看 Manifest 合并报告

  • Build > Analyze APK > 打开合并后的 AndroidManifest.xml

7. 总结

在多个模块之间,AndroidManifest.xml 的合并是常见的操作,特别是当你有多个库和应用模块时。可能会遇到以下冲突:

  • package 属性冲突:只允许在应用模块中设置 package,库模块中不设置 package 属性。
  • 权限冲突:如果多个模块声明了相同的权限,Gradle 会合并这些权限。
  • 组件冲突:如果多个模块声明了相同的组件(如 ActivityService 等),Gradle 会合并它们,但如果配置冲突(如主题或 intent-filter),你需要手动解决。

使用 tools 属性来精细控制 Manifest 合并行为,查看 Gradle 输出和 Manifest 合并报告可以帮助你解决问题。


这是一个从头到尾的完整示例和解决方案,希望它能帮助你理解如何处理 Manifest 合并冲突。如果你有任何问题,或者需要进一步的帮助,请告诉我!

你可能感兴趣的:(android,studio,xml,AndroidManifest)