Android組件化搭建學習

什么是組件化?

為什么要用組件化?在項目的開發過程中,隨著開發人員的增多及功能的增加,如果提前沒有使用合理的開發架構,那么代碼會越來臃腫,功能間代碼耦合也會越來越嚴重,這時候為了保證項目代碼的質量,我們就必須進行重構

組件化的介紹

組件化是指解耦復雜系統時將多個功能模塊拆分,重組的過程。在Android工程上表現上就是把app按照其業務的不同,劃分為不同的Module

組件化的優點

  • 編譯速度 :我們可以按需測試單一模塊極大的提升了我們的開發速度
  • 超級解耦 :極度的降低了模塊之間的耦合,便于后期維護與更新
  • 功能重用 : 某一塊的功能在另外的組件化項目中使用只需要單獨依賴這一模塊即可
  • 便于團隊開發 : 組件化架構是團隊開發必然會選擇的一種開發方式,它能有效的使團隊更好的協作 組件化的框架 先看一下整體的結構

舉個例子:以某個直播平臺為例(沒有畫完整),

  • 基礎層:包含的是一些基礎庫以及對基礎庫的封裝,比如常用的圖片加載,網絡請求,數據存儲操作等等,其他模塊或者組件都可以引用同一套基礎庫,這樣不但只需要開發一套代碼,還解耦了基礎功能和業務功能的耦合,在基礎庫變更時更加容易操作。
  • 功能組件層:包含一些簡單的功能組件,比如視頻,支付等等
  • 業務組件層:這是通過模塊化劃分出來的,即根據業務的不同劃分為不同的模塊,一個具體的業務模塊會按需引用不同的組件,最終實現業務功能,如上有三個業務組件
  • app層:多個業務模塊,各自按需引用組件,最后將各個模塊統籌輸出 APP。

開始創建

啟動Android Studio創建一個Android項目,在項目里new Module,彈出的Create New Module中選擇Android Libary或Phone & Tablet,配置完成Module name等參數后點擊finish完成創建。

在上圖中,創建了common與order組件,common組件推薦作為一個基礎庫,第三方的一些都在該庫進行依賴,其它組件庫使用第三方庫直接引用common組件即可,一定程度上避免了組件庫重復引用的問題。

創建好的Module文件目錄下都有一個屬于自己的build.gradle文件,Gradle文件執行順序:settings.gradle > Project build.gradle > Module build.gradle。

在Module build.gradle中可以通過plugins修改當前Model為application或library,如下:

plugins {id 'com.android.application'  // application,可以作為app獨立運行id 'com.android.library'      // library,可作為aar包引入application包使用
}

com.android.application與com.android.library無法共存,同一個Model只能存在一個。不同的Model可以相互使用implementation引入到Model中,使得Model里的方法可以相互調用。

創建配置共享文件

在Android項目中,每個Module都有自己的.gradle文件,Gradle是一個使用Groovy語言(核心代碼是 Java )編寫的構建工具,具體使用教程可參考:來自Gradle開發團隊的Gradle入門教程

使用組件化的項目一般會有多個 Module ,為了使不同 Module 的版本庫配置使用相同的參數,需要在項目根目錄創建一個app_config.gradle,用以共享組件間相同的配置,避免過度碎片化。

app_config.gradle:ext {app_android = [compileSdk : 32,minSdk     : 21,targetSdk  : 32,versionCode: 1,versionName: "1.0"]
}

app_config.gradle 要想使其它 Module 都可以引用,需要在 Project 的 build.gradle 中對其進行全局引用。

apply from: 'app_config.gradle'

這樣一來,所有 Module 的 build.gradle 就可以使用 app_config.gradle 的共享參數了

android {compileSdk app_android.compileSdkdefaultConfig {minSdk app_android.minSdktargetSdk app_android.targetSdkversionCode app_android.versionCodeversionName app_android.versionName}
}

打包模式配置

組件化的優點中有一個加快編譯速度、提升開發效率的功能。

上面說到:在 Module 的 build.gradle 可以通過修改 application 或 library 控制當前組件為打包或集成模式。為了方便后續修改打包模式,app_config.gradle 增加了一個 isRelease 的打包配置參數。

ext {// 控制打包的模式isRelease = true
}

通過控制 isRelease 的布爾值,即可實現自動配置對應的 build.gradle 值,當然,前提是自動配置的代碼提前寫好。

// 公用的插件
plugins {id 'org.jetbrains.kotlin.android'
}
// 根據打包模式使用的插件
if (isRelease){apply plugin : 'com.android.library'
} else {apply plugin : 'com.android.application'
}

