主頁 > 移動端開發 > Android 組件化 重構 筆記

Android 組件化 重構 筆記

2021-02-20 11:29:43 移動端開發

上篇文章 Android 組件化 之 如何優雅的實作同級組件的通信 講到

寫代碼這么多年,一個重要感受是「不要過度封裝!」
不僅僅是說業務組件不多,沒必要用這么復雜的組件化方案,
我甚至覺得組件化都不是必須的,


組件化的3條好處

  1. 一個工程(project)里面需要選擇依賴哪幾個組件,然后打成不同的包,
  2. 由第一條引申,如果有需求「每個組件可以單獨打個包來測驗」,
  3. 加快了增量編譯的速度,

第一條「打成不同的包」是很廣義的,除了依賴這一個工程打出不同包,還有比如有一些base組件,能自己專案里用,還能打出一個獨立的aar供其他專案用,也算作打成不同的包,這些能抽離出來的base代碼就可以作為一個組件,



組件化的犧牲

1. 如果分包能解決,為什么要犧牲便利性,抽離出組件來,

很多文章說組件化可以 「解耦」、「業務分層」、「業務隔離」、「代碼變的更好維護」,這些其實都是可以通過分包(Package)解決的,
約定好 A小姐 負責 com.xxx.packageA 下的代碼,B小姐 負責 com.xxx.packageB 的代碼,甚至可以寫個腳本,git clone 下載下來工程后,立刻執行 chmod -r 刪去某些路徑的寫權限,避免無意修改別人負責的代碼區域,

抽離出組件后并不是一蹴而就的事情,要一直投入精力保持組件成功運行也是需要不少成本的,

比如說我們的資源檔案,一般會要求加模塊名字的前綴,避免組件化專案運行程序中資源沖突,(誰讓resourcePrefix它只管檢驗不幫忙動手啊)

實戰中某個業務module里的UI或是什么代碼,需要變成通用的,供多個業務模塊使用,要下沉到 lib_base 模塊了,這就需要轉移各種資源到 lib_base,這就是要逐個檔案、逐個資源重命名,還要牽扯到所有用到這個資源的代碼,改一個資源名就可能是10+個甚至幾十+個檔案的變動,IDE是很智能的都幫忙改了,但是自己提交代碼前檢查 & 別人code review審查平白無故又要多N個檔案的作業量,這種痛苦我深有體會,

2. 關于組件獨立運行

有一些專案改造成組件化,實作的效果是「每個業務組件 + App殼組件都可以單獨打出一個App」,可以方便地單獨測驗某個業務,設想跟寫單元測驗代碼很相似,
然而效果是測驗某個業務內容后,集成到主app里能保證不出問題?不能,這時候又要跑一遍集成后的測驗流程,后面甚至發現單獨測驗業務模塊并不能省時間,干脆省略了,久而久之組件獨立運行成為了擺設,

3. 關于組件獨立運行

說組件化可以加快增量編譯速度,其實作在Android studio的instant run和越來越優化成熟的編譯機制,甚至買部好點貴點的電腦,都可以解決這個問題了,而且如果組件化維護不當,到處都是 api 引入組件,那編譯速度反而有可能延長,




場景案例

寫了這么多組件化的壞話,我也不是說組件化一無是處,
而是我覺得,判斷需不需要組件化的唯一一條要素是,當你需要使用這個工程打出不同的app的時候,才需要組件化,
這里我舉一個組件化完美適用的場景,
組件化完美場景案例
這是一款小說閱讀類App,最下面 lib_base 基礎組件,有3個平級的業務組件 lib_user(用戶)、lib_read(閱讀)、lib_ad(廣告),上面有3個可以打成不同 App 的組件,

  1. 國內版本:用戶、閱讀、廣告都用到,所以三者都參考到,打出一個國內App,
  2. 國外版本:不允許有廣告啊,會被下架啊,排除掉廣告組件,參考用戶和閱讀組件,打出一個國外版本App,
  3. 為了推廣,為了上架谷歌市場單本作品付費閱讀,甚至可以沒有用戶模塊,作品資源直接集成到apk里,1美元你直接買斷這部作品了,無需聯網無需登錄離線即可閱讀,只引入閱讀組件,打出一個單部作品的App,

從這個案例可以看到,核心原則是「是否需要依賴不同的業務層組件,打成不同的包」,
以后再新增的功能,比如說 「社交」、「購物」,應不應該獨立成組件,都應該按照這個原則來,是不是有的App需要這個組件,有的App不需要這個組件,

比如說 「登錄功能」,需要獨立封裝成一個 登錄組件 嗎?

