Android清單文件合併的那些事

来源:https://www.cnblogs.com/amyzhu/archive/2018/08/14/9471892.html
-Advertisement-
Play Games

APK文件只能包含一個AndroidManifest.xml文件,但Android Studio項目可以包含多個文件(通過buildSrc、導入的庫引入)。因此,在構建應用時,Gradle構建會將所有清單文件合併到一個封裝的APK的清單文件中。 清單文件合併優先順序 清單合併工具 可以使用Merged ...


APK文件只能包含一個AndroidManifest.xml文件,但Android Studio項目可以包含多個文件(通過buildSrc、導入的庫引入)。因此,在構建應用時,Gradle構建會將所有清單文件合併到一個封裝的APK的清單文件中。

清單文件合併優先順序

清單合併工具

  • 可以使用Merged Manifest視圖預覽合併清單的效果並找出衝突錯誤。

可以互相合併的基本清單文件,合併優先順序如下(優先順序由高到低):

  1. 清單文件構建變體
    如果變體有多個源集,其清單優先順序由高到低如下:
    a、構建變體清單文件(如 src/demoDebug)
    b、構建類型清單(如 src/debug/)
    c、產品定製清單(如 src/demo/)
    如果使用的是定製緯度,清單優先順序與每個維度在 flavorDimensions屬性中的列示順序(優先順序高到低)對應。
  2. 應用模塊的主清單文件
  3. 所包括庫中的清單文件:如果有多個庫,清單優先順序與依賴順序(庫出現在 Gradle dependencies 塊中的順序)匹配。

重要說明:build.gradle文件中的構建配置將替換合併清單文件中的任何對應屬性。如build.gradle文件中的minSdkVersion將替換清單元素中的匹配屬性。

合併衝突啟髮式演算法

合併工具行為:

  • 元素中的屬性絕不合併,僅使用優先順序最高的清單中的屬性。
  • 屬性、元素使用OR合併,因此如果出現衝突,系統將採用“true”並始終包括某個清單所需的功能或者庫。
  • 元素始終使用優先順序較高的清單中的值,但以下情況除外:
    • 如果低優先順序清單的 minSdkVersion值較高,除非應用 overrideLibrary合併規則。(minSdkVersion使用較大值)
    • 如果低優先順序清單的 targetSdkVersion值較低,合併工具將使用高優先順序清單中的值,但也會添加任何必要的系統許可權。(targetSdkVersion使用較大值)
  • 絕不會在清單之間匹配元素。每個元素都被視為唯一元素並添加到合併清單中。