當模塊處于打包模式時,為避免安裝一次出現兩個應用圖標的問題,整個App工程的所有 AndroidManifest.xml 只能出現一個帶android.intent.action.MAIN 的 intent-filter。

針對這種情況需要額外對不同打包模式下的 AndroidManifest.xml 文件做處理。

為此,我們可以在除主工程以外,需要在 debug 期間作為 application 工程獨立運行項目的 build.gradle 文件添加以下配置。

android {// 源集 —— 用來設置Java目錄或者資源目錄sourceSets {main {if (!isRelease) {// 如果是組件化模式,需要單獨運行時使用該文件manifest.srcFile 'src/main/debug/AndroidManifest.xml'} else {// 集成化模式,整個項目打包時使用該文件manifest.srcFile 'src/main/AndroidManifest.xml'java {// release 時 debug 目錄下的Java文件不需要合并到主工程exclude '**/debug/**'}}}}
}

接著在main文件夾添加debug文件,將用到的 AndroidManifest.xml 文件放入里面,并將 src/main/AndroidManifest.xml 文件的配置設置為集成模式,可參考如下代碼:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"><application><activityandroid:name=".MainActivity"android:exported="true" ></activity></application>
</manifest>

到這里基本上就結束了,更多的Android組件化進階或者Android開發高級進階學習,可以參考《Android核心技術手冊》點擊可以查看詳細類目。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164296.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164296.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# 忽略大小寫

在 C# 中&#xff0c;你可以通過以下幾種方式來忽略大小寫&#xff1a; 使用 ToLower 或 ToUpper 方法將字符串轉換為全小寫或全大寫&#xff0c;然后進行比較。使用 Compare 或 CompareOrdinal 方法&#xff0c;并傳入正確的 StringComparer 實例以指示比較應該忽略大小寫。使…

Android 開發Java調用Kotlin提示包不存在

在kotlin代碼所在module的build.gradle設置 plugins {id org.jetbrains.kotlin.android }

Unity中Shader的Standard材質解析(一)

文章目錄 前言一、在Unity中&#xff0c;按一下步驟準備1、在資源管理面板創建一個 Standard Surface Shader2、因為Standard Surface Shader有很多缺點&#xff0c;所以我們把他轉化為頂點片元著色器3、整理只保留主平行光的Shader效果4、精簡后的最終代碼 前言 在Unity中&am…

基于Springboot+Vue選課系統

選課系統要求 (1)數據庫表&#xff1a;教師信息表、學生信息表、課程表、選課表 其中&#xff0c;教師信息表、學生信息表和選課表的數據需要提前設置&#xff0c;本題主要操作課程表 (2) 技術架構&#xff1a; 后臺使用springboot 前端使用vue-admin-template (3) 考試時間&…

鴻蒙(HarmonyOS)應用開發——安裝DevEco Studio安裝

前言 HarmonyOS華為開發的操作系統&#xff0c;旨在為多種設備提供統一的體驗。它采用了分布式架構&#xff0c;可以在多個設備上同時運行&#xff0c;提供更加流暢的連接和互動。HarmonyOS的目標是提供更高的安全性、更高效、響應更快的用戶體驗&#xff0c;并通過跨設備功能…

Vue3 響應式數據 reactive使用

ref 與 reactive 是 vue3 提供給我們用于創建響應式數據的兩個方法。 reactive 常用于創建引用數據&#xff0c;例如&#xff1a;object、array 等。 reactive 則是通過 proxy 來實現的響應式數據&#xff0c;并配合 reflect 操作的源對象。 reactive 創建引用數據&#xff1…

【實戰精選】掌握圖像風格遷移:構建基于生成對抗網絡的系統

1.研究背景與意義 隨著計算機技術的不斷發展&#xff0c;圖像處理和計算機視覺領域取得了長足的進步。圖像風格遷移是其中一個備受關注的研究方向&#xff0c;它可以將一幅圖像的風格特征應用到另一幅圖像上&#xff0c;從而創造出新的圖像。這項技術具有廣泛的應用前景&#…

lazada商品詳情數據接口(lazada.item_get)

Lazada商品詳情數據接口是Lazada電商平臺提供的一個API接口&#xff0c;用于獲取商品詳細信息。通過這個接口&#xff0c;開發者可以獲取Lazada平臺上商品的豐富信息&#xff0c;包括商品名稱、價格、庫存、描述、圖片等。這個接口使用RESTful風格&#xff0c;并通過HTTP協議進…

