Small icon indicating copy to clipboard operation
Small copied to clipboard

旧项目集成Small遇到了很多坑,能不能给个集成Small插件化的最佳实践?

Open offbye opened this issue 9 years ago • 4 comments

能不能给个集成Small插件化的最佳实践?

老项目其实并不老,也就大半年历史,100K+ java代码量,已经用了multidex。 主要有这几个问题: 老项目代码应该放在宿主App,还是放在插件App里面? 如何把用到第三方库拆分出来,放在lib里面吗?lib的dex是如何被app使用的? 百度地图SDK等是否可以做成插件lib?

offbye avatar Jul 09 '16 06:07 offbye

@galenlin 老项目集成small插件确实是个头疼的问题,有没有好的建议

Carlos2927 avatar Jul 09 '16 07:07 Carlos2927

@offbye, @Carlos2927

基本原则

宿主中不要放业务逻辑。只做加载插件以及调起主插件的操作。

重构步骤

1. 拆lib.* - 公共模块插件

  1. 把各个 第三方库 拆出来做成一个个lib.*插件模块,包括统计、地图、网络、图片等库。
  2. 把老项目积累的 业务公共代码 (utils)分离出来封装成一个lib.utils插件
  3. 把基础的样式、主题分离出来封装成一个lib.style插件

2. 拆app.* - 业务模块插件

  1. 把业务模块拆成app.*模块,他们可以依赖lib.*模块,显示调用lib.*中的各个API
  2. 相对独立的业务模块先拆,比如“详情页”、“关于我们”,如果剩下的业务不好拆,先放一个插件里
  3. 如果都不好拆,先把全部业务做成一个app.main主插件

3. 下沉宿主 - 宿主分身模块

宿主分身模块要求以 app+* 格式命名,他们将被宿主、lib.*app.* 模块自动依赖并允许这些模块透明地访问自己的代码或者资源。需要注意的是,分身模块最终是并入到宿主的而非插件,建议使用分身的情形有:

  1. 必须在宿主占坑的manifest,包括:
    1. 受限 Activity
      1. 包含了暂不支持的属性:process, configChanges 等
      2. 可能使用 FLAG_ACTIVITY_CLEAR_TOP 标签来启动 (#415)
    2. 任何 Provider, Service, BroadcastReceiver
  2. 必须在宿主占坑的资源,包括:
    1. 转场动画
    2. 通知栏图标、自定义视图
    3. 桌面快捷方式图标
  3. 确信稳定的公共库与资源

Sample示例

  1. lib.style - 公共主题
  2. lib.utils - 公共API、公共控件
  3. lib.analytics - 第三方统计
  4. app.main - 主插件
  5. app.home - 首页
  6. app.detail - 详情页
  7. app+stub - 占坑组件、资源

galenlin avatar Jul 09 '16 10:07 galenlin

“宿主工程不能有任何依赖lib的动作。”

这个让我查了好久,共勉!

JuanbingTeam avatar Jul 22 '16 08:07 JuanbingTeam

如果要加入百度地图功能,是要将百度地图的sdk放入宿主中吗?

wangjiujiu avatar Oct 23 '17 01:10 wangjiujiu