1.模块分离
1.基础模块
基础模块主要封装网络请求,日志框架,路由设置等信息
- 业务模块
业务模块依赖基础模块,实现不同模块业务,比如聊天,支付
3.app壳模块
app壳模块集成所有模块用于打包整体app
2.代码分离
基础模块用api关键字实现代码模块共享
业务模块使用implement实现模块内部代码引用
app壳模块使用implement实现runtimeOnly关键字实现运行时代码可见
3.资源区分
不同模块在gradle里声明前缀,比如公共基础模块资源设置如下:
resourcePrefix "public_" //给 Module 内的资源名增加前缀, 避免资源名冲突
4.分模块运行设置
if (isBuildModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
apply plugin: 'com.jakewharton.butterknife'
在gradle.properties文件里声明一个变量来控制是否需要分模块运行
#isBuildModule 为 true 时可以使每个组件独立运行, false 则可以将所有组件集成到宿主 App 中
isBuildModule=true
5.打包整体app
在app壳gradle配置如下
if (!isBuildModule.toBoolean()) {
//在宿主 App 中使用 implementation 依赖业务组件, 业务组件的代码就会完全暴露给宿主 App, 不利于代码的隔离
//使用 runtimeOnly 依赖业务组件, 可实现业务组件的代码在编译时对宿主 App 不可见, 仅在运行时对宿主 App 可见
runtimeOnly project(":module_1")
runtimeOnly project(":module_2")
runtimeOnly project(":module_3")
}
6.模块间通讯
通过接口下沉实现,然后利用Arouter实现数据和类型寻找
方案:
每个模块集成commonservice模块,commonservice主要暴露接口,具体实现类在每个模块内部,实现代码分离
commonservice的接口声明代码实例如下
public interface GankInfoService extends IProvider {
GankInfo getInfo();
}
然后在对面模块的接口实现
@Route(path = RouterHub.GANK_SERVICE_GANKINFOSERVICE, name = "干货集中营信息服务")
public class GankInfoServiceImpl implements GankInfoService {
private Context mContext;
@Override
public GankInfo getInfo() {
return new GankInfo(ArmsUtils.getString(mContext, R.string.public_name_gank));
}
@Override
public void init(Context context) {
mContext = context;
}
}
这样就可以通过Arouter去传递数据,而模块之间的跳转直接通过arouter的路由表去实现即可。
7.注意:公共模块不宜太多代码,否则分模块运行时耗时不乐观,建议大多业务逻辑代码放在对应模块
网友评论