一、前言
在 外掛化知識梳理(1) - Small 框架之如何引入應用外掛 中,我們簡要地介紹瞭如何使用Small
框架來通過外掛實現一個Activity
的跳轉,也就是app.main
,這裡的app.main
我們稱為應用外掛,除了應用外掛外,還有一種稱為公共庫外掛。
對於這兩種外掛的職責,Small
官方建議的基本原則為
- 公共庫外掛
- 把各個 第三方庫拆出來做成
lib
外掛模組,包括統計、地圖、網路、圖片等庫。 - 把老專案積累的業務公共程式碼
utils
分離出來封裝成一個lib.utils
外掛 - 把基礎的樣式、主題分離出來封裝成一個
lib.style
外掛
- 應用外掛
- 把業務模組拆成
app
模組,他們可以依賴lib
模組,顯示呼叫lib
中的各個API
- 相對獨立的業務模組先拆,先放一個外掛裡
- 如果都不好拆,先把全部業務做成一個
app.main
主外掛
總結下來就是:
- 應用外掛模組相互之間不直接引用,但是可以引用公共庫外掛模組
- 公共庫外掛模組不應當相互引用,也不應當引用應用外掛模組
- 一個公共庫外掛模組可以被多個應用外掛模組引用
在專案當中,許多個模組有可能用到一些共有的東西,例如圖片載入、網路請求、公共控制元件等,那麼我們就有必要將這些東西封裝成共同庫讓各個模組去呼叫,一般來說,可以分為以下兩種:
- 工具類,例如網路請求、圖片載入、永續性儲存等。
- 資源類,例如公共控制元件、圖片資源、主題風格。
對於上面這兩類,我們一般稱為公共庫外掛,它的命名方式為lib.xxx
。公共庫外掛模組分為兩個階段:
- 在開發階段,我們可以通過
compile project(':lib_module_name')
讓應用外掛模組來引用它,以呼叫它模組中所定義的方法或使用主題樣式。 - 在編譯階段,共同庫外掛會被打包成為一個可獨立更新的外掛。
下面,我們就分這兩個方面,這介紹一下使用建立公共庫外掛。
二、公共庫
2.1 新建 lib.utils 模組作為工具類共同庫
(a) 新建外掛庫 Android Library
(b) 注意包名的定義,要分為兩個部分 新建完畢之後,我們的專案結構變為下面這樣: (c) 編寫工具類程式碼在lib.utils
模組中,引入第三方庫Glide
,用於圖片的載入:
dependencies {
//引入第三方庫Glide。
compile 'com.github.bumptech.glide:glide:3.7.0'
}
複製程式碼
新建一個簡單的圖片載入類ImageLoader
:
public class ImageLoader {
public static void loadImage(Context context, String imgUrl, ImageView img) {
Glide.with(context).load(imgUrl).into(img);
}
}
複製程式碼
2.2 新建 lib.style 作為資源類共同庫
(a) 新建外掛庫 Android Library
(b) 在 res 目錄下新建 styles.xml 檔案在styles.xml
檔案中,我們定義一些公共的樣式:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="StyleTextViewTitle">
<item name="android:textSize">45px</item>
<item name="android:textColor">#333333</item>
<item name="android:padding">12dp</item>
</style>
<style name="StyleTextViewSubTitle">
<item name="android:textSize">27px</item>
<item name="android:textColor">#888888</item>
</style>
</resources>
複製程式碼
2.3 修改外掛模組 app.main
** (a) 引入 lib.utils 和 lib.style **
dependencies {
//...
compile project(':lib.utils')
compile project(':lib.style')
}
複製程式碼
(b) 在佈局檔案中,使用 lib.style 的公共樣式
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
tools:context="com.demo.small.app.main.PlugActivity">
<ImageView
android:id="@+id/iv_header"
android:layout_gravity="center_horizontal"
android:layout_width="200dp"
android:layout_height="200dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Small Android"
android:layout_gravity="center_horizontal"
style="@style/StyleTextViewTitle"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Small 外掛化方案適用於將一個APK拆分為多個公共庫外掛、業務模組外掛的場景。"
style="@style/StyleTextViewSubTitle"/>
</LinearLayout>
複製程式碼
** (c) 在程式碼中,使用 lib.utils 定義的介面**
public class PlugActivity extends AppCompatActivity {
private static final String IMG_URL = "http://i6.hexun.com/2017-06-02/189461191.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_plug);
ImageView imageView = (ImageView) findViewById(R.id.iv_header);
//呼叫 lib.utils 中定義的介面。
ImageLoader.loadImage(this, IMG_URL, imageView);
}
}
複製程式碼
2.4 修改宿主模組的 bundle.json 檔案:
{
"version": "1.0.0",
"bundles": [
{
"uri": "lib.utils",
"pkg": "com.demo.small.lib.utils"
},
{
"uri": "lib.style",
"pkg": "com.demo.small.lib.style"
},
{
"uri": "main",
"pkg": "com.demo.small.app.main"
}
]
}
複製程式碼
2.6 重新編譯
2.7 最終效果
更多文章,歡迎訪問我的 Android 知識梳理系列:
- Android 知識梳理目錄:www.jianshu.com/p/fd82d1899…
- 個人主頁:lizejun.cn
- 個人知識總結目錄:lizejun.cn/categories/