Android模塊化實現方案深度分析

模塊化是現代 Android 開發應對項目復雜度激增、團隊協作效率、編譯速度瓶頸、功能復用與動態化等挑戰的核心架構思想。其核心目標是高內聚、低耦合、可插拔、易維護

一、模塊化的核心價值與目標

  1. 降低復雜度: 將龐大單體應用拆分為獨立、職責清晰的模塊。
  2. 加速編譯: 僅編譯修改模塊及其依賴,極大縮短增量開發編譯時間。
  3. 提升協作: 團隊可并行開發不同模塊,減少代碼沖突,明確邊界。
  4. 功能復用: 基礎模塊(網絡、存儲、UI組件)可在多個應用或模塊間復用。
  5. 動態部署/按需加載: 部分模塊化方案支持插件化,實現功能熱更新或按需下載。
  6. 提高可測試性: 模塊獨立性強,更容易進行單元測試和模塊集成測試。
  7. 明確邊界,強制解耦: 模塊化通過物理隔離(代碼/資源)和依賴規則強制實現解耦。

二、模塊化的核心概念與層級

模塊化通常呈現金字塔結構,依賴方向自上而下:

  1. 基礎層:

    • 模塊類型: 基礎組件庫 (Base Library Module), 核心能力庫 (Core Module - 如網絡庫 net, 存儲庫 storage, 圖片庫 image, 工具庫 util)
    • 職責:
      • 提供通用功能、工具類、擴展函數。
      • 封裝底層 SDK (如 Retrofit, OkHttp, Room, Glide) 并提供統一接口。
      • 定義核心模型 (Model)、基礎 BaseActivity/BaseFragment、通用 ViewModel
      • 特點: 最底層,無業務邏輯不依賴任何其他業務模塊,甚至不依賴 Android Framework (純 Java/Kotlin 模塊)。被所有上層模塊依賴。
  2. 業務基礎層 (可選但推薦):

    • 模塊類型: 業務公共庫 (Business Common Module)
    • 職責:
      • 提供與具體業務領域相關但被多個業務模塊復用的組件和邏輯。
      • 例如:用戶信息管理模塊 (user)、支付能力模塊 (pay)、分享能力模塊 (share)、埋點統計模塊 (analytics)、推送模塊 (push)。
      • 包含這些能力的接口定義、默認實現、共享數據模型 (UserInfo)。
    • 特點: 依賴基礎層模塊。不包含具體 UI 流程,為上層業務模塊提供公共業務能力。
  3. 業務層:

    • 模塊類型: 業務功能模塊 (Feature Module)
    • 職責:
      • 實現具體的、獨立的業務功能單元。
      • 例如:首頁模塊 (home)、商品模塊 (product)、購物車模塊 (cart)、訂單模塊 (order)、個人中心模塊 (profile)、搜索模塊 (search)。
      • 包含該功能的所有 UI (Activity/Fragment/View)、業務邏輯 (ViewModel/Presenter/UseCase)、路由跳轉、模塊內部狀態管理。
    • 特點:
      • 依賴基礎層業務基礎層(如有)。
      • 原則上不直接依賴其他業務功能模塊 (這是解耦的關鍵)。
      • 通過依賴倒置 (DIP)服務發現機制間接使用其他業務模塊的能力。
      • 可獨立編譯運行 (com.android.applicationcom.android.dynamic-feature)。
  4. 應用層:

    • 模塊類型: 主工程模塊 (App Module)
    • 職責:
      • 應用的唯一入口點 (Application 類)。
      • 集成所有需要打包進初始 APK 的業務功能模塊 (或作為 Dynamic Feature 的入口)。
      • 負責全局初始化 (onCreate 中初始化基礎庫、路由框架、埋點等)。
      • 實現 Application 生命周期回調。
      • 管理應用級配置 (如 AndroidManifest.xml 合并、簽名配置)。
      • 在非插件化方案中,通常是唯一 com.android.application 模塊。
    • 特點: 依賴所有需要打包進初始 APK 的業務層模塊(或其接口/空殼)以及基礎層業務基礎層

三、關鍵實現方案與技術選型

