Android组件化初探

1. 现状

随着业务增加,代码量急剧增加,大大延长了编译时间,短则3min,长则7、8min;很多同学为节省开发时间,自己新建新的app,完成开发后,再合并到project中;组件化的目的就是为了解耦,将业务模块独立出来,自成一个apk,这样开发期间能提高效率

2. 原理

编译期间动态设置自己业务Module属性(app/library)
在开发期间,只需要编译自己的业务模块代码,并将自己业务模块Module设置app;这样能很大程度上提高编译速度,提高开发效率;在发版期间将自己业务Module设置为libray模式即可

3. 需要解决的问题

  1. 需要在编译期间动态设置自己业务模块属性(app/library)
  2. 开发模式应该存在一个DebugActivity 以作为app启动页;发布模式应该将其忽略不参与打包
  3. 为保证资源不与其他模块存在冲突,应限定自己module所有资源带有指定前缀
  4. 业务模块可能会存在依赖其他业务模块功能,如何实现?
  5. debug模式和发布模式下清单文件应该单独区分
  6. 业务module在运行期间可能会对debug/发布模式做不同操作处理,java代码层如何区分?
  7. 当自己业务模块代码增加时,如何提高开发效率?

4. 实现

4.1 编辑根目录gradle.properties文件

为了能够区分开发模式和发布模式,我们可以在项目根目录gradle.properties文件中添加一个属于自己业务模块变量,以区分是开发模式还是发布模式(下面以module1为样例进行说明)

    #标识MODULE1以app方式启动,发布时可改为falseMODULE1_IS_APP = true

4.2 编辑settings.gradle文件

让gradle动态指定需要参与编译的module

if(MODULE1_IS_APP.toBoolean()){include ':module1', ':framework', ':baseresource'
}else{include ':app', ':module1', ':framework', ':baseresource'
}

4.3 编辑moudle1工程中build.gradle文件

为能在编译期间动态设置通通花module是以app还是library需要添加如下代码:

//解决问题1
if (MODULE1_IS_APP.toBoolean()) {apply plugin: 'com.android.application'//解决问题7,关于如何集成freeline//参见(http://blog.csdn.net/dbs1215/article/details/64166592)此处不再阐述请参考//apply plugin: 'com.antfortune.freeline'
} else {apply plugin: 'com.android.library'
}android {compileSdkVersion 23buildToolsVersion "23.0.3"defaultConfig {minSdkVersion 14targetSdkVersion 23versionCode 1versionName "1.0"if (MODULE1_IS_APP.toBoolean()) {multiDexEnabled true}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}buildTypes.each {//解决问题6 代码中可以通过BuildConfig.MODULE1_IS_APP获取it.buildConfigField "boolean", "MODULE1_IS_APP", MODULE1_IS_APP}//解决问题3 (只能做到布局文件,字符串等资源前缀,java类,图片需要自己处理)resourcePrefix "module1_"sourceSets {main {//解决2、5问题if (MODULE1_IS_APP.toBoolean()) {//如果是app启动,使用该清单文件manifest.srcFile 'src/main/xml/app/AndroidManifest.xml'} else {manifest.srcFile 'src/main/xml/library/AndroidManifest.xml'java{//debug包不参与打包exclude '**/debug/**'}}}}configurations {all*.exclude group: 'com.android.support', module: 'support-v4'all*.exclude group: 'com.android.support', module: 'support-annotations'}
}dependencies {//业务module需要依赖的相关库compile fileTree(dir: 'libs', include: ['*.jar'])compile project(':framework')compile project(':baseresource')
}

4.4 问题4如何解决?

可以通过依赖注入来实现

  1. 首先可以声明一个接口IDependService
    添加Module1需要依赖其他Module的方法

  2. 在依赖方Module某个路径下实现该接口

  3. 在Module1添加一个类Module1SDK(单例)对象初始化时通过反射实现依赖注入

具体如何实现可以参见末尾代码链接

依然存在的问题

  1. 当自己的业务module1联调依赖于其他业务module功能时,需要以app为主工程启动,耗费时间,暂时没找到别的有效办法
  2. 当自己的业务module1依赖于公共组件/基础模块,但未下沉,无法引用,尴尬。。。。只能通过copy(简单点)/下沉(改动较大)方式来做

思考

  • 如何定义并剥离Module
  • 组件与组件间通讯(Router)

示例工程链接

Android组件化初探相关推荐

  1. Android组件化与插件化开发项目实战整理分享(含支付宝、360、美团、滴滴等大厂项目实战)

    小公司不说,但是在大公司的项目发展到一定程度,就必须进行模块的拆分.模块化是一种指导理念,其核心思想就是分而治之.降低耦合.而在 Android 开发的实践,目前有两种途径来实现,一个是组件化,一个是 ...

  2. 腾讯技术团队人手一份的Android组件化实战笔记(含得到、微信、美团、爱奇艺APP架构项目及源码)

    前言 以前的Android开发大多用的中心化管理思想,将相同的资源集中进行管理.随着项目的发展,弊端渐显:集中管理的资源越来越多,多人开发也越来越麻烦,时常牵一发而动全身. 尤其是在大公司或者是大项目 ...

  3. 业务逻辑组件化android,AppJoint 极简 Android 组件化方案

    AppJoint 极简 Android 组件化方案.仅包含 3 个注解加 1 个 API,超低学习成本,支持渐进式组件化. 开始接入 在项目根目录的 build.gradle 文件中添加 AppJoi ...

  4. Android组件化打造知乎日报系列(一)—— 项目架构搭建

    Android组件化打造第三方知乎日报系列(一)-- 项目架构搭建 本节完整代码可以前往github查看,项目地址:github.com/N0tExpectEr- Android组件化打造知乎日报系列 ...

  5. 为何需要Android组件化,如何搭建?

    为什么需要android组件化? 因为,一个项目(APP)里面有很多功能模块啊,有些功能模块完全可以提出来公用.例如:网络请求(登录.注册).图片处理(压缩.点击)等. 张华洋老师博客说的很多:And ...

  6. android组件化开发视频教程,教你打造一个Android组件化开发框架

    作者简介 本篇来自 lucky_billy 的投稿,分享了他的开源组件化框架,详细地讲解框架形成的思路,希望对大家有所帮助. lucky_billy 的博客地址: 解读开源框架设计思想 B站学习视频 ...

  7. 【Android 组件化】路由组件 ( 页面跳转参数依赖注入 )

    文章目录 一.参数自动注入 二.自定义注解 三.使用 @Extra 自定义注解 四.注解处理器解析 @Extra 自定义注解 并生成相应 Activity 对应代码 五.博客资源 组件化系列博客 : ...

  8. 【Android 组件化】路由组件 ( 路由框架概述 )

    文章目录 一.路由框架概述 二.路由框架整体流程 三.博客资源 组件化系列博客 : [Android 组件化]从模块化到组件化 [Android 组件化]使用 Gradle 实现组件化 ( Gradl ...

  9. 【Android 组件化】路由组件 ( 生成 Root 类记录模块中的路由表 )

    文章目录 一.Root 表作用 二.生成 Root 表 三.完整注解处理器代码 及 生成的 Java 代码 ( 仅供参考 ) 1.注解处理器代码 2.app 模块中的注解类生成的 Java 源码 3. ...

最新文章

  1. 关于Netty的一些理解、实践与陷阱
  2. python画端午节_我想带你去旅行,我用Python提前做了一份端午旅游攻略,请收下!...
  3. 创建一个学生信息表,与页面分离
  4. SQL基础---SQL AND OR 运算符
  5. 全局事件总线 (GlobalEventBus)
  6. HTTP 错误 500.22 - Internal Server Error
  7. Python 猜数字游戏
  8. 《密码爆破漏洞详解》——黑客必修的入门操作( 建议收藏 )
  9. 关于消息推送,你可以知道这个
  10. Starling自适应设备大小的做法
  11. # 学号20155308 2006-2007-2 《Java程序设计》第4周学习总结
  12. Java并发机制的底层实现原理(Java并发编程的艺术整理)
  13. c语言 数组 全部赋值0,关于C语言数组赋值方法
  14. 动手实现图像双线性插值——实现图像resize
  15. 无密码如何破解PDF加密
  16. [导入]2008大型历史正剧《朱元璋》更新第46集[完结]
  17. Maya: 菜单 曲面 双轨成形双轨成形2工具
  18. 信息传输速率与传信率_波特率和数据传输速率的关系
  19. 抖音微商引流之抖音实战引流技巧,,抖音/快手/火山热门技术---
  20. 文明重启怎么找回之前的服务器,文明重启房子消失怎么找回 详尽攻略助你一臂之力...

热门文章

  1. mysql profile 不记录_mysql profile使用(转)
  2. kda 处理曲面地图绘制的问题
  3. CVPR 2022|重新思考对齐Prototype的域自适应:基于Graph Matching的新范式
  4. 今晚直播 | AAAI 2022论文解读:重新思考图像融合策略和自监督对比学习
  5. 可真有你的!EasyEdge模型压缩新姿势……
  6. 浅谈嵌套命名实体识别(Nested NER)
  7. BERT在多模态领域中的应用
  8. Nature论文解读:用于改善加权生物网络信噪比的网络增强方法
  9. 2020.10.04蓝桥测试
  10. 机器学习理论《统计学习方法》学习笔记:第十章 隐马尔可夫模型(HMM)