【0158】【热修复与插件化-6】small完成插件化+Atlas介绍

【内容提要】

1.small插件化框架

1.1 集成small框架

【说明】新建工程的app包名不要进行改动,不然需要根据samll的要求需要对app名称进行配置;

【small框架的主要作用】主要作用:改变原有文件的加载流程;

【验证是否编译成功】

1.2.插件的创建

【内容提要】

 

1.3.编译插件库

1.4.启动插件

【运行的结果】

2.插件的实际项目中的使用

 

【说明】实际项目的插件化改造是比较容易的,只要将功能分类,然后将分类好的代码拷贝生成各自独立的apk即可;

 

【宿主apk】拷贝文件的时候先拷贝资源,在拷贝代码;

【首页apk】需要声明启动的activity是homeActivity;

 【搜索apk】

【增加small的跳转方法】

 

【运行项目】与之前的项目的跳转流程一致;

3.公共库插件的创建

 

【问】如下在gradle中添加了complile编译语句之后,与引入第三方库有什么区别呢?

【答】此下面的语句只是在编译的时候起作用,实际在small最后都将此lib库编译成为了.so文件,以apk的形式出现在项目中;

4.small进阶讲解

4.1 自定义id分段

自定义资源ID分段

在整合插件资源的过程,为避免资源ID冲突,需要为每个插件分配一个ID段。

我们知道默认程序的ID段为 0x7f。由于系统使用了 0x00,0x01,0x02。因此插件允许的范围在 [0x03, 0x7e] 之间。

但是有些手机厂商占用了一些分段,黑名单如下:

ID厂商
0x03 HTC
0x10 小米

为此,Small 根据哈希算法将插件的模块名散列到 [0x11, 0x7e] 区间,作为自动分配的插件资源ID段,比如:

模块名ID
app.main 0x77
lib.style 0x79

但是,这个算法生成的ID有可能是重复的,所以必要时你可以通过以下方法自定义插件的资源ID。

修改 build.gradle

在插件模块所在的 build.gradle 脚本里,增加配置:

ext {
    packageId = 0x12
}

这里的 0x12 是16进制整型值

将把当前插件的资源ID段分配为 0x12。

或修改 gradle.properties

在插件模块所在的 gradle.properties 配置里,增加配置:

packageId=3f

properties只接收字符串值

将把当前插件的资源ID段分配为 0x3f。

 4.2 插件路由

为了方便插件之间的跨平台调用,Small 提供了 bundle.json 来完成插件路由。

bundle.json 的基本格式为:

{
  "version": "1.0.0",
  "bundles": [
    { bundle1 },
    { bundle2 },
    {   ...   },
    { bundleN }
  ]
}

其中 version 暂为当前文件格式版本,始终为 1.0.0。 bundles 为插件数组。每个插件遵循以下配置。

插件配置

pkg

当前插件的包名,比如 net.wequick.example.small.app.main。

uri

指定当前插件的唯一ID,比如 main。 同时这个 ID 也作为插件的主路由。在不同平台下主路由的表现为:

平台界面
Android pkg 插件下的 LauncherActivity
iOS pkg 插件下的 uriController
HTML base_uri/uri 或 base_uri/uri.html

type

插件类型:

  • lib - 公共库插件
  • app - 业务插件

默认从 pkg 中解析:

  • 当 pkg 包含 .lib. 或以 .libxx 结尾时,取 lib
  • 当 pkg 包含 .app. 或以 .appxx 结尾时,取 app

如果 pkg 不遵循上述格式,需要显式指明。

rules

插件的子路由表。假设在 uri 为 home 的插件下指定:

{
  "uri": "home",
  "rules": {
    "abc": "Some"
  }
}

"home/abc" 将被路由往 home 插件下的 Some 界面,在不同平台下的表现为:

平台界面
Android pkg.SomeActivity
iOS pkg.SomeController
HTML base_uri/home/Some 或 base_uri/home/Some.html

插件调用

Android:

Small.openUri("home", context);

这里的 {{base_uri}} 通过 Native 指定。

Android:

Small.setBaseUri("https://your_base_uri");

参数传递--不支持对象类型的插件的传递;

使用 Query标准 来传递参数,即在 uri 之后加上 ? 再带上键值对,多个键值对用 & 来分开。

如 "detail?id=1000&title=test"。

在接收方取值的方法为:

Android:

// app.detail/MainActivity
Uri uri = Small.getUri(this);
if (uri != null) {
    String id = uri.getQueryParameter("id");
    // Do stuff by `id'
}

 4.3 编译选项

在运行 ./gradlew xx 命令时,可以加入 -Dxx 选项来控制编译方式,包括:

bundle.arch

buildToAssetsfalse 的情况下,使用 -Dbundle.arch=xx 可以指定 so 形式插件生成到 [宿主目录]/smallLibs/xx 目录下。

通常在调试模拟器时,你可以使用 x86,在真机打包时使用 armeabi

bundle.minify

用于指定是否混淆插件,如 ./gradlew buildLib -Dbundle.minify 将对所有公共库插件进行混淆。

org.gradle.parallel

这个是系统自带的选项,用于指定是否并行编译。之所以在这里提及是因为 buildLib 的时候不能打开这个选项,因为公共库插件依赖了宿主,需要宿主编译完成才能正确引用资源。

所以如果你使用持续集成的话,可以用以下的命令集合:

./gradlew cleanLib -q -Dorg.gradle.parallel=true
./gradlew buildLib -q -Dorg.gradle.parallel=false -Dbundle.minify=true
./gradlew cleanBundle -q -Dorg.gradle.parallel=true
./gradlew buildBundle -q -Dorg.gradle.parallel=true -Dbundle.minify=true

 

5.Atlas插件化介绍

【官网地址】http://atlas.taobao.org/docs/principle-intro/Runtime_principle.html

posted @ 2018-05-19 09:37  OzTaking  阅读(383)  评论(0)    收藏  举报