【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
在 buildToAssets 为 false 的情况下,使用 -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
浙公网安备 33010602011771号