1.公共庫插件
在Small框架中一般可以將插件分為業(yè)務(wù)插件和公共庫插件荸型,一般情況下,公共庫插件module name的命名方式是lib.挎扰,對(duì)應(yīng)的package name為.lib*氓轰。這是small推薦的命名方式峰伙,這樣就不用做其他額外配置了,然后只要在宿主module的bundle.json中配置聲明就能正常工作了程帕。
{
"pkg": "com.example.liblogic"
}
因?yàn)檫@只是一個(gè)公共庫插件千扶,所有不需要配置uri料祠。為了開發(fā)階段的方便,業(yè)務(wù)插件依賴公共庫插件的依賴關(guān)系還是要配置的澎羞,否則會(huì)找不到對(duì)應(yīng)的類髓绽,但是在small打包時(shí),這個(gè)依賴關(guān)系時(shí)無用的妆绞,就是說就算module間的依賴關(guān)系不配置顺呕,最終打包出來的程序一樣能正常運(yùn)行。
有時(shí)因?yàn)橐恍┨厥馇闆r括饶,公共庫的命名不能用small推薦的方式株茶,那么就要做一些特殊的配置。在整個(gè)項(xiàng)目的build.gradle中添加配置如下图焰,
small {
aarVersion = '1.2.0-alpha6'
buildToAssets = false
strictSplitResources = true
bundles 'lib','logic2'
}
上面是small的DSL語言启盛,其中bundles這個(gè)方法就是用來聲明插件,上面就是聲明了logic2這個(gè)module是一個(gè)lib(公共庫插件類型)的插件技羔。
然后在bundle.json中再聲明如下
{
"pkg": "com.example.logic2",
"type": "lib"
}
這樣就可以正常使用logic2這個(gè)公共庫插件了僵闯。最后我們編譯一下,就能看到那個(gè)熟悉的表格
2.Small進(jìn)階知識(shí)
1.Small DSL
DSL 即 Domain Specific Language藤滥,領(lǐng)域?qū)S谜Z言鳖粟。Small也有自己的一套標(biāo)準(zhǔn),上小節(jié)已經(jīng)使用過了拙绊。因?yàn)閷傩苑椒ú⒉欢嘞蛲迹行┮膊皇潜仨氁渲玫模圆⒉凰汶y标沪。不過這里有個(gè)坑榄攀,Small DSL的語法會(huì)根據(jù)gradle-small的版本變化而變化,比如官網(wǎng)介紹strictSplicResources
這個(gè)屬性其實(shí)并沒有金句,真正的屬性名稱叫做strictSplitResources航攒,就類似這樣的問題,那怎么辦呢趴梢?開源項(xiàng)目嘛漠畜,去github主頁上看源碼...
Small/Android/DevSample/buildSrc/src/main/groovy/net/wequick/gradle/RootExtension.groovy
RootExtension.groovy這個(gè)文件定義了Small DSL的語法。
2.插件路由
關(guān)于插件路由坞靶,就是bundle.json中的配置信息憔狞。之前我們配置一個(gè)業(yè)務(wù)插件只配置了uri和package,這個(gè)情況下彰阴,我們根據(jù)uri只會(huì)打開對(duì)應(yīng)業(yè)務(wù)插件中被定義了launch的activity瘾敢,有時(shí)會(huì)業(yè)務(wù)需求要打開這個(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ù)問題碟摆,在一般android開發(fā)中Activity之間進(jìn)行跳轉(zhuǎn)通過Intent晃财,Intent是可以帶參數(shù)的,那么在Small中我們這么傳參數(shù)呢典蜕?其實(shí)很簡(jiǎn)單断盛,就跟網(wǎng)頁的傳參方式一樣,只需要在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在整合插件資源的過程轩缤,為避免資源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)垄开,宿主分身模塊的方面問題琴许,這個(gè)暫時(shí)在項(xiàng)目中沒有用到,本著“不使用溉躲,無發(fā)言權(quán)”的原則榜田,下次用到再總結(jié)。
3.總結(jié)
關(guān)于Small的基礎(chǔ)研究將告一段落锻梳,下階段將進(jìn)行實(shí)際項(xiàng)目的改造工作箭券,一定會(huì)遇到不少坑,到時(shí)會(huì)和大家進(jìn)行分享疑枯。謝謝辩块,再見!