模塊化不僅僅是代碼拆分,更需要配套的架構模式和工具鏈支持模塊間的通信依賴管理集成

  1. 組件化方案 (主流方案):

    • 核心思想: 將業務功能模塊編譯為 Android Library (com.android.library)Dynamic Feature Module (com.android.dynamic-feature),在主 App 模塊中依賴或按需加載。
    • 關鍵技術與模式:
      • Gradle 多模塊配置:
        • 使用 settings.gradle 管理所有模塊。
        • 每個模塊有自己的 build.gradle,定義依賴、編譯配置、資源前綴 (resourcePrefix) 避免沖突。
        • 使用 buildSrcVersion Catalogs (TOML) 統一管理依賴版本和插件版本,確保所有模塊使用一致依賴。
      • 依賴注入 (DI):
        • 目的: 解耦模塊間的直接依賴,通過接口注入實現。
        • 方案: Dagger Hilt (Google 官方推薦,基于 Dagger 簡化)、Koin (純 Kotlin, DSL 友好)。在 App Module 中定義全局 Component,在各模塊中使用 @Injectby inject() 獲取依賴。
      • 路由框架 (模塊間通信核心):
        • 目的: 實現 Activity/Fragment 跳轉、跨模塊服務調用。
        • 原理: 基于 URI Scheme 或注解,維護路由表 (編譯時生成或運行時注冊)。
        • 主流方案:
          • ARouter (阿里開源,功能強大,文檔豐富,支持攔截器、服務發現、自動生成文檔)。
          • DeepLinkDispatch (Airbnb 開源,Airbnb 自身使用)。
          • Navigation Component (Google Jetpack 組件,原生支持,但跨模塊能力較弱,需結合 DeepLink 或自定義)。
        • 關鍵功能: 頁面跳轉 (顯式/隱式 Intent 替代)、服務調用 (獲取其他模塊提供的接口實現)、攔截器 (登錄校驗、埋點)、參數自動注入。
      • 接口下沉 (依賴倒置):
        • 目的: 徹底避免業務模塊間的直接源碼級依賴。
        • 實現:
          • 創建 接口模塊 (module-interface),只包含接口定義 (interface IUserService, IProductService) 和必要的數據模型 (User, Product)。
          • 業務模塊 (user, product) 依賴 接口模塊,并實現其暴露的接口 (UserServiceImpl, ProductServiceImpl)。
          • 服務消費方模塊 (order) 只依賴 接口模塊。運行時通過 DI 容器 (Hilt/Koin) 或路由框架的服務發現功能獲取接口的具體實現。
      • 資源隔離與沖突解決:
        • 資源前綴 (resourcePrefix): 在 Library Module 的 build.gradle 中設置 resourcePrefix "module_prefix_",強制資源命名以該前綴開頭 (e.g., module_home_title)。
        • 命名空間 (namespace): Android Gradle Plugin 7.0+ 引入,替代 package 用于 R 類生成 (com.example.home -> R.id.module_home_title 變成 com.example.home.R.id.title),更徹底避免資源 ID 沖突。
      • 單模塊獨立調試:
        • 目的: 開發某個業務模塊時,無需編譯整個 App,提升效率。
        • 實現:
          • 將業務模塊臨時設置為 com.android.application (通過 gradle.properties 定義開關變量)。
          • 為該模塊創建單獨的 debug/AndroidManifest.xml,指定一個 Launcher Activity 作為入口。
          • 通過 sourceSets 在獨立調試時引入需要的模擬依賴或樁實現。
          • 使用 includeBuild (復合構建) 或 buildSrc 提供模擬實現。
      • Dynamic Feature Modules (動態功能模塊 - DFM):
        • 目的: 實現功能按需下載和安裝 (Google Play 的 Play Feature Delivery)。
        • 原理: 使用 com.android.dynamic-feature 插件。模塊在初始 APK 之外,可通過 Play Core Library 按需下載安裝。
        • 關鍵點: 需要處理模塊間代碼/資源訪問、安裝狀態監聽、SplitCompat 支持。
  2. 插件化方案 (更高級的動態化):

    • 核心思想: 將部分功能打包成獨立的 APK 或特定格式文件 (插件),宿主 App 在運行時動態加載、執行這些插件。
    • 目的: 實現更徹底的功能熱更新、熱修復、業務動態部署、功能降級、AB 測試、減小初始包體積。
    • 技術挑戰: 遠高于組件化,涉及:
      • 類加載: 自定義 ClassLoader (如 DexClassLoader) 加載插件 DEX。
      • 資源加載: Hook AssetManager 或創建新實例,添加插件資源路徑 (addAssetPath)。解決資源 ID 沖突 (通常插件資源 ID 需固定或宿主重分配)。
      • 組件生命周期管理: Hook InstrumentationActivityThread 等系統機制,欺騙 AMS 管理插件 Activity/Service/Provider 的生命周期 (占坑 Activity/Stub)。
      • so 庫加載: 處理插件 Native 庫的加載路徑。
      • 插件管理: 插件的下載、安裝、升級、卸載、安全校驗。
    • 主流方案 (多來自國內大廠,開源方案穩定性/兼容性需謹慎評估):
      • RePlugin (360):宣稱“全面插件化”,兼容性較好,坑相對少。
      • VirtualAPK (滴滴):支持四大組件,資源方案較優。
      • Shadow (騰訊):更徹底的動態化框架,支持任意代碼和資源的動態加載,對插件代碼無侵入。
    • 優缺點:
      • 優點: 動態性最強,功能隔離最徹底,初始包最小。
      • 缺點: 技術復雜度極高,兼容性問題突出 (尤其新 Android 版本),調試困難,安全風險增加 (惡意插件),Google Play 政策風險 (禁止非 Google 自身機制的代碼熱更新)。
    • 適用場景: 對動態化要求極其嚴苛的場景 (如大型超級 App 接入大量第三方服務),且團隊技術實力雄厚,能應對復雜問題和政策風險。中小團隊慎用
  3. 其他模式與架構:

    • MVx + Clean Architecture: 模塊內部通常采用 MVVM (配合 Jetpack ViewModel/LiveData/DataBinding) 或 MVI,并結合 Clean Architecture 的分層思想 (Data/Domain/Presentation) 組織代碼,提升模塊內部的可測試性和可維護性。
    • Monorepo 與 Polyrepo:
      • Polyrepo: 每個模塊一個獨立的 Git 倉庫。依賴通過 Maven/JitPack 等二進制倉庫管理 (版本發布)。優點: 權限控制細,獨立發布。缺點: 跨模塊修改繁瑣 (需多個 PR),依賴版本管理復雜。
      • Monorepo: 所有模塊在一個 Git 倉庫中。優點: 原子提交 (Atomic Commit),跨模塊重構方便,依賴管理簡單 (源碼依賴)。缺點: 權限控制較粗,倉庫體積大,CI/CD 構建可能變慢。Android 大型項目多傾向 Monorepo (使用 Git Submodule 或更現代工具如 Repo (Google), Bazel, Gradle Composite Builds 管理)。

