pins-模块内的代码及资源隔离方案

时间:2023-02-15 23:24:51

随着项目的不断迭代,复杂的业务模块及项目自身的基础技术组件迅速扩张,以往基于单个模块的项目往往显得过于臃肿。代码目录结构,包名混乱,代码模块职责不清晰,耦合度高,不便维护。基础公共组件没有抽取并剥离干净,新人上手较难,项目整体编译慢,等等。于是,近几年来,基于Gradle构建的模块化方案得到迅速应用,甚至在划分模块的同时,也可以将基础公共组件抽取独立的项目,并以单独的Git库进行管理和维护。

模块化的方案,整体上能够很好的将各个模块按照自身的职责进行独立划分,无论是基于业务的,还是基于技术的角度,得以能够达到“高内聚,低耦合”的效果。

但现实中,往往还存在一种“居中”的情况。
1,基于业务或者技术角度划分的模块,在职责界定时往往是有粒度的,这种粒度,有可能很大,也可以很小,如果以过大的粒度划分模块,模块内的代码耦合和隔离等情况依然存在问题,如果以过小的粒度分化模块,使得整个项目最终形成的模块往往过多,也不太利于整体理解和维护管理。

2,最终形成的项目模块,应该是粒度适中的,如基于业务维护的划分(从产品或用户视角下的产品功能),基于基于技术视角的基于职责的基础技术库的模块剥离。

3,最终形成的项目模块,尤其是基于业务维护的划分,最终模块内依然会存在多个子级粒度的业务,此时,在不宜进一步继续直接模块化的基础上,应该有一套类似模块化本身思维的技术方案,以实现模块内的模块划分,或称之为代码隔离。

子级粒度的业务,往往不仅包含既有的java代码,还包括了可能的jar包或so文件引入,可能图片资源,字符串类型资源,以及常见的布局文件等,此时,如果仅仅是传统方案下的java源码级别的按照目录形式的划分,往往是不够彻底的。

于是,微信最早对外发布的文章,微信Android架构历史,其中详细介绍了其模块内的代码隔离方案,pins。
后来,美团外卖中也是参照同样的思路实现了模块内的代码隔离。具体参见:美团外卖Android平台化架构演进实践

pins-模块内的代码及资源隔离方案

在思维模式上,pins其实与项目模块化本身,具有异曲同工之妙。并且也是在充分利用了Android Gradle构建工具基础上,通过修改指定的源集逻辑,显示隔离后的代码及资源文件的重新组合。

在技术原理上,pins自身并没有太多的技术本身,更多的充分利用了Android Gradle构建工具,比较巧妙的实现了模块内的再次隔离。

1,将模块内按照子级业务再次抽取,最终形成与src/main同样级别的目录划分(与上图中的微信pins目录结构有所不同),抽取的子级模块以p_子级模块名命名,其中,p_开头是为了后续修改源集逻辑时候的区分标识;

2,对应剥离具体的子级业务,包含java代码,其他资源文件等;

3,修改对应模块的Android Gradle构建时的源集逻辑,主要通过如:java.srcDirres.srcDir等方法将p_子级模块名对应添加上去。

对应修改源集逻辑主体部分如下:

android {

    sourceSets {
main {
def src_dir = new File(projectDir, 'src') def dirs = src_dir
.listFiles()
.toList()
.stream()
.filter(new Predicate<File>() {
@Override
boolean test(File file) {
return file.getName().startsWith("p_")
}
})
.map {
return it.getName()
}
.collect(Collectors.toList()) println("pins-module: " + dirs) dirs.each { dir ->
java.srcDir("src/$dir/java")
res.srcDir("src/$dir/res")
}
} }
}
复制代码

项目整体,依托模块化进行整体大的业务和技术模块划分,模块内,依据业务粒度,子级别的参照pins思路实现模块内的进一步代码及资源隔离,基础的公共技术组件,抽取成单独的Git项目库管理,以形成项目整体上的模块化实践方案。

作者:HappyCorn
链接:https://juejin.im/post/5c710d16518825626463d372
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

