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


相關(guān)閱讀

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


一、前言

上個(gè)星期,公司里有一個(gè)小的講座,對插件化進(jìn)行了簡單的介紹,因此決定開始研究一下這方面的知識。

在網(wǎng)上查了一些相關(guān)的資料,發(fā)現(xiàn)了Small這個(gè)開源的插件化框架,因此打算從它入手,通過它的內(nèi)部實(shí)現(xiàn),學(xué)習(xí)一下插件化的相關(guān)原理。這篇文章是個(gè)開篇,先從一個(gè)簡單的例子開始,把環(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)用類加載機(jī)制
Android Small 插件化框架 -- 類加載實(shí)現(xiàn)解析

二、基本示例

2.1 簡要介紹

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

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

本文所用的是一個(gè)最簡單的例子,因此在代碼上基本不會有什么問題,主要是環(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 具體實(shí)現(xiàn)

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

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

2.2.1 新建工程/宿主模塊

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

2.2.2 修改項(xiàng)目根目錄下的 build.gradle 文件

對于項(xiàng)目的build.gradle,修改包含以下三個(gè)部分:

  • 必選,在dependencies節(jié)點(diǎn)中引入遠(yuǎn)程依賴。
  • 必選,通過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步的下面,否則會報(bào)錯(cuò),可選。
small {
    aarVersion = '1.2.0-alpha3'
}

2.2.3 新建插件模塊

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


插件模塊中最最關(guān)鍵的一點(diǎn),就是插件模塊的包名,它的包名分為兩個(gè)部分

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

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


在插件模塊中,我們聲明一個(gè)新的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é)議

接下來要在宿主模塊中進(jìn)行路由配置,我們在宿主模塊上單擊右鍵,新建一個(gè)assets文件夾,之后在assets文件夾中,新建一個(gè)路由文件,bundle.json文件,注意assets文件夾從Project視圖上所處的位置如下圖所示,千萬不要放錯(cuò)地方了:


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

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

** (b) 在宿主模塊的自定義 Application 中進(jìn)行預(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() 方法中加載插件,點(diǎn)擊按鈕后跳轉(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 編譯&安裝

最后一步,就是進(jìn)行編譯和安裝,編譯時(shí):

  • 準(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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