四、模塊化演進路徑與實施策略

  1. 評估與規劃:

    • 分析現有單體應用痛點 (編譯慢?耦合嚴重?團隊協作難?)。
    • 明確模塊化目標 (加速編譯?功能復用?動態化?)。
    • 設計模塊劃分方案 (識別核心層、業務基礎層、業務功能模塊),繪制依賴關系圖。
    • 選擇合適的技術棧 (組件化 vs 插件化? ARouter vs DeepLinkDispatch? Hilt vs Koin?)。
  2. 基礎設施搭建:

    • 搭建 Gradle 多模塊工程結構。
    • 配置 buildSrcVersion Catalogs 統一依賴管理。
    • 集成選定的路由框架 (ARouter/DeepLinkDispatch) 和 DI 框架 (Hilt/Koin)。
    • 制定模塊資源命名規范 (前綴/命名空間)。
    • 配置單模塊獨立調試環境。
  3. 漸進式拆分:

    • 自底向上: 優先抽取基礎層 (base, core, common) 和業務基礎層 (user, pay) 為獨立模塊。
    • 自頂向下: 選擇耦合度相對較低、邊界清晰的功能點 (如 settings, feedback),將其拆分為第一個業務功能模塊。
    • 關鍵: 在拆分過程中,嚴格應用依賴倒置原則。使用接口模塊 (xxx-interface) 解耦業務模塊間的直接依賴。通過路由框架和 DI 實現間接通信。
    • 逐步替換: 將原 App Module 中的功能代碼遷移到新模塊,主 App 逐漸變為純粹的集成和初始化入口。
  4. 通信與解耦:

    • 頁面跳轉: 強制使用路由框架,禁止 Intent 直接引用其他模塊的 Activity.class
    • 數據傳遞: 使用路由框架的 withXxx() 傳遞基礎類型或 Parcelable 對象。復雜數據通過接口調用或全局狀態管理 (ViewModel + SavedStateHandle / 單例謹慎使用)。
    • 服務調用: 定義接口在 xxx-interface 模塊,實現在具體模塊,通過 DI 或路由框架的服務發現獲取實現。
    • 事件通知: 使用輕量級事件總線 (LiveDataEvent 包裝 / Flow SharedFlow / RxJava Subject) 或更健壯的 EventBus (需注意內存泄漏和濫用問題) 進行模塊間松散通知。優先考慮接口回調或狀態管理。
  5. 構建優化:

    • 配置開關: 使用 gradle.properties 或環境變量控制模塊是否參與編譯 (e.g., includeHome=true)。
    • 按需編譯: 利用 Gradle 增量編譯特性。使用 --parallel--configure-on-demand
    • 構建緩存: 啟用 Gradle Build Cache (本地/遠程) 和 Android Build Cache。
    • 使用 KSP/KAPT 替代 APT: KSP (Kotlin Symbol Processing) 通常比 KAPT (Kotlin Annotation Processing) 更快。
    • Profile 分析: 使用 --profile 或 Gradle Enterprise 分析構建瓶頸。
  6. 測試策略:

    • 模塊獨立測試: 每個模塊應有自己的單元測試 (test/) 和儀器化測試 (androidTest/)。
    • 集成測試: 在主 App Module 或專門的 test-app Module 進行端到端 (E2E) 或 UI 測試 (Espresso),驗證模塊集成后的功能。
    • Mock 依賴: 在測試模塊時,使用 Mock 框架 (MockK, Mockito) 模擬其依賴的接口。
  7. 持續集成/持續交付 (CI/CD):

    • 每個模塊獨立運行單元測試。
    • 按需編譯和測試修改模塊及其依賴。
    • 支持模塊獨立打包發布 (AAR/APK)。
    • 主 App 集成時進行全量構建和 E2E 測試。

