1.公共庫(kù)插件
在Small框架中一般可以將插件分為業(yè)務(wù)插件和公共庫(kù)插件,一般情況下,公共庫(kù)插件module name的命名方式是lib.,對(duì)應(yīng)的package name為.lib*。這是small推薦的命名方式,這樣就不用做其他額外配置了,然后只要在宿主module的bundle.json中配置聲明就能正常工作了。
{
"pkg": "com.example.liblogic"
}
因?yàn)檫@只是一個(gè)公共庫(kù)插件,所有不需要配置uri。為了開(kāi)發(fā)階段的方便,業(yè)務(wù)插件依賴(lài)公共庫(kù)插件的依賴(lài)關(guān)系還是要配置的,否則會(huì)找不到對(duì)應(yīng)的類(lèi),但是在small打包時(shí),這個(gè)依賴(lài)關(guān)系時(shí)無(wú)用的,就是說(shuō)就算module間的依賴(lài)關(guān)系不配置,最終打包出來(lái)的程序一樣能正常運(yùn)行。
有時(shí)因?yàn)橐恍┨厥馇闆r,公共庫(kù)的命名不能用small推薦的方式,那么就要做一些特殊的配置。在整個(gè)項(xiàng)目的build.gradle中添加配置如下,
small {
aarVersion = '1.2.0-alpha6'
buildToAssets = false
strictSplitResources = true
bundles 'lib','logic2'
}
上面是small的DSL語(yǔ)言,其中bundles這個(gè)方法就是用來(lái)聲明插件,上面就是聲明了logic2這個(gè)module是一個(gè)lib(公共庫(kù)插件類(lèi)型)的插件。
然后在bundle.json中再聲明如下
{
"pkg": "com.example.logic2",
"type": "lib"
}
這樣就可以正常使用logic2這個(gè)公共庫(kù)插件了。最后我們編譯一下,就能看到那個(gè)熟悉的表格

2.Small進(jìn)階知識(shí)
1.Small DSL
DSL 即 Domain Specific Language,領(lǐng)域?qū)S谜Z(yǔ)言。Small也有自己的一套標(biāo)準(zhǔn),上小節(jié)已經(jīng)使用過(guò)了。因?yàn)閷傩苑椒ú⒉欢啵行┮膊皇潜仨氁渲玫?,所以并不算難。不過(guò)這里有個(gè)坑,Small DSL的語(yǔ)法會(huì)根據(jù)gradle-small的版本變化而變化,比如官網(wǎng)介紹strictSplicResources
這個(gè)屬性其實(shí)并沒(méi)有,真正的屬性名稱(chēng)叫做strictSplitResources,就類(lèi)似這樣的問(wèn)題,那怎么辦呢?開(kāi)源項(xiàng)目嘛,去github主頁(yè)上看源碼...
Small/Android/DevSample/buildSrc/src/main/groovy/net/wequick/gradle/RootExtension.groovy
RootExtension.groovy這個(gè)文件定義了Small DSL的語(yǔ)法。
2.插件路由
關(guān)于插件路由,就是bundle.json中的配置信息。之前我們配置一個(gè)業(yè)務(wù)插件只配置了uri和package,這個(gè)情況下,我們根據(jù)uri只會(huì)打開(kāi)對(duì)應(yīng)業(yè)務(wù)插件中被定義了launch的activity,有時(shí)會(huì)業(yè)務(wù)需求要打開(kāi)這個(gè)module中的另外一個(gè)activity,這種情況下,bundle.json需要這么配置
{
"uri": "alarmbox",
"pkg": "com.example.appalarmbox",
"rules":{
"other":"Other"
}
}
這會(huì)比一般情況多設(shè)置一個(gè)rules。在這個(gè)module的主包下有一個(gè)OtherActivity,我們會(huì)根據(jù)“alarmbox/other”這個(gè)uri去啟動(dòng)OtherActivity。關(guān)于參數(shù)問(wèn)題,在一般android開(kāi)發(fā)中Activity之間進(jìn)行跳轉(zhuǎn)通過(guò)Intent,Intent是可以帶參數(shù)的,那么在Small中我們這么傳參數(shù)呢?其實(shí)很簡(jiǎn)單,就跟網(wǎng)頁(yè)的傳參方式一樣,只需要在uri后面帶上就行。
Small.openUri(uri+"?id=1&title=sdk",MainActivity.this);
那么目標(biāo)Activity怎么獲???
Uri uri = Small.getUri(this);
Log.i("info",uri.toString());
String id = uri.getQueryParameter("id");
String title = uri.getQueryParameter("title");
Log.i("info","id="+id+",title="+title);
3.自定義資源ID分段
Small在整合插件資源的過(guò)程,為避免資源ID沖突,需要為每個(gè)插件分配一個(gè)ID段。我們知道默認(rèn)程序的ID段為 0x7f。由于系統(tǒng)使用了 0x00,0x01,0x02。因此插件允許的范圍在 [0x03, 0x7e] 之間。
但是有些特殊情況,比如一些特殊機(jī)型的系統(tǒng)會(huì)占用某個(gè)內(nèi)存,那么就會(huì)產(chǎn)生異常,這種情況下就需要對(duì)內(nèi)存分配地址重新調(diào)整。

這是我們不做任何配置的編譯結(jié)果。我們?cè)趌ogic2這個(gè)modlue的gradle.build中添加
ext{
packageId = 0x88
}
然后再編譯下發(fā)現(xiàn)logic2這個(gè)module分配的id首地址變成了0x88,如圖

4.其他
關(guān)于Small進(jìn)階還有編譯選項(xiàng),宿主分身模塊的方面問(wèn)題,這個(gè)暫時(shí)在項(xiàng)目中沒(méi)有用到,本著“不使用,無(wú)發(fā)言權(quán)”的原則,下次用到再總結(jié)。
3.總結(jié)
關(guān)于Small的基礎(chǔ)研究將告一段落,下階段將進(jìn)行實(shí)際項(xiàng)目的改造工作,一定會(huì)遇到不少坑,到時(shí)會(huì)和大家進(jìn)行分享。謝謝,再見(jiàn)!