經過了多少輪洗牌后,序列中間位置的牌面為9 ← random.shuffle()

【題目描述】 有牌面為1~9的撲克牌&#xff0c;現在進行洗牌&#xff0c;并存于一個序列中。 請輸出經過了多少輪洗牌后&#xff0c;序列中間位置的牌面為9。【算法分析】 Python 中使用 random 模塊中的 shuffle 函數&#xff0c;可隨意排列列表中的元素。 本題中的輸出&#…

【基礎知識】AB軟件RSLinx的版本說明

哈嘍&#xff0c;大家好&#xff0c;我是雷工&#xff01; 之前對AB的軟件了解比較少&#xff0c;在工作中未接觸過&#xff0c;最近一次現場勘察時&#xff0c;有很多中控系統都是AB的&#xff0c;借此機會對AB軟件有了些許了解。 一、RSLinx是什么軟件&#xff1f; RSLinx是…

fork介紹,返回值問題,寫時拷貝,進程切換,子進程開始執行的位置,子進程的用途

目錄 fork 介紹 fork的返回值問題 介紹 fork()時,系統要做什么 數據是否要獨立 如果共享的話,就會出現問題! 寫時拷貝 引入 介紹 舉例(fork返回值) fork返回的值是什么 創建失敗的原因 子進程執行位置從哪里開始 引入 進程切換 子進程執行的位置 子進程的…

燙傷事件屢有發生,覓光推脫責任,稱是用戶操作失誤

提及“雙十一”“直播間”等關鍵詞&#xff0c;人們常常將其與“低價”“薅羊毛”等字眼掛鉤。而在近日&#xff0c;科技美容品牌AMIRO覓光&#xff08;下稱“覓光”&#xff09;卻上演了一出“反向薅羊毛”的戲碼&#xff0c;因線上線下渠道相差超千元的價格差飽受爭議。 自橫…

camera-caps:Jetson設備上的一種實用的V4L2可視化界面

camera-caps&#xff1a;Jetson設備上的一種實用的V4L2可視化界面 github地址是&#xff1a; https://github.com/jetsonhacks/camera-caps 注意&#xff1a;Jetpack5.x需要選擇tag 5.x版本

走迷宮(BFS寬度優先搜索)

給定一個 nm 的二維整數數組&#xff0c;用來表示一個迷宮&#xff0c;數組中只包含 0 或 1&#xff0c;其中 0 表示可以走的路&#xff0c;1 表示不可通過的墻壁。 最初&#xff0c;有一個人位于左上角 (1,1)處&#xff0c;已知該人每次可以向上、下、左、右任意一個方向移動…

MySQL數據庫約束你真的懂嗎?

??????今天給各位帶來的是關于數據庫約束方面的知識 清風的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能對你有所幫助&#xff0c;有不足的地方還請各位看官多多指教&#xff0c;大家一起學習交流&#xff01; 動動你們發財的小手&#xff0c;點點關…

JMeter接口測試之文件上傳

最近用JMeter做接口測試&#xff0c;頻繁遇到了文件上傳的接口&#xff0c;與其他一般接口的處理方式不一樣&#xff0c;想著分享下&#xff0c;希望能給測試同學一點啟發。 文章將圍繞三個部分進行展開&#xff1a; 一、用戶場景 二、接口請求參數 三、JMeter腳本編寫步驟…

C語言每日一題(36)隊列實現棧功能

力扣 225 用隊列實現棧 題目描述 請你僅使用兩個隊列實現一個后入先出&#xff08;LIFO&#xff09;的棧&#xff0c;并支持普通棧的全部四種操作&#xff08;push、top、pop 和 empty&#xff09;。 實現 MyStack 類&#xff1a; void push(int x) 將元素 x 壓入棧頂。int…

vue2系列 — 自定義指令

https://v2.cn.vuejs.org/v2/guide/custom-directive.html <div v-example:foo.bar"baz">vue 自定義指令的鉤子 bind&#xff1a; 當 v-XXX 指令綁定到節點上時 觸發inserted&#xff1a;被綁定元素插入父節點時調用update&#xff1a;所在組件的 VNode 更新…

使用nprogress實現請求進度條

一、安裝nprogress npm i nprogress 二、 在axios的請求攔截器中使用nprogress 如果對于axios的請求和響應攔截器的使用不了解的&#xff0c;可以看這篇文章&#xff1a; axios二次封裝配置請求攔截器和響應攔截器-CSDN博客 nprogress上有兩個有用的方法&#xff1a; star(…