Small插件化方案适用于将一个APK拆分为多个公共库插件、业务模块插件的场景。
完美内置所有插件支持内置于宿主包中
高度透明插件编码、布局编写方式与独立应用开发无异
插件代码调试与整包开发无异极致剪裁对插件分离所有一切能分离的公共代码、资源
无缝链接通过设定URI,宿主、本地化应用插件、本地化web插件、在线网页,以及任何自定义的插件之间能够相互调起与传递参数
工程build.gradle中引入small,目前已发布gradle插件1.0.0-beta7版本,small组件1.1.0-beta4.
buildscript {
...
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'net.wequick.tools.build:gradle-small:1.0.0-beta7'
....
}
}
...
apply plugin: 'net.wequick.small'
small {
aarVersion = '1.1.0-beta4'
}
工程结构包括宿主工程app,业务模块插件app.*,以及lib.*公共库插件工程。如:
- 1.app 宿主工程
宿主工程中仅仅应用入口HostApp,启动首屏展示LoadingActivity(不包含任何网络加载逻辑,广告图片加载逻辑放在业务插件app.launch中)。build.gradle中包含signingConfigs、buildTypes等,插件公共依赖可放到dependencies中,不会打包到插件中。
记得在assets中bundle.json文件配置插件包名和路由rules,否则small将找不到对应插件。
- 2.app.业务模块*
业务模块之间互相独立,通过small来管理跳转和fragment的获取。业务模块包含自己的APIService(网络请求使用lib.net,底层是retroifit+okhttp)、UI(Activity、Fragment、View、Adapter)、Model、Application。
Small Activity跳转
Small.openUri("main", LaunchActivity.this);
Small获取Fragment
BaseFragment fragment = (BaseFragment)Small.createObject("fragment-v4", "community/community", MainActivity.this);
- 3.lib.模块*
lib模块的引用最好在宿主工程中也保留一份,这样不会打包到插件中,可以使最后只保留一份引用。Account也可以做成lib,供其他app插件调用。
lib.style中包含通用的动画、颜色、规格、尺寸、主题。
lib.utils放置一些通用help、utils,依赖style(dialog主题)。
lib.config 应用的配置信息,版本号、包名、系统信息等。
lib.constant 暂时放置一些常量、枚举、key、id等。
lib.analytics统计API
lib.net 网络请求框架,retroifit+okhttp,处理token错误等全局错误。
lib.base放置Activity、Application、Fragment等的基类。
lib.router Small的uri特殊处理
- 4.其他第三方模块和aar
其他依赖最好通过私有maven仓库管理。
jni_plugin用来存放一些so文件,以及jni接口。
jsbridge--webview和native交互的一个库,参考
https://github.com/gzsll/WebViewJavascriptBridge。