乙個基於 SPI 的 Android 元件化框架

2021-09-24 09:35:35 字數 2513 閱讀 7415

架構介紹

疑難點是如何解決的

一些需要注意的事項

詳細的原始碼請移步 github:spi_component

首先,我們思考下什麼是元件化,什麼是外掛程式化?什麼時候我們用元件化,什麼時候我們用外掛程式化?

這是乙個策略問題,用何種方式需要根據實際情況來。

剛剛說了,元件化是將專案拆分為幾個元件,單個元件高內聚,元件間低耦合。所以復用會比較方便,如果公司產品多可以考慮這種方式。

外掛程式化是將整個專案拆分為幾個模組,和元件化類似,有相似的優勢,但是一般外掛程式化方案都涉及 hook 技術,而這些技術隨著 android 版本迭代,可能會被**,存在一些適配的風險,可能會不穩定。

隨著我們的業務發展,我們的主工程越來越複雜,不得不考慮元件化和外掛程式化來簡化我們的開發工作,考慮到穩定性,我們決定改造我們的工程,後續切換到元件化開發。

在改造的時候,我們採集了一下內部對於元件化需求:

學習成本低,希望比較容易上手(接入簡單)。

現有的**改動少,呼叫方式最好不變。

元件之間互相呼叫(希望可以直接使用其他元件的資源,相對顯式開啟其他元件的頁面等)方便、高效。

希望不要引入太多無關的**。

希望新增元件的方式簡單點。

元件間的呼叫不是很方便,activity 的跳轉還好,但是涉及到 fragment 的呼叫的時候,

就不是很方便了,基本無解。

新增元件相對麻煩,需要修改編譯指令碼,相對不友好。

鑑於以上的一些特點,我們希望可以在現有的基礎上做一些優化,希望元件化開發更簡單,更方便。

於是,我設想了這個基於spi的元件化框架。框架的大致架構如下:

模組名稱

作用:baselibs:imageloader

這個是基礎的載入庫,目前沒有實際的實現,只是為了演示

:baselibs:net

這個是基礎的網路框架庫,目前沒有實際的實現,只是為了演示

:baselibs:compbase

:baselibs:compx

這個是元件庫,抽象了元件具體的功能

:baselibs:core

:components:compximpl

某個元件,依賴:baselibs:compbase:baselibs:core:baselibs:compx,實現:baselibs:compx裡面這個元件對外暴露的業務邏輯等。

:baselibs:compx模組定義了各種元件承擔的業務和對外暴露的一些資源等,主要是通過介面暴露。同時提供各個模組的預設實現。

:baselibs:core模組整合了各個元件對外暴露的部分。

:components:compximpl模組是乙個元件的實現,實現的是:baselibs:compx模組裡面定義的的元件.

模組。模組。

首先,乙個元件需要在:baselibs:compx模組裡面定義,我們暫用icompxservice來表示,其實就是乙個介面,定義了這個元件對外暴露的東西,比如可以獲取某個值(get***),可以獲取乙個 fragment (get***fragment)。同時提供預設實現。

然後,我們需要新建乙個:components:compximpl模組,依賴:baselibs:compx模組,然後實現:baselibs:compx模組裡面的icompxservice介面,我們記為compxserviceimpl,這樣我們就有了乙個元件。

元件的原理大概就是這樣的。

通過這種方法,我們可以僅在元件裡面處理自己的初始化邏輯就好了。

新增乙個元件的話,需要做如下的事情,

新建乙個:baselibs:compx庫,定義新的元件需要對外的部分,同時提供預設實現,並讓spi可以載入到這個預設實現。

新建乙個:components:compximpl庫,實現剛剛的元件庫,同時讓spi可以識別到這庫。

:baselibs:core裡面註冊這個元件對外暴露的compxservice

經過上面四步,新增乙個元件完成了,中間不需要特別修改編譯指令碼,只需要修改一些引用庫之間的關係就可以使用了。感覺還是很方便的。

:baselibs:core模組會通過spi來載入元件的實現,也就是元件library裡面實現icompxservice介面的類,所以元件library裡面要按照spi的要求新建入口檔案。

SPI 基於SPI協議的Flash驅動控制

實驗目標 將固化到flash中的程式,通過全擦除程式將其中的固化程式擦除,重新上電後,不再執行固化檔案裡的內容 jic檔案 將該檔案燒錄到flash中,掉電不丟失 flash在spi通訊中充當從裝置 在進行程式固化時,在下圖中選擇主裝置型號 具體操作 檢視flash晶元的資料手冊 寫使能指令 執行完...

android 乙個奇怪的bug

今天做乙個android例子,程式本來執行好好的,可是後來不知道為什麼會有這個異常,具體如下 我 layout.xml檔案裡,有乙個linearlayout android id id serinfoll 當我在activity裡,用 linearlayout findviewbyid r.id.s...

android 乙個ad分析

入口new thread new runnable catch exception v4 start 在程式入口 有個g 方法下 修改g 方法 跳轉到s 方法進入遊戲 com.zplay.android.sdk.zplayad zplayad類的方法制空 com.zplay.android.sdk....