五、挑戰與避坑指南

  1. 循環依賴:
    • 原因: Module A 依賴 Module B,同時 Module B 又直接或間接依賴 Module A。
    • 解決:
      • 依賴倒置 (DIP): 提取公共接口到第三個模塊 (interface),A 和 B 都依賴接口模塊,B 實現接口,A 通過 DI 或服務發現使用接口。
      • 重構: 將導致循環的公共部分下沉到更基礎的模塊。
      • 使用 api vs implementation 仔細配置 Gradle 依賴傳遞性。api 會暴露依賴,容易導致傳遞性循環,優先使用 implementation
  2. 資源沖突:
    • 原因: 不同模塊定義了同名資源 (string, layout, drawable)。
    • 解決: 嚴格執行資源前綴 (resourcePrefix) 或使用 Android 命名空間 (namespace)。建立資源命名規范。
  3. 編譯速度未顯著提升:
    • 原因: 基礎模塊頻繁改動;模塊劃分不合理 (粒度過細或過粗);構建配置未優化;未充分利用緩存。
    • 解決: 穩定基礎模塊;合理劃分模塊 (關注變更頻率);優化構建配置 (避免不必要的 clean,啟用緩存);使用最新穩定版 AGP/Gradle。
  4. 過度設計:
    • 原因: 過早或過度拆分模塊,引入不必要的復雜度。
    • 解決: 從痛點出發,按需拆分。中小項目可能不需要嚴格的層級劃分,組件化本身就能帶來很大收益。
  5. 接口模塊膨脹:
    • 原因: xxx-interface 模塊包含過多接口和數據類,成為新的耦合點。
    • 解決: 僅將真正需要跨模塊訪問的接口和數據放入 interface 模塊。優先考慮模塊內封裝。
  6. 路由/DI 配置繁瑣:
    • 解決: 利用框架的注解處理器自動生成路由表/注入代碼。編寫腳本或模板減少重復勞動。
  7. 插件化兼容性與風險:
    • 解決: 除非有強烈動態化需求,否則優先選擇成熟的組件化方案。如必須用插件化,選擇社區活躍、文檔完善、有成功案例的方案 (如 RePlugin/Shadow),并進行充分兼容性測試和灰度發布。

