Android插件化之Small第二彈

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è)熟悉的表格

QQ20170719-154620.png

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)整。

QQ20170719-164534.png

這是我們不做任何配置的編譯結(jié)果。我們?cè)趌ogic2這個(gè)modlue的gradle.build中添加

ext{
    packageId = 0x88
}

然后再編譯下發(fā)現(xiàn)logic2這個(gè)module分配的id首地址變成了0x88,如圖

QQ20170719-165007.png

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)!

Demo地址:https://github.com/loubinfeng2013/SmallProject

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.框架的選擇:本次選擇的插件化框架在經(jīng)過(guò)數(shù)次比較之后選擇了國(guó)產(chǎn)大神開(kāi)發(fā)的目前在市場(chǎng)上較為流行的small插件化框...
    鳳天凌閱讀 3,668評(píng)論 8 11
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,500評(píng)論 19 139
  • 導(dǎo)讀如果你沒(méi)有耐心,這篇文章對(duì)你來(lái)說(shuō)可能是沉重的負(fù)擔(dān),你可以直接頁(yè)內(nèi)搜索“尾聲”,那里省略了階梯過(guò)程,直接是標(biāo)準(zhǔn)答...
    青藍(lán)白閱讀 1,460評(píng)論 0 5
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,667評(píng)論 25 709
  • Ruthrough閱讀 167評(píng)論 0 0

友情鏈接更多精彩內(nèi)容