Android项目中代码量达到一定程度,编译将是一件非常痛苦的事情,短则一两分钟,长则达到五六分钟。Android studio推出instant run由于各种缺陷一般情况下是被关闭的……
组件化开发可以有效降低代码模块的耦合度,使代码架构更加清晰,同时模块化的编译可以有效减少编译时间,当然总的编译时间是不会减少的,只是App模块化之后开发某个模块时,只需要编译特定模块,可以快速编译调试。

百牛信息技术bainiu.ltd整理发布于博客园

原理

组件化和插件化有些同学有些迷惑,简单来说组件化是在编译期分模块,插件化是在运行期。一般插件化用于动态修复bug或者动态更新模块,相对来说黑科技更多一些。

正常一个App中可以有多个module,但是一般只会有一个module是设置为application的,其他均设置为library,组件化开发就是要每个module都可以运行起来,因此在开发期间每个module均设置为application,发布时再进行合并。

实践

本文主要介绍一下项目组件化开发过程碰到的问题和解决办法,这里以
ModularizationApp项目为例。ModularizationApp是一个组件化的app:

Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

  • 架构

    Paste_Image.png

    其中App是主application,ModuleA和ModuleB是两个业务模块,Library是基础模块,包含所有模块需要的依赖库,以及一些工具类:如网络访问、时间工具等。代码结构如图:

Paste_Image.png

  • Module作为application开发

ModuleA和ModuleB是相对独立的业务模块,可以分别进行开发,编译时只编译自身,具体实现时在gradle.properties中设置变量,如:IsBuildMudle=false
在模块的的build.gradle中:

if (IsBuildMudle.toBoolean()) {apply plugin: 'com.android.application'
} else {apply plugin: 'com.android.library'
}

在主模块的build.gradle中设置:

    if (!IsBuildMudle.toBoolean()) {compile project(':ModuleA')compile project(':ModuleB')} else {compile project(':Library')}

这样每个module就可以独立安装使用了,注意在修改IsBuildMudle的值时,一定要sync gradle
当module单独运行和作为module运行时,其activity在manifest中设置也会不同,这里可以根据IsBuildMudle设置不同的manifest:

    sourceSets {main {if (IsBuildMudle.toBoolean()) {manifest.srcFile 'src/main/debug/AndroidManifest.xml'} else {manifest.srcFile 'src/main/release/AndroidManifest.xml'}}}

分别在不同的目录下创建manifest文件。一定要注意两个manifest的同步问题,否则出现了莫名其名的bug,还找不到原因……

  • 资源冲突问题

    当分别开发模块时,容易出资源重复命名的问题,可以在build.gradle中设置

    resourcePrefix "module1_"

    通过给模块设置不同的资源前缀,可以避免重复命名。

  • Activity跳转问题

    拆分业务代码时,自然会涉及到跨module的Activity跳转,当单独编译时,自然是不能获取到其他模块的引用的。有几种方式可以实现跨模块的唤起Activity:

隐式启动
通过设置intent-filter实现,这需要在manifest中插入大量代码,同时也降低了安全性(其他app就可以通过这种方式随意启动)。
通过类名跳转
Android业务组件化开发实践提出了一种通过类名跳转的方式,使用脚本生成Rlist类,比较方便快捷,但感觉不方便activity间传递数据。
Scheme跳转
Scheme的方式是建立映射表,集中处理Activity,这种方式可以传递一定的数据。Activity传递大量数据时可以通过EventBus来进行传递(其实即使通过intent显示启动,也不要把大量数据放置在intent中,intent对数据大小有限制)。
在进行本次实践时找到github上的一个url Router,同时支持http和程序内Activity跳转,而且通过注解的方式进行,使用非常方便,于是引入到了项目中。项目地址ActivityRouterActivityRouter的readme中已经有比较详细的wiki,但是还有一些需要注意的:

依赖问题:

ActivityRouter使用了apt方式,因此每个使用的module中均需要设置

apt 'com.github.mzule.activityrouter:compiler:1.1.5'

注意是每个module,在Library module中设置

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

即可。

多module问题

ActivityRouter通过注解在编译时生成mapping,如果多个module设置依赖,就会生成多个java文件,导致源文件重复,编译出错,ActivityRouter目前提供了解决方法,但是还没有正式发布版本,可以设置:

compile 'com.github.mzule.activityrouter:activityrouter:1.1.9'
apt 'com.github.mzule.activityrouter:compiler:1.1.6'

使用。使用在application中注解:

@Modules({"app", "moduleA", "moduleB"})
public class ModularizationApplication extends Application {
}

每个module中创建空java类注解:

@Module("moduleA")
public class ModuleA {
}

具体可以clone ModularizationApp查看代码。

编译运行

当在gradle.properties中设置IsBuildMudle=true时,可以独立运行每个module,独立运行调试,当设置IsBuildMudle=false,可以编译运行整个project,注意IsBuildMudle变量设置改变时,要对gradle进行sy

运行过程中有什么问题可以评论或者在github中提issue。

