Small插件化框架的初步使用
一、来龙去脉
由于公司安排了一个调研腾讯新闻App中读书模块功能是如何实现的,对于我这种小菜鸟来说第一时间求助了涛哥(哈哈涛哥是谁...无法解答一个答案啊),他分析了一下可能是ReactNative框架实现的,于是查阅了大量资料准备系统学习ReactNative框架,学习这种未知技术还是非常有趣和痛苦的(大家都懂的)。这里大家可以看下ReactNative的中文网站简单写一个HelloWorld还是蛮简单的啊,这里对中国的大陆的各种墙深恶痛绝下-_-!但是突然突发奇想要不先反编译一下腾讯新闻App看看,会不会找到一些灵感呢。结果突然间有了意外收获啊!!!
在apk的assets/plugin文件夹下竟然看到了这个,震惊了一下下,所以猜想它应该是动态加载了腾讯阅读的功能模块。
所以就查了一下,发现自己弱爆了,这就是所谓的插件化开发的技术啊。推荐一篇博文名字起的还是非常霸气的“Android插件化:从入门到放弃”,文章最后也指出Android开发的动态化加载还是非常看好ReactNative的,所以以后一定好好系统学习ReactNative。
好了说了一大堆总算引出我们今天的主角Small插件化框架了,这里是它的GitHub地址,网上关于它的介绍大家可以自行Google,我这里只是简单的介绍一下它的基本使用方法,好让我们开始吧。
二、准备工作
基于官方文档你会学习到它的一些基本操作,这里我简单说一下设置Gradle时应该注意的地方。
这是Project.gradle的整体配置情况,这里说明一下buildToAssets默认是false,在编译插件的时候默认会将插件编译成.so文件保存到项目中,如果设置为true时就会将插件编译成apk文件保存在assets文件夹中。
编译完成后,需要在Terminal命令行中运行
gradlew small
,最后出现如下所示就代表配置已经没问题了(这里吐槽一下公司的网,编译一个多小时有木有!!!)
三、基本使用
Step 1:配置宿主
宿主也就是我们的载入其它插件的载体,宿主不应该建立写入业务逻辑只应是单单成为插件的载体(参见使用Small框架的建议)
- 1、新建Application配置如下(别忘记在Manifest文件中声明啊)
public class SmallApp extends Application {
@Override
public void onCreate() {
super.onCreate();
Small.preSetUp(this);
Small.setLoadFromAssets(BuildConfig.LOAD_FROM_ASSETS);
}
}
这里由于我要将插件编译成apk保存在assets文件夹中,所以应提前建立assets文件夹。
Step 2: 创建插件模块
右键 app 模块 > New > Module:
这里简单说明一下如果是应用插件都以app.开头,如果是公共库插件都已lib.开头。
Step 3: 编译插件
- 先编译公共库
- 编译插件
- 查看编译情况
同样如果出现编译成功即可。
Step 4: 启动配置插件
在assets文件夹下新建bundle.json文件并配置如下:
{
"version": "1.0.0",
"bundles": [
{
"uri": "main",
"pkg": "com.example.appmain"
}
]
}
- version,是 bundle.json 文件格式版本,目前始终为 1.0.0
- bundles,插件数组
- uri,插件唯一ID(在宿主调用时指定的具体url)
- pkg,插件包名
这里需要指出这里的bundle代表插件与Android中的Bundle毫无关系。
- bundles,插件数组
回到宿主的 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: 运行宿主
如果你能出现如图所示的情况,恭喜你已经实现了框架的基本使用。我相信大家跟着文档都可以轻松实现,但这里我想跟大家重点分享的是如何合入已编译好的功能插件化。
四、合入自有功能模块
Step 1: 导入模块
这里需要注意命名的时候也是以app.*开头代笔是应用插件。
Step 2: 将导入模块的权限拷入到宿主的清单文件中
Step 3: 配置bundle.json文件
将最新加入的模块编入文件中
Step 4: 编译插件
命令还是上面那些,这里需要注意一下,每次重新编译的时候建议大家先执行gradlew cleanLib -q
清除之前的编译,总觉得这样保险一些。
gradlew cleanLib -q
gradlew buildLib -q
gradlew buildBundle -q
gradlew small
Step 5: 最后运行插件
运行的效果如下:
![](https://github.com/xunuosi/img/blob/master/blog/jianshu/Small/1.gif?raw=true =80*60)
写在最后
这个即是我使用Small框架合入自身功能模块的操作流程,如果有不对的地方希望各位同学及时指正啊。后续更新该框架的使用,在公司项目中真正使用的时候会遇到哪些坑呢,想想就酸爽啊-_-!
最后的最后奉上这个Demo的GitHub地址有兴趣的同学可以看下啊。