前言
Small官網(wǎng): https://github.com/wequick/Small
世界那么大,組件那么小虽缕。Small,做最輕巧的跨平臺(tái)插件化框架。 ——Galenlin
這是Small作者扶叉,林光亮老師勿锅,給Small一句概括。
今年6月份枣氧,我和同事Simon奔赴北京參加 GMTC全球移動(dòng)技術(shù)大會(huì)2016溢十。當(dāng)時(shí)Galenlin給大家介紹了Small插件化框架,插件化加載dex达吞、資源拆分张弛、hook.....
Dynamic-load-apk的作者任玉剛也有演講,不過沒介紹DLA酪劫。
回廣州后吞鸭,對(duì)Small做了幾個(gè)實(shí)驗(yàn)性demo,不禁贊嘆Small真的非常簡(jiǎn)潔覆糟,而且基本能滿足 APP組件化需求刻剥。
Small完成什么使命?
組件化滩字,既熟悉又陌生的詞匯造虏。通俗點(diǎn)說,就是把APP拆分成不同功能模塊麦箍,形成獨(dú)立組件漓藕,讓宿主調(diào)用。
組件化不一定是插件化挟裂,組件化是一個(gè)更大的概念:把模塊解耦享钞,組件之間代碼不依賴,宿主可以依賴組件话瞧;而插件化則具體到了技術(shù)點(diǎn)上嫩与,宿主通過 動(dòng)態(tài)加載 來調(diào)用組件,宿主不依賴組件交排,達(dá)到 完全解耦 的目的划滋。
Small插件化方案適用于將一個(gè)APK拆分為多個(gè)公共庫插件、業(yè)務(wù)模塊插件的場(chǎng)景埃篓。
(知乎上一個(gè)插件化提問《怎么將 Android 程序做成插件化的形式处坪?》)
框架對(duì)比
Android插件化框架有很多,相信Dynamic-load-apk架专、ACDD同窘、DroidPlugin 如雷貫耳。
Small官方比較:COMPARISION.md
DyLA : Dynamic-load-apk @singwhatiwanna, 百度
DiLA : Direct-Load-apk @FinalLody
APF : Android-Plugin-Framework @limpoxe
ACDD : ACDD @bunnyblue
DyAPK : DynamicAPK @TediWang, 攜程
DPG : DroidPlugin @cmzy, 360
- 功能
/ | DyLA | DiLA | ACDD | DyAPK | DPG | APF | Small |
---|---|---|---|---|---|---|---|
加載非獨(dú)立插件[1] | × | x | √ | √ | × | √ | √ |
加載.so后綴插件 | × | × | ! [2] | × | × | × | √ |
Activity生命周期 | √ | √ | √ | √ | √ | √ | √ |
Service動(dòng)態(tài)注冊(cè) | × | × | √ | × | √ | √ | x [3] |
資源分包共享[4] | × | × | ! [5] | ! [5] | × | ! [6] | √ |
公共插件打包共享[7] | × | × | × | × | × | × | √ |
支持AppCompat[8] | × | × | × | × | × | × | √ |
支持本地網(wǎng)頁組件 | × | × | × | × | × | × | √ |
支持聯(lián)調(diào)插件[9] | × | x | × | × | × | × | √ |
Small初體驗(yàn)
1.Create Project
假設(shè)宿主包名為com.example.mysmall
- 設(shè)置Application name為
MySmall
- 修改Company Domain為
mysmall.example.com
2.配置build.gradle
對(duì)project/build.gradle
修改如下:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'net.wequick.tools.build:gradle-small:1.0.0-beta3'
}
}
apply plugin: 'net.wequick.small'
small {
aarVersion = '1.1.0-beta1'
}
...
(com.android.tools.build:gradle
用回你Android Studio支持的gradle插件版本)
aarVersion
部脚、net.wequick.tools.build:gradle-small
版本號(hào)想邦,可以參照Small官方sample的build.gradle
。sample
3.新建Application
new SmallApp
public class SmallApp extends Application {
@Override
public void onCreate() {
super.onCreate();
Small.preSetUp(this);
Small.setBaseUri("http://example.com/");// 瀏覽器跳轉(zhuǎn)url
Small.setUp(this, null);
// Small.setUp(this, new Small.OnCompleteListener(){...});
}
}
AndroidManifest.xml
:
<application
android:name=".SmallApp"
...
>
4.新建 插件Module
File->New->Module委刘,選擇Phone & Tablet Module
:
- Application Name:
App.main
- Module name:
app.main
- package name:
com.example.mysmall.app.main
如果選擇Android Library
丧没,app.*
換成lib.*
Small要求插件module滿足:
- 模塊名形如:
app.*
,lib.*
或者web.*
- 包名包含:
.app.
,.lib.
或者.web.
Add an Activity to Mobile
選擇最簡(jiǎn)單的Empty Activity即可(其他也可以)鹰椒。
除了默認(rèn)MainActivity
,順手創(chuàng)建多個(gè)ActivityB
吧呕童。
5.配置UI route
新建assets/bundle.json
:
{
"version": "1.0.0",
"bundles": [
{
"uri": "main",
"pkg": "com.example.mysmall.app.main",
"rules": {
"page2": ".ActivityB"
}
}
]
}
- uri : 跳轉(zhuǎn)Activity需要的uri
- pkg : 插件模塊包名
- rules : 指定跳轉(zhuǎn)的Activity
6.跳轉(zhuǎn)到插件Activity
@Override
public void onClick(View view) {
Small.openUri("main", this); // open bundles.main Launch Activity
// Small.openUri("main/page2", context);// 指定跳轉(zhuǎn)到app.main.page2
}
調(diào)用openUri
后漆际,就可以跳轉(zhuǎn)到插件的某個(gè)Activity了。
7.編譯插件
1)Build libraries (準(zhǔn)備基礎(chǔ)庫)
gradlew buildLib
如果插件module是Android Library
夺饲,這時(shí)會(huì)生成app/smallLibs/armeabi/*.so
2)Build bundles (打包所有組件)
gradlew buildBundle
生成app/smallLibs/armeabi/libcom_example_mysmall_app_main.so
運(yùn)行
由于project有兩個(gè)Phone & Tablet Module
奸汇,運(yùn)行時(shí)要選app
噢
使用效果
你會(huì)發(fā)現(xiàn),宿主app
沒有依賴app.main
往声,僅僅把app.main
編譯成so文件擂找, 宿主app
就可以跳轉(zhuǎn)到插件app.main
頁面了。這就是插件化的魅力——零依賴烁挟!
遇到的問題
之前遇到一個(gè)很奇葩的問題婴洼,如圖:
解決方法:
- gradlew cleanLib
- bradlew cleanBundle
- 重新buildLib、buildBundle即可
還試過運(yùn)行時(shí)提示“找不到app/MainActivity
”撼嗓,解決:File->Invalidate Caches/Restart
清一下緩存再重啟AS就好了柬采。
小結(jié)
Small算是最簡(jiǎn)單的插件化框架,如果你的project本來就已經(jīng)組件化到一定程度且警,使用Small輕而易舉粉捻。
由于筆者還未試過在實(shí)際項(xiàng)目中使用,可能有些潛在的坑未踩斑芜。Small的更新也是蠻積極的肩刃,目前大概一個(gè)月更新一次,在交流Q群&issue杏头,Galenlin回應(yīng)也很積極盈包。
強(qiáng)烈建議大家看看Small Issue,了解大家在使用中遇到的問題醇王,以及Galenlin和其他人提出的解決方案呢燥。目前就4頁,中文的寓娩,不會(huì)太多哈哈叛氨。
筆者相信,未來半年一年棘伴,Small會(huì)更穩(wěn)定寞埠、更容易在項(xiàng)目中集成,讓我們更爽地體驗(yàn)插件化的優(yōu)勢(shì)焊夸!
推薦閱讀:
關(guān)于轉(zhuǎn)載
如果你想轉(zhuǎn)載此文仁连,請(qǐng)務(wù)必在轉(zhuǎn)載時(shí),加上原文作者&原文鏈接阱穗。謝謝