六、總結與選型建議

  • 首選方案:組件化 + Gradle 多模塊 + 接口下沉 + 路由/DI: 這是目前最成熟、最主流、風險最低、收益顯著的模塊化方案。適用于絕大多數 Android 項目,能有效解決編譯慢、耦合高、協作難的問題。結合 DFM 可實現 Play Feature Delivery。
  • 技術棧推薦:
    • 路由: ARouter (功能全面) 或 Navigation Component (原生,適合簡單場景或結合 DeepLink)。
    • DI: Dagger Hilt (官方推薦,類型安全) 或 Koin (簡潔,Kotlin DSL 友好)。
    • 異步/事件: Kotlin Coroutines Flow (現代,結構化并發)。
    • 架構: MVVM (Jetpack ViewModel/LiveData) + Clean Architecture (分層)。
  • 模塊劃分原則: 單一職責、高內聚低耦合、變更頻率相近、可獨立運行 (理想)。
  • 實施關鍵: 漸進式拆分、嚴格依賴管理 (接口下沉)、自動化工具 (路由/DI)、持續優化構建。
  • 插件化慎用: 僅當對動態部署、熱更新、極致的包大小控制剛性需求,且能承受其高復雜度、兼容性風險和政策風險時才考慮。

模塊化不是一蹴而就的,而是一個持續演進的過程。清晰的規劃、合理的架構選型、嚴格的依賴管理規范以及團隊共識是成功實施的關鍵。它顯著提升了大型 Android 應用的可持續開發能力和工程效率。

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

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

相關文章

網絡基礎16--VRRP技術

一、VRRP核心概念定義虛擬路由器冗余協議(VRRP,Virtual Router Redundancy Protocol),可以將多個路由器加入到備份組中,形成一臺虛擬路由器,承擔網關功能。RFC 3768標準定義的VRRP是一種容錯協議&#xff0…

最長公共前綴-leetcode

