android small 插件化学习
1 集成部分:https://github.com/wequick/Small
1.1 添加依赖jar
app/build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion '25.0.0'
defaultConfig {
applicationId "com.small.smallstudy"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
signingConfigs {
release {
storeFile file('C:\\Users\\Administrator\\Desktop\\APK签名\\android.keystore')
storePassword "12345678901234567890"
keyAlias "android.keystore"
keyPassword "12345678901234567890"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:design:24.0.0'
}
1.2 bulid.gradle//加入small工具
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'net.wequick.tools.build:gradle-small:1.3.0-beta5'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
apply plugin: 'net.wequick.small'
small {
aarVersion = '1.1.0-alpha2'
}
1.3 创建模块
File->New->Module来创建插件模块,需要满足:
模块名形如:app.*, lib.*或者web.*
包名包含:.app., .lib.或者.web.
为什么要这样?因为Small会根据包名对插件进行归类,特殊的域名空间如:“.app.” 会让这变得容易。
对lib.*模块选择Android Library,其他模块选择Phone & Tablet Module。
创建一个插件模块,比如app.main:
1.4 配置路由路径
右键app模块->New->Folder->Assets Folder,新建assets目录,
右键assets目录->New->File,新建bundles.json文件,加入:
{
"version": "1.0.0",
"bundles": [
{
"uri": "main",
"pkg": "com.small.appmain",
"rules": {
"sub": "Sub"
}
}
]
}
2 编译配置部分:
Build libraries (准备基础库)
[./]gradlew buildLib -q (-q是安静模式,可以让输出更好看,也可以不加)
Step 4. Build bundles (打包所有组件)
[./]gradlew buildBundle -q (-q是安静模式,可以让输出更好看,也可以不加)
2 路由跳转传参实现
路由:
Small.openUri(“main”, MainActivity.this);//指定当前插件的唯一ID,比如 main。Android pkg 插件下的 LauncherActivity
Small.openUri(“main/Sub”, MainActivity.this);//路由跳转,Android pkg.SubActivity
传参:
使用 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'
}
3 热更新更新实现
由于small机制是将插件打包成so放置在宿主,所以热更新只需打包新的so,按需求修改bundles.json(并不是传统意义上的class替换获取方法替换)
此处可使用差分,合并so的机制,实现增量更新。
{
“manifest”: {
“bundles”: [
{
“uri”: “main”,
“pkg”: “com.small.appmain”,
“rules”: {
“sub”: “Sub”
}
}
],
“version”: “1.0.0”
},
“updates”: [
{
“pkg”: “small.cn.app.change”,
“url”: “http://192.168.19.125:8080/json/libchange.so“//修改so
}
]
}
//使用新so替换旧so,app应用重启生效