Small插件化框架的初步使用

2017-03-25 10:30:59来源:http://www.jianshu.com/p/9cee5200717a作者:Elder人点击


一、来龙去脉

由于公司安排了一个调研腾讯新闻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毫无关系。


回到宿主的 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: 最后运行插件

运行的效果如下:




写在最后

这个即是我使用Small框架合入自身功能模块的操作流程,如果有不对的地方希望各位同学及时指正啊。后续更新该框架的使用,在公司项目中真正使用的时候会遇到哪些坑呢,想想就酸爽啊-_-!
最后的最后奉上这个Demo的GitHub地址有兴趣的同学可以看下啊。




微信扫一扫

第七城市微信公众平台