如果沒有要打包一個沒有登錄功能的App,不需要設計單獨的 「登錄組件」,

如果你的專案 登錄 是 必須 的功能,否則后續頁面都打不開,就更不應該設計單獨的 登錄組件了,這樣的登錄功能,應該放 lib_base 里,屬于公共能力的一部分,不應該跟業務組件平級,




現象與問題

然后講講最近正在進行的一個組件化重構的方案,App有3個重要組件,「搶單」、「做單」、「我的」,跟小說閱讀類的App的「書城」、「書架」、「我的」很像,所以我拿這個小說閱讀類App當案例繼續說了,
小說閱讀類App,重構前
重構前有這幾個模塊

  1. 書城:用于找書,
  2. 書架:自己收藏的,最近閱讀的書,最重要的閱讀功能也放到這個組件里,
  3. 我的:個人頁面,

這樣的專案結構看起來還是很清晰明了的,但是運行時間長了會發現有一個問題,
書城書架,這兩個組件很特殊,有很多功能都是重合的,比如說對于作品的介紹頁,作品章節串列頁面,這些功能因為共用,都慢慢轉移到了 lib_base 里面,導致 lib_base 越來越臃腫,
并且這種功能只用于書城書架,并不能用在我的組件里,如果以后要添加任務社區組件,也不會用到這些頁面的功能,


解決

lib_base 越來越臃腫了怎么辦?
按照我上篇文章 2.3 ARouter的服務管理 (更合適的介面定義) 講的——定義好每個組件的能力,把「這個組件能提供的能力」封裝成一個介面類放到base組件里,這是一種好方法,但是還有一些問題解決不了,
例如一些物體類(BookInfo、AuthorInfo),一些共用的資源檔案,圖片、UI布局、shape、文案,還是要放到 lib_base里,因為服務管理不能提供物體類和資源檔案的共用,
放 lib_base 最不好的一點是,這些資源只有書城書架兩個組件用到,我的組件不會用到,它們不能成為 通用資源

對于這種專案,某部分組件依賴和共用很嚴重的,可以按照 2.4 ARouter的服務管理 (還能優化的空間) 來設計,

小說閱讀類App,重構后
作品詳細介紹頁面作品章節串列作者詳細介紹這3個頁面Activity放到業務組件里,可以使用ARouter跳轉到,
而相關能力介面、物體Bean、resources等這些共用的資源,就可以放到export層里面了,
比如這里我們開發小組討論協商,先劃分一些功能歸屬,
module_書城_export 負責 作品詳細介紹頁面作者詳細介紹,所以 BookDetailEntity.kt、AuthorDetailEntity.kt 放到這個組件里,
module_書架_export 負責 作品章節串列,所以 BookChapter.kt 放到這個組件里,




代碼結構

代碼結構

1.Provider

使用ARouter的服務管理能力,在export組件創建一個Provider介面,在這里是 BookshelfProvider.kt,在這個案例里提供了的能力如上圖,

一個重點是,這些能力可以是立即return回傳回來,也可以通過設立回呼Callback,或者是利用rxjava的一個請求,

module_bookshelf_export 定義能力介面,module_bookshelf 寫具體實作這些能力的方法,

如果一個介面過于雜亂,還可以分為多個,
舉個例子創建一個provider包,有3個Interface檔案,對應三個細分能力的分類

  1. BookHistoryProvider.kt 表示 書架Tab 里面的 歷史閱讀書籍 串列
  2. BookLocalProvider.kt 表示 書架Tab 里面的 手機本地書籍 串列
  3. BookSubscriptionProvider.kt 表示 書架Tab 里面的 用戶訂閱書籍 串列

2.物體

比如 getBookShelfList 獲取書架的所有作品串列 這個介面,不可能回傳字串讓其他組件決議吧,所以相關的共用的物體類也應該定義在這里,

3.資源檔案

各類資源檔案,包括自定義View,這類都是Provider無法提供的能力,也應該定義在這里,




總結

  1. 判斷某塊功能需不需要獨立成組件?判斷標準是 「是否需要依賴不同的業務層組件,打成不同的包」
  2. 代碼應該放在哪里:
    區分:哪些是所有業務組件都需要的能力,哪些是一部分業務組件需要的能力,哪些是只有自己用的能力,
使用范圍放置位置
只有自己使用module_業務
需要給個別業務組件使用module_業務_export
全部業務組件都使用lib_base

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/261411.html

標籤:其他

上一篇:android接入websocket步驟,建立一個長連接(帶心跳檢測)從服務器端接收訊息

下一篇:Android開發 面試必問的Handler訊息機制

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more