插件化技术-Small插件框架

概要

本快速入门包含了使用Samll开发的基础步骤,并通过启动插件显示一条简单的文本:

hello-work

开始创建工程!

  •  安装Android Studio
  •  1: 创建与配置工程
  • 2: 创建一个插件模块
  • 3: 编译插件
  • 4: 启动插件
  • 5: 运行宿主


Step 1: 创建与配置工程

在本步骤你将:

  • 创建工程
  • 集成small
  • 配置宿主

创建工程

打开Android Studio,点选 Start a new Android Studio project 创建一个Android工程。Application Name 本示例设置为MySmall (您可以填写为自己的项目名称)。

my-small

设置最小支持 SDK (Small允许支持到 API 9):

new-project-minsdk

添加一个 Empty Activity,这个Activity将作为启动画面。

集成Small

在IDE左侧面板双击工程 build.gradle (Project,项目文件的build.gradle,不是APP文件下的build.gradle):

new-project-left-build.gradle

buildscript > dependencies 下添加Small编译插件 gradle-small

classpath 'net.wequick.tools.build:gradle-small:1.1.0-alpha2'

在文件末尾引用 gradle-small 插件:

apply plugin: 'net.wequick.small'

紧随其后,设置Small运行库版本:

small {
    aarVersion = '1.2.0-alpha6'
    strictSplitResources = false//允许出现重复的包引用,不严格规定,如果不设置为false可能会出现包重复错误
}

由于我们更改了脚本,需要同步下工程:点击 Android Studio 顶部菜单栏的同步按钮 as-sync ,系统将开始下载上述插件库。

再在底部面板 Terminal 中输入以下命令来验证Small环境:

./gradlew small

Windows用户为 gradlew small,Linux用户为 gradle small 如果首次运行,这个过程可能伴随一些(墙外)编译环境的下载,请耐心等待

如果一切正常,将成功输出:

### Compile-time

```
  gradle-small plugin : 1.1.0-beta4 (maven)
            small aar : 1.1.0-alpha1 (maven)
          gradle core : 2.14.1
       android plugin : 2.2.3
                   OS : Mac OS X 10.12.1 (x86_64)
```

### Bundles

| type | name | PP | sdk |  aapt  | support | file | size |
|------|------|----|-----|--------|---------|------|------|
| host | app  |    | 25  | 25.0.2 | 25.1.0  |      |      |

不同版本的输出内容可能会有细微差异

配置宿主

由于加载插件需要对Application注入一些方法,我们对包名目录 app > java > com.example.mysmall 右键 New > Java Class 来新建一个Application,如SmallApp

new-project-application

添加构造方法来初始化Small:

public class SmallApp extends Application {

    public SmallApp() {
        Small.preSetUp(this);
    }

}

由于ContentProvider在onCreate之前被调用,为支持在插件中使用该组件,我们需要提前到构造方法来对之进行懒加载。 如果不需要支持该组件,你也可以放到 onCreate 方法中。 这个方法在应用正常启动时只做一些简单的hook,不会影响性能;但在应用异常启动(后台被杀)时会同步加载插件以保证程序正常运行。

再在 AndroidManifest.xml 中指定这个 Application。

<application
    android:name=".SmallApp"
    ...>
</application>

Step 2: 创建插件模块

右键 app 模块 > New > Module:

new-project-new-module

创建一个应用模块 Phone & Tablet Module,设置 Application/Library name App.main,此时 Module name 自动为 app.mainPackage name 自动为com.example.appmain

App.main

Module nameapp.* 命名的模块将被 Small 在 编译时 识别为应用插件模块。 Package name app* 结尾的插件将被 Small 在 运行时 识别为应用插件

为了确认我们确实启动了插件,我们修改插件的布局文件 app.main > res > layout > activity_main.xml,将 TextView 的内容改为 Hello Small!

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:text="Hello Small!" />

Step 3: 编译插件

在 Terminal 面板,先编译公共库:

./gradlew buildLib -q
window系统命令:
gradlew buildLib -q

宿主是最基础的一个公共库

再编译 app.main 插件:

./gradlew buildBundle -q -Dbundle.arch=x86
 
  
window系统命令:
 
  
gradlew buildBundle -q -Dbundle.arch=x86
如果不是允许在模拟器上的:
 
  
gradlew buildBundle -q

为了方便模拟器运行,本示例指定生成插件到 x86 架构下

查看编译情况:

./gradlew small
window命令:
 
  
gradlew small

应看到生成的 appmain.so 插件:

type name PP sdk aapt support file(x86) size
host app   25 25.0.2 25.1.0    
app app.main 0x77 25 25.0.2 25.1.0 *_appmain.so 5.3 KB

Step 4: 启动插件

现在我们已经生成了插件并内置到宿主包中,要启动插件,我们需要配置一个路由来指向它。

右键 app 模块,New > Folder > Assets Folder 新建assets 目录:

New Assets Folder

再右键生成的 assets 目录,New > File 新建路由配置文件bundle.json

bundle.json

修改 bundle.json 添加路由:

{
  "version": "1.0.0",
  "bundles": [
    {
      "uri": "main",
      "pkg": "com.example.appmain"
    }
  ]
}

这里的:

  • version,是 bundle.json 文件格式版本,目前始终为 1.0.0
  • bundles,插件数组
    • uri,插件唯一ID
    • pkg,插件包名


回到宿主的 app > java > com.example.mysmall > MainActivity,在 onStart 方法中我们通过上述配置的uri 来启动app.main 插件:

@Override
protected void onStart() {
    super.onStart();
    Small.setUp(this, new Small.OnCompleteListener() {
        @Override
        public void onComplete() {
            Small.openUri("main", MainActivity.this);
        }
    });
}

Step 5: 运行宿主

在顶部菜单栏,我们先选择宿主模块 app,再点击旁边的运行按钮:

Run host

成功运行后,将启动插件模块:

hello-work

总结与下一步

完整的 build.gradle 为:

 
  
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'net.wequick.tools.build:gradle-small:1.2.0-alpha6'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
apply plugin: 'net.wequick.small'

small {
    aarVersion = '1.2.0-alpha6'
    strictSplitResources = false
}

通过本节我们掌握了使用Small开发的基础:

  1. 通过 build.gradle 集成 Small
  2. 通过 自定义Application 初始化 Small
  3. 通过 buildLib,buildBundle 编译 Small 插件
  4. 通过 bundle.json 配置插件路由
  5. 通过 Small.openUri 启动插件
http://blog.csdn.net/lufanzheng/article/details/77160813

猜你喜欢

转载自blog.csdn.net/LUFANZHENG/article/details/77160473