重點:清單合併不依賴預設屬性值。因此,應該按照期望明確定義每個屬性。(每個屬性的預設值都會記錄在Manifest reference:https://developer.android.com/guide/topics/manifest/manifest-intro

合併規則標記

可以針對整個元素或者只對元素中的特定屬性應用標記。
所以標記都屬於Android tools命名空間,因此必須現在元素中聲明此命名空間:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    xmlns:tools="http://schemas.android.com/tools">

節點標記:

  • tools:node="merge" ——預設行為,合併此標記中的所有屬性以及所有嵌套元素。
  • tools:node="merge-only-attributes" ——僅合併此標記中的屬性,不合併嵌套元素
  • tools:node="remove" ——從合併清單中刪除此元素,可以刪除低優先順序清單的元素
  • tools:node="removeAll" ——會刪除與此元素類型相匹配的所有元素(同一父元素內)
  • tools:node="replace" ——完全替換低優先順序元素
  • tools:node="strict" ——標記元素在低優先順序清單中的配置與高優先順序清單不完全匹配,會觸發構建失敗。(預設行為會向合併清單添加額外屬性)

屬性標記:

  • tools:remove="attr1,attr2,..." ——刪除指定屬性
  • tools:replace="attr1,attr2,..." ——替換低優先順序清單指定屬性為當前清單中的屬性
  • tools:strict="attr1,attr2,..." ——當指定屬性在低優先順序清單與當前清單中不完全一致,觸發清單合併錯誤。是屬性合併的預設行為。
  • 支持對同一個元素使用多個標記

標記選擇器:

  • tools:selector="lib1,lib2,..." ——針對某個特定的導入庫應用合併規則標記
  • tools:overrideLibrary="lib1,lib2,..." ——替換指定導入庫的
    • 預設情況下,導入 minSdkVersion值高於主清單文件的庫時會出錯,而且無法導入該庫。
    • 使用 overrideLibrary,可以保持應用的低 minSdkVersion。

隱式系統許可權

隱式許可權:允許應用在無許可權的情況下繼續訪問特定API,前提是應用的targetSdkVersion設置為低於添加限制的SDK版本的值。

原則:

  • 如果低優先順序清單文件提供隱式許可權的 targetSdkVersion值較低,而且高優先順序清單沒有相同的隱式許可權,合併工具將向合併清單顯示添加系統許可權。

合併工具可以添加至合併清單的許可權列表:

低優先順序清單聲明 添加至合併清單的許可權
targetSdkVersion是3或者更低 WRITE_EXTERNAL_STORAGE, READ_PHONE_STATE
targetSdkVersion是15或者更低,並且使用READ_CONTACTS READ_CALL_LOG
targetSdkVersion是15或者更低,並且使用WRITER_CONTACTS WRITE_CALL_LOG

具體合併策略:

  • 合併:將所有非衝突屬性合併到同一標記中,然後按其各自的合併策略合併子元素。衝突的屬性使用合併規則標記進行合併。
  • 僅合併子項:不整合或合併屬性(僅保留高優先順序清單文件提供的屬性)
  • 保留

總結

檢查清單合併衝突:在Android Studio中打開AndroidManifest.xml文件,單機編輯器底部的 Merged Manifest選項卡。
合併策略:通過合併規則標記設置。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本節介紹Oracle子查詢的相關內容: 實例用到的數據為oracle中scott用戶下的emp員工表,dept部門表,數據如下: 一、子查詢 1、概念:嵌入在一個查詢中的另一個查詢語句,也就是說一個查詢作為另一個查詢的條件,這個查詢稱為子查詢。 那麼可以使用子查詢的位置有select後面、from後 ...
  • 在MongoDB3.6引入的新feature中,change stream無疑是非常吸引人的。 Change streams allow applications to access real-time data changes without the complexity and risk of ...
  • 之前只用phpmyadmin登錄本地的mysql,管理另一個遠程資料庫的時候發現,單純用命令行處理字元串、換行符實在是不好使,所以配置了遠程登錄mysql,很簡單的問題結果沒有搜到合適的方法,所以記錄下我的配置方式。 phpmyadmin/libraries/config.default.php $ ...
  • 今天來介紹新手學習hadoop的入門註意事項。這篇文章一來談談hadoop核心知識學習。 首先hadoop分為hadoop1.X和hadoop2.X,並且還有hadoop生態系統,那麼下麵我們以hadoop2.x為例進行詳細介紹: Hadoop的核心是mapreduce和hdfs。 Mapreduc ...
  • 一、sql server日期時間函數Sql Server中的日期與時間函數 1. 當前系統日期、時間 select getdate() 2. dateadd 在向指定日期加上一段時間的基礎上,返回新的 datetime 值 例如:嚮日期加上2天 select dateadd(day,2,'2004- ...
  • 一. 概述 在sql server 備份與恢復系列的第一篇里,有講到大容量模式下備份與還原的相關知識。這篇重點來演示在大容量模式下常用的備份與還原模式“完整備份+差異備份+日誌備份”。 在大容量恢復模式下,特別要註意的是在什麼情況下會導致數據還原丟失風險,帶著這個問題,來進行演示說明。備份策略如下圖 ...
  • 線上上進行DDL操作時,相對於其可能帶來的系統負載,其實,我們最擔心的還是MDL其可能導致的阻塞問題。 一旦DDL操作因獲取不到MDL被阻塞,後續其它針對該表的其它操作都會被阻塞。典型如下,如阻塞稍久的話,我們會看到Threads_running飆升,CPU告警。 如果發生線上上,無疑會影響到業務。 ...
  • 眾所周知,MongoDB包括社區版和企業版,但不止如此,MongoDB公司還有MongoDB Atlas:Database as a Service. MongoDB Atlas delivers the world’s leading database for modern application ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...