插件化知識梳理(1) - Small 框架之如何引入應(yīng)用插件


相關(guān)閱讀

插件化知識梳理(1) - Small 框架之如何引入應(yīng)用插件
插件化知識梳理(2) - Small 框架之如何引入公共庫插件
插件化知識梳理(3) - Small 框架之宿主分身
插件化知識梳理(4) - Small 框架之如何實現(xiàn)插件更新
插件化知識梳理(5) - Small 框架之如何不將插件打包到宿主中
插件化知識梳理(6) - Small 源碼分析之 Hook 原理
插件化知識梳理(7) - 類的動態(tài)加載入門
插件化知識梳理(8) - 類的動態(tài)加載源碼分析
插件化知識梳理(9) - 資源的動態(tài)加載示例及源碼分析
插件化知識梳理(10) - Service 插件化實現(xiàn)及原理


一、前言

上個星期咆瘟,公司里有一個小的講座,對插件化進行了簡單的介紹,因此決定開始研究一下這方面的知識船殉。

在網(wǎng)上查了一些相關(guān)的資料宪巨,發(fā)現(xiàn)了Small這個開源的插件化框架定庵,因此打算從它入手,通過它的內(nèi)部實現(xiàn)愈腾,學(xué)習(xí)一下插件化的相關(guān)原理。這篇文章是個開篇岂津,先從一個簡單的例子開始虱黄,把環(huán)境給搭建好。先給大家分享一些這幾天查閱的資料吮成,如果大家有比較好的文章也可以留言或者私信我:

Android博客周刊專題之#插件化開發(fā)#

Small Github 官網(wǎng)
Small Issues
Small 快速入門

Android Small 源碼分析 (一) 啟動流程
Android Small 源碼分析 (二) 插件加載過程

Android Small 插件化框架源碼分析

Android Small 插件化框架 -- 啟動插件 Activity 源碼解析(上)
Android Small 插件化框架 -- 啟動插件 Activity 源碼解析(下)
Android Small 插件化框架 -- Android 應(yīng)用類加載機制
Android Small 插件化框架 -- 類加載實現(xiàn)解析

二橱乱、基本示例

2.1 簡要介紹

對于Small來說,一個最簡單的框架分為三個部分:

  • 宿主
  • 插件
  • bundle.json赁豆,用于宿主和插件之間的路由仅醇。

本文所用的是一個最簡單的例子,因此在代碼上基本不會有什么問題魔种,主要是環(huán)境上的區(qū)別析二,遇到編譯不過的問題可以多多百度,下面是我所采用的環(huán)境:

  • Android Studio 版本:Android Studio 3.0
  • Gradle 版本:gradle-3.5-all.zip
  • compileSdkVersion24
  • buildToolsVersion24.0.2

完整的例子可以查看 https://github.com/imZeJun/SmallDemo

2.2 具體實現(xiàn)

整個具體的實現(xiàn)分為五步:

  • 新建工程/宿主模塊
  • 修改項目根目錄下的build.gradle文件,引入Small插件
  • 新建插件模塊
  • 完善宿主模塊
  • 編譯叶摄,安裝

2.2.1 新建工程/宿主模塊

這里比較關(guān)鍵的一點属韧,是需要在新建工程/宿主模塊的時候,將包名修正為com.demo.small蛤吓,這是為了和以后的lib/app模塊形成統(tǒng)一:

2.2.2 修改項目根目錄下的 build.gradle 文件

對于項目的build.gradle宵喂,修改包含以下三個部分:

  • 必選,在dependencies節(jié)點中引入遠程依賴会傲。
  • 必選锅棕,通過apply plugin應(yīng)用插件。
  • 可選淌山,配置Small代碼庫版本裸燎。