pins-模块内的代码及资源隔离方案的更多相关文章

  1. Kafka Topic Partition Replica Assignment实现原理及资源隔离方案

    本文共分为三个部分:   Kafka Topic创建方式 Kafka Topic Partitions Assignment实现原理 Kafka资源隔离方案   1. Kafka Topic创建方式 ...

  2. Hadoop Yarn内存资源隔离实现原理——基于线程监控的内存隔离方案

    注:本文以hadoop-2.5.0-cdh5.3.2为例进行说明.   Hadoop Yarn的资源隔离是指为运行着不同任务的“Container”提供可独立使用的计算资源,以避免它们之间相互干扰.目 ...

  3. 资源管理与调度系统-YARN资源隔离及以YARN为核心的生态系统

    资源管理与调度系统-YARN资源隔离及以YARN为核心的生态系统 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是资源隔离 资源隔离是指为不同任务提供可独立使用的计算资源以 ...

  4. Hadoop YARN资源隔离技术

    YARN对内存资源和CPU资源采用了不同的资源隔离方案.对于内存资源,它是一种限制性资源,它的量的大小直接决定应用程序的死活,因为应用程序到达内存限制,会发生OOM,就会被杀死.CPU资源一般用Cgr ...

  5. 混部之殇-论云原生资源隔离技术之CPU隔离&lpar;一&rpar;

    作者 蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. 导语 混部,通常指在离线混部(也有离在线混部之说 ...

  6. Yarn的资源隔离机制

    源调度和资源隔离是YARN作为一个资源管理系统,最重要和最基础的两个功能.资源调度由ResourceManager完成,而资源隔离由各个NodeManager实现,在文章“Hadoop YARN中内存 ...

  7. &lbrack;转&rsqb;Greenplum 资源隔离的原理与源码分析

    摘要: 背景 Greenplum是一个MPP的数据仓库系统,最大的优点是水平扩展,并且一个QUERY就能将硬件资源的能力发挥到极致. 但这也是被一些用户诟病的一点,因为一个的QUERY就可能占光所有的 ...

  8. nginx应用场景&comma;特性&comma;目录结构&comma;常用模块&comma;内置变量&comma;URL和URI&comma;http状态码&comma;配置文件详解

    1.nginx介绍 1丶俄罗斯人开发的,开源www服务软件 2丶软件一共780K 3丶nginx本身是一款静态(html,js,css,jpg等)www软件 4丶静态小文件高并发,同时占用的资源很少, ...

  9. SAP FI CO模块常用事务代码

                                                                                                        ...

随机推荐

  1. Struts 中 ActionContext ctx&period;put&lpar;&rpar;把数据放到ValueStack里之数据传输背后机制:ValueStack&lpar;值栈&rpar;

    1.     数据传输背后机制:ValueStack(值栈) 在这一切的背后,是因为有了ValueStack(值栈)! ValueStack基础:OGNL要了解ValueStack,必须先理解OGNL ...

  2. JS快速获取图片宽高的方法

    快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括IE低版本浏览器. 我们一步一 ...

  3. 某网SQL注入漏洞实战

      root@kali:~# sqlmap -u http://dn.you.com/shop.php?id=10 -v 1 --dbs   available databases [8]: [*] ...

  4. 有关dwr推送的笔记

    想做一个web推送相关的东东,昨天搞了一天,终于把这些杂乱的配制弄清了,今天写出来方便以后记住,也方便大家看一下吧 1:引入dwr包,我用的是maven <dependency> < ...

  5. &lbrack;Objective-c 基础 - 3&period;1&rsqb; 内存管理

    A.内存存放.retain.release 1.栈内存:存放局部变量,运行超过变量作用域自后编译器自动回收 2.堆内存:存放对象(地址,对象实体) 3.对象的基本结构 (1)引用计数器(4字节):当计 ...

  6. Android三种菜单简介

    Android的菜单分为三种类型:选项菜单(Option Menu).上下文菜单(Context Menu).子菜单(Sub Menu). 一.选项菜单 用户点击设备上的菜单按钮(Menu),触发事件 ...

  7. 关于Python的3张图

  8. 微渠道发展 BAE交通运输平台和java呼声,微信mysql数据库开发实例 --图文开发教程

    持续更新 BAE java开展mysql数据库 图文教程 BAE java语言发展mysql源码下载: 目前微信的发展.BAE开展.java开展.mysql教程开发非常,的介绍基于BAE平台.java ...

  9. 官方 React 快速上手脚手架 create-react-app

    此文简单讲解了官方 React 快速上手脚手架的安装与介绍. 1. React 快速上手脚手架 create-react-app 为了快速地进行构建使用 React 的项目,FaceBook 官方发布 ...

  10. 测试常用Linux命令

    大家应该经常在网络上看到下图吧,虽然我们不会去执行下面图片中的命令,但是linux常用的命令对于测试人员来说,还是必须掌握的,不管是做功能测试还是性能测试,最常用的就是看日志了. sudo是linux ...