AndroidManifest文件介紹及合并沖突規(guī)則
AndroidManifest文件介紹
AndroidManifest.xml是Android應(yīng)用程序的清單文件,它包含了應(yīng)用程序的所有信息,包括應(yīng)用程序的包名、組件(如活動、服務(wù)、接收器和內(nèi)容提供者)的聲明、權(quán)限要求、應(yīng)用程序的最低SDK版本要求等。它是Android應(yīng)用程序的入口文件,系統(tǒng)會根據(jù)這個文件來識別應(yīng)用程序的各種信息和配置。
通常,AndroidManifest.xml文件位于應(yīng)用程序的根目錄下的"app/src/main"目錄中。在AndroidManifest.xml文件中,你可以聲明應(yīng)用程序的各種組件、權(quán)限要求、應(yīng)用程序的圖標(biāo)和主題等信息。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="33" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity" />
<service android:name=".MyService" />
<receiver android:name=".MyReceiver" />
<provider android:name=".MyProvider" />
</application>
</manifest>
在上面示例中,我們聲明了一個應(yīng)用程序的包名為"com.example.myapp",包含了一個MainActivity活動、一個SecondActivity活動、一個MyService服務(wù)、一個MyReceiver接收器和一個MyProvider內(nèi)容提供者。同時,我們還聲明了應(yīng)用程序需要使用INTERNET和ACCESS_NETWORK_STATE權(quán)限,并且指定了應(yīng)用程序的最低SDK版本為19,目標(biāo)SDK版本為33。
合并沖突規(guī)則
在Android開發(fā)中,當(dāng)使用多個庫或模塊時,可能會出現(xiàn)AndroidManifest.xml文件合并沖突。AndroidManifest.xml文件中包含了應(yīng)用程序的配置信息,當(dāng)合并沖突發(fā)生時,系統(tǒng)需要確定如何處理這些沖突。
合并沖突的規(guī)則(merge conflict rules)如下:
- Activity、Service、Receiver等組件的合并規(guī)則:
如果組件在不同的AndroidManifest.xml文件中定義,且具有相同的優(yōu)先級(priority),則會產(chǎn)生合并沖突。
如果組件在不同的AndroidManifest.xml文件中定義,但具有不同的優(yōu)先級,則系統(tǒng)會選擇具有較高優(yōu)先級的組件。
- 權(quán)限合并規(guī)則:
如果兩個AndroidManifest.xml文件中都聲明了相同的權(quán)限,且權(quán)限聲明不同,則會產(chǎn)生合并沖突。
如果兩個AndroidManifest.xml文件中都聲明了相同的權(quán)限,且權(quán)限聲明相同,則不會產(chǎn)生合并沖突。
其他元素的合并規(guī)則:
對于其他元素(例如<meta-data>、<uses-library>等),如果在不同的AndroidManifest.xml文件中定義了相同的元素,則會產(chǎn)生合并沖突。
在處理合并沖突時,需要仔細(xì)檢查合并后的AndroidManifest.xml文件,確保合并后的配置符合應(yīng)用程序的需求,并且沒有產(chǎn)生意外的沖突。
合并沖突標(biāo)記和選擇器
「合并沖突標(biāo)記(merge conflict marker)」:
- tools:replace:指示在合并時應(yīng)該替換現(xiàn)有的元素。
- tools:remove:指示在合并時應(yīng)該移除現(xiàn)有的元素。
- tools:keep:指示在合并時應(yīng)該保留現(xiàn)有的元素。
「選擇器(merge conflict selector)」用于指定在合并沖突時應(yīng)該采用哪個版本的元素。常見的選擇器包括:
- manifestmerger:指示在合并時應(yīng)該采用manifestmerger工具提供的默認(rèn)行為。
- highest:指示在合并時應(yīng)該選擇具有最高版本代碼的元素。
- strict:指示在合并時應(yīng)該嚴(yán)格按照規(guī)則進(jìn)行選擇,如果無法確定則會報錯。
例如,可以在AndroidManifest.xml中使用以下方式來標(biāo)記和選擇合并沖突:
<activity
android:name=".MainActivity"
tools:replace="android:label"
tools:node="merge">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
在上面的示例中,使用了tools:replace標(biāo)記來指示在合并時應(yīng)該替換android:label屬性,并使用了tools:node="merge"選擇器來指示采用manifestmerger工具提供的默認(rèn)行為。
更多資料信息參考:https://developer.android.google.cn/studio/build/manage-manifests?hl=zh-cn#merge_rule_markers