buildscript {

    repositories {
        maven { url 'https://maven.google.com' }
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        //1.引入Small依賴,必選泼疑。
        classpath 'net.wequick.tools.build:gradle-small:1.2.0-alpha3'
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url 'https://maven.google.com' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

//2.應(yīng)用插件德绿,必選。
apply plugin: 'net.wequick.small'

//3.配置Small的代碼庫版本退渗,需要放在第2步的下面移稳,否則會報錯,可選会油。
small {
    aarVersion = '1.2.0-alpha3'
}

2.2.3 新建插件模塊

這里用到的插件模塊很簡單个粱,就是位于另一個模塊中的Activity,選擇File -> New -> New Module


插件模塊中最最關(guān)鍵的一點钞啸,就是插件模塊的包名几蜻,它的包名分為兩個部分

  • 第一部分和宿主模塊相同
  • 第二部分要根據(jù)插件的類型來決定:
  • 如果是Phone & Tablet Module:那么要以app.xxx結(jié)尾
  • 如果是Android Library,那么要以lib.xxx結(jié)尾

這里体斩,我們先演示第一種:


在插件模塊中梭稚,我們聲明一個新的PlugActivity,它的布局為:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    tools:context="com.demo.small.app.main.PlugActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="@android:color/black"
        android:text="PlugActivity started success"/>

</FrameLayout>

2.2.4 完善宿主模塊

(a) 配置路由協(xié)議

接下來要在宿主模塊中進行路由配置絮吵,我們在宿主模塊上單擊右鍵弧烤,新建一個assets文件夾,之后在assets文件夾中蹬敲,新建一個路由文件暇昂,bundle.json文件,注意assets文件夾從Project視圖上所處的位置如下圖所示伴嗡,千萬不要放錯地方了:


bundle.json中急波,我們聲明插件模塊:

{
  "version": "1.0.0",
  "bundles": [
    {
      "uri": "main",
      "pkg": "com.demo.small.app.main"
    }
  ]
}

** (b) 在宿主模塊的自定義 Application 中進行預(yù)加載**

public class SmallHostApp extends Application {

    public SmallHostApp() {
        //Small初始化。
        Small.preSetUp(this);
    }
}

** (c) 將自定義的 Application 配置到宿主模塊的 AndroidManifest.xml 中**

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.demo.small">

    <application
        android:name=".app.SmallHostApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".LaunchActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

** (d) 在啟動 Activity 的 onCreate() 方法中加載插件瘪校,點擊按鈕后跳轉(zhuǎn)到插件的Activity**

public class LaunchActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launch);
        setUp();
    }

    private void setUp() {
        Small.setUp(this, new net.wequick.small.Small.OnCompleteListener() {

            @Override
            public void onComplete() {
                Log.d("LaunchActivity", "onComplete");
            }
        });
    }

    public void startPlugActivity(View view) {
        Small.openUri("main", LaunchActivity.this);
    }
}

2.2.5 編譯&安裝

最后一步澄暮,就是進行編譯和安裝名段,編譯時:

  • 準(zhǔn)備基礎(chǔ)庫 & 打包所有組件
./gradlew buildLib -q && ./gradlew buildBundle -q
  • 安裝:
 ./gradlew assembleDebug && adb install -r app/build/outputs/apk/app-debug.apk 
  • 清除基礎(chǔ)庫 & 清除所有組件:
./gradlew cleanLib -q && ./gradlew cleanBundle -q

2.3 最終效果


更多文章,歡迎訪問我的 Android 知識梳理系列:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泣懊,一起剝皮案震驚了整個濱河市伸辟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馍刮,老刑警劉巖信夫,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卡啰,居然都是意外死亡静稻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門匈辱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姊扔,“玉大人,你說我怎么就攤上這事梅誓。” “怎么了佛南?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵梗掰,是天一觀的道長。 經(jīng)常有香客問我嗅回,道長及穗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任绵载,我火速辦了婚禮埂陆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娃豹。我一直安慰自己焚虱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布懂版。 她就那樣靜靜地躺著鹃栽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪躯畴。 梳的紋絲不亂的頭發(fā)上民鼓,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音蓬抄,去河邊找鬼丰嘉。 笑死,一個胖子當(dāng)著我的面吹牛嚷缭,可吹牛的內(nèi)容都是我干的饮亏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼克滴!你這毒婦竟也來了逼争?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤劝赔,失蹤者是張志新(化名)和其女友劉穎誓焦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體着帽,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡杂伟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了仍翰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赫粥。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖予借,靈堂內(nèi)的尸體忽然破棺而出越平,到底是詐尸還是另有隱情,我是刑警寧澤灵迫,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布秦叛,位于F島的核電站,受9級特大地震影響瀑粥,放射性物質(zhì)發(fā)生泄漏挣跋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一狞换、第九天 我趴在偏房一處隱蔽的房頂上張望避咆。 院中可真熱鬧,春花似錦修噪、人聲如沸查库。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膨报。三九已至,卻和暖如春适荣,著一層夾襖步出監(jiān)牢的瞬間现柠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工弛矛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留够吩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓丈氓,卻偏偏與公主長得像周循,于是被迫代替她去往敵國和親强法。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容