Android插件化之Small第二弹
1.公共库插件
在Small框架中一般可以将插件分为业务插件和公共库插件,一般情况下,公共库插件module name的命名方式是lib.,对应的package name为.lib*。这是small推荐的命名方式,这样就不用做其他额外配置了,然后只要在宿主module的bundle.json中配置声明就能正常工作了。
{
"pkg": "com.example.liblogic"
}
因为这只是一个公共库插件,所有不需要配置uri。为了开发阶段的方便,业务插件依赖公共库插件的依赖关系还是要配置的,否则会找不到对应的类,但是在small打包时,这个依赖关系时无用的,就是说就算module间的依赖关系不配置,最终打包出来的程序一样能正常运行。
有时因为一些特殊情况,公共库的命名不能用small推荐的方式,那么就要做一些特殊的配置。在整个项目的build.gradle中添加配置如下,
small {
aarVersion = '1.2.0-alpha6'
buildToAssets = false
strictSplitResources = true
bundles 'lib','logic2'
}
上面是small的DSL语言,其中bundles这个方法就是用来声明插件,上面就是声明了logic2这个module是一个lib(公共库插件类型)的插件。
然后在bundle.json中再声明如下
{
"pkg": "com.example.logic2",
"type": "lib"
}
这样就可以正常使用logic2这个公共库插件了。最后我们编译一下,就能看到那个熟悉的表格
QQ20170719-154620.png2.Small进阶知识
1.Small DSL
DSL 即 Domain Specific Language,领域专用语言。Small也有自己的一套标准,上小节已经使用过了。因为属性方法并不多,有些也不是必须要配置的,所以并不算难。不过这里有个坑,Small DSL的语法会根据gradle-small的版本变化而变化,比如官网介绍strictSplicResources
这个属性其实并没有,真正的属性名称叫做strictSplitResources,就类似这样的问题,那怎么办呢?开源项目嘛,去github主页上看源码...
Small/Android/DevSample/buildSrc/src/main/groovy/net/wequick/gradle/RootExtension.groovy
RootExtension.groovy这个文件定义了Small DSL的语法。
2.插件路由
关于插件路由,就是bundle.json中的配置信息。之前我们配置一个业务插件只配置了uri和package,这个情况下,我们根据uri只会打开对应业务插件中被定义了launch的activity,有时会业务需求要打开这个module中的另外一个activity,这种情况下,bundle.json需要这么配置
{
"uri": "alarmbox",
"pkg": "com.example.appalarmbox",
"rules":{
"other":"Other"
}
}
这会比一般情况多设置一个rules。在这个module的主包下有一个OtherActivity,我们会根据“alarmbox/other”这个uri去启动OtherActivity。关于参数问题,在一般android开发中Activity之间进行跳转通过Intent,Intent是可以带参数的,那么在Small中我们这么传参数呢?其实很简单,就跟网页的传参方式一样,只需要在uri后面带上就行。
Small.openUri(uri+"?id=1&title=sdk",MainActivity.this);
那么目标Activity怎么获取?
Uri uri = Small.getUri(this);
Log.i("info",uri.toString());
String id = uri.getQueryParameter("id");
String title = uri.getQueryParameter("title");
Log.i("info","id="+id+",title="+title);
3.自定义资源ID分段
Small在整合插件资源的过程,为避免资源ID冲突,需要为每个插件分配一个ID段。我们知道默认程序的ID段为 0x7f。由于系统使用了 0x00,0x01,0x02。因此插件允许的范围在 [0x03, 0x7e] 之间。
但是有些特殊情况,比如一些特殊机型的系统会占用某个内存,那么就会产生异常,这种情况下就需要对内存分配地址重新调整。
这是我们不做任何配置的编译结果。我们在logic2这个modlue的gradle.build中添加
ext{
packageId = 0x88
}
然后再编译下发现logic2这个module分配的id首地址变成了0x88,如图
QQ20170719-165007.png4.其他
关于Small进阶还有编译选项,宿主分身模块的方面问题,这个暂时在项目中没有用到,本着“不使用,无发言权”的原则,下次用到再总结。
3.总结
关于Small的基础研究将告一段落,下阶段将进行实际项目的改造工作,一定会遇到不少坑,到时会和大家进行分享。谢谢,再见!