作者:wutongke
链接:http://www.jianshu.com/p/186fa07fc48a
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/bainiu/p/7581200.html

Android组件化开发实践相关推荐

  1. Android组件化开发实践(九):自定义Gradle插件

    本文紧接着前一章Android组件化开发实践(八):组件生命周期如何实现自动注册管理,主要讲解怎么通过自定义插件来实现组件生命周期的自动注册管理. 1. 采用groovy创建插件 新建一个Java L ...

  2. android 组件生命周期,Android组件化开发实践(五):组件生命周期管理

    每个Android应用启动时,都会先创建一个Application.通常在Application里我们会做一些应用初始化的操作,常见的有第三方SDK初始化.在应用组件化之后,组件与壳工程是隔离开来的, ...

  3. android组件化数据生命周期,Android组件化开发实践(五):组件生命周期管理

    每个Android应用启动时,都会先创建一个Application.通常在Application里我们会做一些应用初始化的操作,常见的有第三方SDK初始化.在应用组件化之后,组件与壳工程是隔离开来的, ...

  4. 架构:Android 组件化开发

    前言 强烈推荐先阅读这篇文章 Android 组件化最佳实践 本文是阅读实践后的思考总结,更倾向实践步骤. 组件化开发架构 组件化开发大体就是这样的架构,最关键的是base 和 base_custom ...

  5. Vue.js组件化开发实践

    Vue.js组件化开发实践 前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了一下的内容.首先会对使用Vue进行开发的一 ...

  6. android组件设计,Android组件化开发路由的设计实践

    调研了一下目前的路由框架,ARouter(阿里的),ActivityRouter都使用了apt技术 编译时注解,个人想法是一口吃不成胖子,先做个比较实用的. VpRouter路由框架主要应用于组件化开 ...

  7. android 登录组件开发,Android组件化开发路由的设计

    调研了一下目前的路由框架,ARouter(阿里的),ActivityRouter都使用了apt技术 编译时注解,个人想法是一口吃不成胖子,先做个比较实用的. VpRouter路由框架主要应用于组件化开 ...

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

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

  9. android 组件化_你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转...

    组件化开发有什么好处? 1.当项目越来越大时,app的业务越来越复杂,会出现业务功能复杂混乱,各功能块.页面相互依赖,相互调用太多导致耦合度高,而采用组件化开发,我们就可以将功能模块合理的划分,降低功 ...

  10. 美团前端组件化开发实践

    随着前端开发复杂度的日益提升,组件化开发应运而生,并随着 FIS.React 等优秀框架的出现遍地开花.这一过程同样发生在美团,面临业务规模的快速发展和工程师团队的不断扩张,美团历经引入组件化解决资源 ...

最新文章

  1. java设置缓存机制
  2. c 使用matlab引擎,[转载]C与MATLAB混合编程之调用MATLAB引擎
  3. python 配置文件对比_Python运维自动化之nginx配置文件对比操作示例
  4. 互联网1分钟 | 0117 IBM入驻上海张江人工智能岛;IoT业务将成为小米新支撑点
  5. java wifi监听_Android 监听 WiFi 开关状态
  6. android普通权限说明,Android权限说明.doc
  7. C++四种cast操作符
  8. 每日一题(46)—— volatile
  9. 2020身高体重标准表儿童_2020年儿童标准体重表出炉!过胖影响发育!(附身高体重标准表)...
  10. MPLS ×××配置
  11. app-v 4.6 management server部署(一)
  12. fastjson android 版本,fastjson 1.1.58.android 发布,Bug 修复版本
  13. java linux 格式化磁盘,Linux添加新硬盘、分区、格式化、自动挂载
  14. vba 窗体单选框怎么传回sub_EXCEL表格VBA中函数的日常使用
  15. Parallels Desktop:pd虚拟机 17 for mac
  16. C#+sqlserve实现登陆界面
  17. “the+形容词”的四种类型及语法特征
  18. 《 嵌入式系统设计与实践》一一2.1 构建系统框图
  19. 方差分析(ANOVA)分类、应用举例及matlab代码
  20. macos 管理员权限 黑苹果_自己安装黑苹果,其实黑苹果也没那么难~

热门文章

  1. 【JDBC】JDBC的使用(数据库的增删改查询)
  2. 用户、角色、权限表的设计(mysql)
  3. vue3 Vite 2.0 Vue-Router 4.0 TypeScript elementPlus admin 须弥戒后台案例小结
  4. LayaAir 定时器 Timer
  5. 阶段3 2.Spring_03.Spring的 IOC 和 DI_13 课程知识梳理
  6. [Swift]LeetCode1106. 解析布尔表达式 | Parsing A Boolean Expression
  7. phpstudy配置域名后apache无法启动
  8. 《Pro SQL Server Internals, 2nd edition》的CHAPTER 2 Tables and Indexes中的Clustered Indexes一节...
  9. [py]__name__ 属于哪个文件
  10. mybatis的javaType和ofType