AndroidManifest合并原理

3.11 AndroidManifest合并原理

Android Studio工程通常包含多個AndroidManifest文件蜂筹,最終構(gòu)建成APK時力细,會合并成一個AndroidManifest文件纪铺。但是可能很多人應該都不知道是怎么合并的,本文將為大家揭開神秘面紗料按。

3.11.1 合并沖突規(guī)則(merge conflict rules)

合并沖突篡殷,是指多個Manifest文件中含有同一屬性但值不同時,默認合并規(guī)則解決不了從而導致的沖突藻治。當沖突發(fā)生時碘勉,高優(yōu)先級的Manifest屬性值會覆蓋低優(yōu)先級屬性值。這個優(yōu)先級規(guī)則由高到低依次是:

buildType下的Manifest設置->productFlavor下的Manifest設置->主工程src/main->dependency&library

默認合并沖突規(guī)則如下:

當然還存在例外情況:

  • uses-feature android:required和uses-library android:required默認值都是true桩卵,根據(jù)OR規(guī)則合并
  • 如果不指定uses-sdk验靡,默認的minSdkVersion和targetSdkVersion值為1,當發(fā)生沖突時將使用高優(yōu)先級的值雏节。若不指定targetSdkVersion胜嗓,其值等于targetSdkVersion
  • 當library工程的minSdkVersion比主工程src/main中的minSdkVersion低時會產(chǎn)生沖突,此時需要添加overLibrary標記解決沖突
  • 當library工程的targetSdkVersion比主工程src/main中的大時钩乍,合并過程會增加一些權限保證library工程能正常運行
  • 每個Manifest文件只和其子Manifest文件的屬性合并
  • <intent-filter>的合并規(guī)則是疊加而不是覆蓋

3.11.2 合并沖突標記和選擇器(merge conflict marker&selector)

合并沖突標記辞州,是android tools namespace中的一個屬性,用來解決默認沖突規(guī)則解決不了的沖突寥粹。主要包含以下幾個:

  • merge:默認合并操作变过。
  • replace:高優(yōu)先級替換低優(yōu)先級Manifest文件中的屬性
  • strict:屬性相同而值不同時會報錯埃元,除非通過沖突規(guī)則解決了
  • merge-only:僅合并低優(yōu)先級的屬性
  • remove:移除指定的低優(yōu)先級的屬性
  • remove-All:移除相同節(jié)點類型下所有低優(yōu)先級的屬性

一般節(jié)點層面默認使用merge,屬性層面默認使用strict媚狰。下面看幾個例子:

  1. 使用replace標記解決android:icon和android:label屬性沖突
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.android.tests.flavorlib.app"
   xmlns:tools="http://schemas.android.com/tools">

   <application
       android:icon="@drawable/icon"
       android:label="@string/app_name"
       tools:replace="icon, label">
       ...
   </application>
</manifest>
  1. 以下代碼塊中岛杀,src manifest會覆蓋library的<uses-sdk>。(默認情況下是不允許低優(yōu)先級的minSdkVersion大于高優(yōu)先級的崭孤,否則會報錯类嗤。)
//src manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.android.example.app"
   xmlns:tools="http://schemas.android.com/tools">
   ...
   <uses-sdk android:targetSdkVersion="22" android:minSdkVersion="2"
         tools:overrideLibrary="com.example.lib1, com.example.lib2"/>
   ...
</manifest>
//Library manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.lib1">
    ...
    <uses-sdk android:minSdkVersion="4" />
    ...
</manifest>
  1. 以下代碼塊表示,移除library1中的permissionOne權限裳瘪,而其他模塊下該權限不受影響土浸。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.android.example.app"
   xmlns:tools="http://schemas.android.com/tools">
   ...
   <permission
       android:name="permissionOne"
       tools:node="remove"
       tools:selector="com.example.lib1">
       ...
   </permission>
</manifest>

3.11.3 向AndroidManifest文件注入build變量值

注入build變量值通常需要使用manifestPlaceholders,applicationId屬性除外彭羹。另外支持部分注入黄伊,如android:authority="com.acme.${localApplicationId}.foo"。仍然是看幾個例子:

  1. 注入applicationId
<activity android:name=".Main">
    <intent-filter>
        <action android:name="${applicationId}.foo"></action>
    </intent-filter>
</activity>

Gradle build file:

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    productFlavors {
        flavor1 {
            applicationId = "com.mycompany.myapplication.productFlavor1"
        }
    }
    ...
}

注入之后的manifest為:

<action android:name="com.mycompany.myapplication.productFlavor1.foo"/>
  1. 注入其他屬性
    Gradle build file:
android {
    defaultConfig {
        manifestPlaceholders = [ activityLabel:"defaultName"]
    }
    productFlavors {
        free {
        }
        pro {
            manifestPlaceholders = [ activityLabel:"proName" ]
        }
    }
    ...
}

Placeholder in the manifest file:

<activity android:name=".MainActivity" android:label="${activityLabel}" />
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末派殷,一起剝皮案震驚了整個濱河市还最,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毡惜,老刑警劉巖拓轻,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異经伙,居然都是意外死亡扶叉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門帕膜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枣氧,“玉大人,你說我怎么就攤上這事垮刹〈锿蹋” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵荒典,是天一觀的道長酪劫。 經(jīng)常有香客問我,道長寺董,這世上最難降的妖魔是什么覆糟? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮螃征,結(jié)果婚禮上搪桂,老公的妹妹穿的比我還像新娘。我一直安慰自己盯滚,他們只是感情好踢械,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著魄藕,像睡著了一般内列。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上背率,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天话瞧,我揣著相機與錄音,去河邊找鬼寝姿。 笑死交排,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的饵筑。 我是一名探鬼主播埃篓,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼根资!你這毒婦竟也來了架专?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤玄帕,失蹤者是張志新(化名)和其女友劉穎部脚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裤纹,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡委刘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹰椒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锡移。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吹零,靈堂內(nèi)的尸體忽然破棺而出罩抗,到底是詐尸還是另有隱情,我是刑警寧澤灿椅,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布套蒂,位于F島的核電站,受9級特大地震影響茫蛹,放射性物質(zhì)發(fā)生泄漏操刀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一婴洼、第九天 我趴在偏房一處隱蔽的房頂上張望骨坑。 院中可真熱鬧,春花似錦、人聲如沸欢唾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽礁遣。三九已至斑芜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祟霍,已是汗流浹背杏头。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沸呐,地道東北人醇王。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像崭添,于是被迫代替她去往敵國和親寓娩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,799評論 25 707
  • Android Studio工程通常包含多個AndroidManifest文件滥朱,最終構(gòu)建成APK時根暑,會合并成一個A...
    某學姐閱讀 8,577評論 1 10
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)徙邻,斷路器排嫌,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Gradle是什么? Android Studio 基于 Gradle 構(gòu)建系統(tǒng)缰犁,并通過 Android Grad...
    CP9閱讀 1,230評論 0 3
  • 通州小學 六(12)班 陳果兒 親愛的媽媽淳地,這次去內(nèi)蒙古旅行,我想帶上《火印》這本書帅容,我想看看內(nèi)蒙古大草原與...
    負暄jxy閱讀 703評論 1 3