編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴,返回空字符串 “”。 示例 1: 輸入:strs [“flower”,“flow”,“flight”] 輸出:“fl” 示例 2: 輸入:strs [“dog”,“racecar”,…

vs2022:C++安裝opencv

vs2022:C安裝opencv https://opencv.org/releases/ 1.配置包含目錄 2.配置庫目錄 3.配置連接器 4.配置環境變量 5.重新啟動VS2015/VS2017 6.測試 1.配置包含目錄 (頭文件) 2.配置庫目錄(dll存放的庫目錄) 3.配置連接器(庫) 4.配置環境變量 5.重新啟動VS…

智聯智造:國內新能源汽車品牌AGV小車無線控制系統創新實踐

行業背景:智能制造浪潮下的通信剛需 在全球制造業智能化轉型浪潮中,工業4.0技術已成為提升生產效率與產品質量的核心驅動力。國內某新能源汽車品牌作為智能制造的標桿企業,積極投身自動化設備與智能生產系統的革新。其中,無線控制…

QT6 源,七章對話框與多窗體(8) 消息對話框 QMessageBox :屬性,信號函數,成員函數,以及靜態成員函數,源代碼帶注釋

(1)消息對話框里,分為通知消息,詢問消息,提醒消息,錯誤消息。可以直接使用本類的靜態函數,簡單。但 QT 的官方說明里,建議使用動態成員函數組件的消息框,而非使用靜態函數…

DAY 7|算法篇——棧與隊列(及重溫數組篇章有感)

今天本來應該寫兩道題把這一章節結束掉,奈何第二題前k個高頻元素需要用的二叉樹相關代碼實在不會寫(倒是能看懂)等我學完二叉樹再把這道題親自寫一遍吧 今天工作量比較小,準備從第一天的任務開始把題目重新再做一遍 239. 滑動窗…

go語言基礎與進階

🚀 Go語言終極高手之路:從基礎到架構的終極指南 Go語言,以其簡潔的語法、卓越的性能和原生的并發模型,席卷了云原生和后端開發領域。然而,要真正駕馭Go,僅僅停留在會寫if-else和for循環是遠遠不夠的。真正的…

Oracle數據恢復—Oracle數據庫所在分區被刪除后報錯的數據恢復案例

Oracle數據庫數據恢復環境&故障: 一臺服務器上一個分區存放Oracle數據庫數據。由于管理員誤操作不小心刪除了該分區,數據庫報錯,無法使用。 北亞企安數據恢復工程師到達現場后,將故障服務器中所有硬盤以只讀方式進行完整鏡像。…

Prometheus+altermanager搭配釘釘報警

一、Prometheus介紹 Prometheus是一個開源系統監控和警報工具包,最初在 SoundCloud構建。自 2012 年成立以來,許多公司和組織都采用了 Prometheus,該項目擁有非常活躍的開發者和用戶社區。它現在是一個獨立的開源項目,獨立于任何…

【小白量化智能體】應用6:根據通達信指標等生成機器學習Python程序

【小白量化智能體】應用6:根據通達信指標等生成機器學習Python程序 【小白量化智能體】是指能夠自主或半自主地通過與環境的交互來實現目標或任務的計算實體。智能體技術是一個百科全書,又融合了人工智能、計算機科學、心理學和經濟學等多個領域的知識&a…

k8s的calico無法啟動報錯解決

報錯信息[INFO][1] main.go 138: Failed to initialize datastore errorGet "https://10.245.0.1:443/apis/crd.projectcalico.org/v1/clusterinformations/default": dial tcp 10.245.0.1:443: connect: no route to host 2025-07-21 06:15:42.055 [FATAL][1] main.…

MySQL多表查詢中的笛卡爾積問題

精選專欄鏈接 🔗 MySQL技術筆記專欄Redis技術筆記專欄大模型搭建專欄Python學習筆記專欄深度學習算法專欄 歡迎訂閱,點贊+關注,每日精進1%,與百萬開發者共攀技術珠峰 更多內容持續更新中!希望能給大家帶來…

深度解析 HTML `loading` 屬性:優化網頁性能的秘密武器

在開發網頁時,我常常被頁面加載速度慢的問題困擾,尤其是在圖片和嵌入內容較多的頁面上。用戶還沒看到內容就可能因為等待時間過長而離開,這對用戶體驗和 SEO 都是致命打擊。后來,我發現了 HTML 的 loading 屬性——一個簡單卻強大…

[C/C++內存安全]_[中級]_[安全處理字符串]

場景 在現代C開發指南出來后,并不建議使用C的某些內存不安全的字符串處理函數。那么有哪些函數不安全? 說明 內存安全方面,肯定是要向Rust看齊的。使用標準std::string字符串類,很大情況能避免緩沖區溢出問題。 如果舊項目里有…

【CNN】卷積神經網絡- part1

1.卷積1.局部連接定義:只是于輸入數據的一部分區域相連,每個神經元只關注一小部分作用:模仿人類的視野機制,極大的減少了模型參數的數量,降低了計算成本2.權重共享定義:所有神經元使用相同的權重向量來檢測…

漏洞生命周期管理:從發現到防護的全流程方案

漏洞并非孤立存在,而是遵循 “發現→評估→修復→驗證→閉環” 的生命周期。多數企業安全事件的根源并非缺乏漏洞發現能力,而是對漏洞生命周期的管理缺失 —— 大量漏洞被發現后長期未修復,或修復后未驗證效果。構建全流程漏洞生命周期管理體…

opencv圖像基本操作解析與實操

圖片操作cv2.namedWindow() 創建命名窗口cv2.imshow()顯示窗口cv2.destroyAllwindws()摧毀窗口cv2.resizeWindow()改變窗口大小cv2.waitKey()等待用戶輸入cv2.imread()讀取圖像img.shape 圖片h、w、c(高、寬、通道數import cv2 # opencv讀取的格式是BGR import m…

kafka--基礎知識點--6.1--LEO、HW、LW

在 Apache Kafka 中,LEO(Log End Offset)、HW(High Watermark)、和 LW(Low Watermark) 是副本機制和日志管理中的核心概念,共同確保數據一致性、可見性和存儲效率。以下是它們的詳細…

在線深凹槽深檢測方法都有哪些 —— 激光頻率梳 3D 輪廓檢測

引言在制造業中,深凹槽深度的精確檢測是保證零部件質量的關鍵環節。隨著智能制造的推進,在線檢測需求日益迫切,傳統檢測方法在效率和精度上的不足逐漸顯現。本文將梳理在線深凹槽深的傳統檢測方法,并重點探討激光頻率梳 3D 輪廓檢…

NumPy 數組拼接的高級技巧與實踐

在數據處理和機器學習領域,NumPy 是 Python 中最核心的科學計算庫之一。NumPy 數組(ndarray)的拼接操作是數據預處理中極為常見的需求。本文將深入探討如何將不同形狀的 NumPy 數組進行拼接,特別是如何將多個一維數組與二維數組進…