Android 模块化开发

article/2025/10/22 10:05:23

概述

单独开发每个模块,用集成的方式把他们组合起来,拼出一个app。如通用的模块,自动更新的模块,反馈模块,推送模块都可以单独以模块来开发,最后进行集成。我们可以通过一个壳来包含很多个模块。

好处

可以单独升级模块。耦合度低。同时,也很好地解决了“牵一发而动全身”的问题。方便分工。与其他团队合作时,如外包的团队,可以很好的地将核心代码与外包部分隔离开,不用和他们分享核心代码,让他们去做独立的功能,做好直接调用就行。方便以后重构代码,不用担心会改到核心代码。

架构分层

在这里插入图片描述

  • 顶层
    将所有的业务模块聚合在一起,加上配置,形成主应用。一个模块化做得好的应用,主应用都会比较简单且稳定。
  • 中间层
    模块按照功能划分。比如app可以划分为更新、登录、分享、播放等模块。采用aar作为模块的最小单位,之所以选择aar是因为jar不能带资源只能带java代码,library太容易被修改。aar的好处是能带资源并且是编译好的,不能被修改。保证了模块的版本不会在被别人调用的时候随意修改,如果想修改就要联系做aar的人,让他去升级aar的版本。
    在android studio里,用maven打包aar。aar其实就是依赖。
  • 底层:包含基础库和底层库
    (1)基础库:包含所有模块需要的依赖库,以及一些工具类,比如封装了的常用网络请求,封装图片处理fresco,数据库相关等,还包含所有模块需要的依赖库;
    (2)底层库:主要是使用C/C++开发的跨平台的引擎或者库,以so的形式存在。

Android Studio 项目结构

在这里插入图片描述

  • MyApplication 整个项目目录
  • MyApplication/build.gradle是整个项目的gradle构建脚本
  • MyApplication/gradle.properties是整个项目的gradle设置
  • MyApplication/MyApplication.iml是整个项目的配置文件
  • MyApplication/settings.gradle是定义整个项目包含哪些模块
  • app项目中app模块目录
  • app/build/是app模块build编译输出的目录
  • app/app.iml是app模块的配置文件
  • app/.gitignore是app模块的版本管理忽略文件
  • app/build.gradle是app模块的gradle构建脚本
  • app/proguard-rules.pro是app模块的混淆文件
  • External Libraries 项目依赖的Lib,编译时自动下载的

Android Studio 新建的项目自身就是一个模块化项目。因为MyApplication 是整个项目,而app是一个模块。可以在后续自行增加更多的功能模块。

在Android Studio进行模块化开发

1.创建 Module 模块
有两种方式。
方式一:针对已存在的模块,只需要将模块复制到项目的根目录(如上面的MyApplication目录)下即可。这种方式需要在根目录下的setting.gradle文件中设置一下,格式:

include ':projectName'

方式二:直接在project下新建一个Module。操作步骤:

File --> New --> New Module --> Android Library (建议选择这个) --> Finish

这种方式会自动在根目录下的setting.gradle文件中设置。

如:
在这里插入图片描述

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

dependencies {
...implementation project(path: ':modulea')
}

模块中 application 和 library 状态切换配置

组件化插件化是两个不同的概念。插件化作用在“运行时”,而组件化作用在“编译时”。插件化是基于多APK,而组件化本质上只有一个APK。
(1)用一个属性来控制gradle构建插件的切换。 如果我们创建的Module是要作为一个库library来给别的模块使用,那么就应该使用com.android.library这个gradle插件来构建。如果我们Module是一个应用,而不是插件,那么就要使用com.android.application这个gradle插件来构建。我们可以在gradle.properties文件(在根目录下)来配置一些属性,然后在各个Module的build.gradle的构建脚本里就可以根据这属性来判断要使用哪个插件,如:
gradle.properties

# false表示是集成化开发模式,true表示是组件化开发模式
isModule = false

isModule = false:表示这个模块是一个Module(插件);
isModule = true:表示这个模块是一个app(组件);

(2)在模块的build.gradle文件中使用isModule属性。

在modulea模块的build.gradle中使用isModule来判断要使用哪个构建脚本插件:

if(isModule.toBoolean()){apply plugin: 'com.android.application'
}else{apply plugin: 'com.android.library'
}
android {
...defaultConfig {...// library下删除applicationId// 如果是组件就要给一个applicationIdif(isModule.toBoolean()){applicationId "com.wong.modulea"}}
...
}

(3)提供两套 AndroidManifest.xml并进行动态切换


android {...sourceSets {main{// 应用if(isModule.toBoolean()){manifest.srcFile 'src/main/buildApp/AndroidManifest.xml'}else{// 插件manifest.srcFile 'src/main/buildModule/AndroidManifest.xml'}}}
}

(组件)src/main/buildApp/AndroidManifest.xml的内容可能如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.wong.modulea" ><application><activity android:name=".WarehouseActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.DEFAULT"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application></manifest>

(插件)src/main/buildModule/AndroidManifest.xml的内容可能如下:
buildModule 的 AndroidManifest.xml, activity 等在这里可以正常注册。这里注册后主程序就可以不用写了。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.wong.modulea"><application><activity android:name=".WarehouseActivity"></activity></application></manifest>

(4)在app模块的build.gradle配置如下:

dependencies {...if(!isModule.toBoolean()){implementation project(path: ':modulea')}
}

这样就完成了。

Android 模块化开发过程中可能遇到的问题

1.资源名冲突
默认情况, library 的所有的 resource 为 public , 在模块化开发过程中很容易遇到资源冲突问题。两种解决方法:
(1)保护某些 resources 不被外部访问,通过创建res/values/public.xml来完成,至少添加一行,就会被视为 private。

<resources><public name="mylib_app_name" type="string"/>
</resources>

(2)在 library 的 build.gradle 中添加 resourcePrefix , 则所有的资源须以此 prefix 开头,否则报错。注意,图片资源虽然不提示报错误,但是也需要修改名字。

android {...buildTypes {...}resourcePrefix 'my_prefix_'
}

2.依赖重复
解决方法:将所有的依赖都写在library层的module里,将所有的依赖统一一个入口给顶层的app用。

最后送上demo

谢谢阅读


http://chatgpt.dhexx.cn/article/Rmf0DNBZ.shtml

相关文章

什么是前端模块化?前端模块化开发到底有无必要

转自:http://www.jianshu.com/p/e422c28e2471 序&#xff1a; 所谓前端开发&#xff0c;就是前台&#xff0c;常见的包括几个端&#xff1a;PC、pad、手机、其他智能设备&#xff0c;可以跑浏览器的地方就是我们前端人大施拳脚的乐土。自从node的问世&#xff0c;现在不光可以在…

什么是模块化开发?

什么是模块化开发&#xff1f; 前端开发中&#xff0c;起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果&#xff0c;后来js得到重视&#xff0c;应用也广泛起来了&#xff0c;jQuery&#xff0c;Ajax&#xff0c;Node.js&#xff0c;MVC&#xff0c;MVVM等…

深入理解JavaScript模块化开发

前言&#xff1a; 随着JavaScript应用程序的复杂性不断增加&#xff0c;模块化开发成为了一种必备的技术。通过将代码划分为模块&#xff0c;我们可以提高代码的可维护性、可重用性和可扩展性。在本文中&#xff0c;我们将深入探讨JavaScript模块化开发的概念、优势和不同的模块…

细说前端模块化开发

一、模块化概述 模块化开发是当下最重要的前端开发范式之一。随着前端应用的日益复杂&#xff0c;我们的项目代码已经逐渐膨胀到了不得不花大量时间去管理的程度了。模块化就是一种最主流的代码组织方式&#xff0c;它通过把我们的复杂代码按照功能的不同&#xff0c;划分为不…

模块化开发简述

模块化开发简述 都说模块化开发为前端发展带来了巨大的进步&#xff0c;然而不熟悉的人看着也是两眼一懵&#xff0c;那其实这到底是什么&#xff1f;好处在哪&#xff1f;我来说说自己的见解吧。 1. 模块化和传统开发的区别 实话讲&#xff0c;其实在我看来&#xff0c;两…

什么是模块化?模块化怎么实现?

什么是模块化&#xff1f;模块化怎么实现&#xff1f; 前言 &#xff1a; 增加印象&#xff0c;留下脚印 &#xff0c;忘记还可以翻一翻 奥利给。 1&#xff0c;什么是模块化 公司里一个项目是有很多程序员一起开发的&#xff0c;例如 “多人运动” 这个项目 有程序员a &…

vue 模块化开发

1、npm install webpack -g 全局安装 webpack 2、npm install -g vue/cli-init 全局安装 vue 脚手架 3、初始化 vue 项目&#xff1b; vue init webpack appname&#xff1a;vue 脚手架使用 webpack 模板初始化一个 appname 项目 4、启动 vue 项目&#xff1b; 项目的 p…

Android模块化开发

模块化开发项目搭建 1.为什么要模块化开发 随着APP版本不断的迭代&#xff0c;新功能的不断增加&#xff0c;业务也会变的越来越复杂&#xff0c;APP业务模块的数量有可能还会继续增加&#xff0c;而且每个模块的代码也变的越来越多&#xff0c;这样发展下去单一工程下的APP架…

vue模块化开发

1.前端代码化雏形和CommonJS JavaScript原始功能 在网页开发的早期&#xff0c;js制作作为一种脚本语言&#xff0c;做一些简单的表单验证或者动画实现&#xff0c;代码量比较少&#xff0c;只要写在script标签里面就可以了 随着ajax异步请求的出现&#xff0c;慢慢形成了前…

模块化编程

1.一般编程方式&#xff1a;所有函数放在“.c”文件里。 &#xff08;缺点&#xff1a;若使用的模块功能比较多&#xff0c; 则一个文件内会有很多的代码&#xff0c; 不…

一次跟你说清楚,什么是组件化开发?什么是模块化开发?

网上有许多讲组件化开发、模块化开发的文章&#xff0c;但大家一般都是将这两个概念混为一谈的&#xff0c;并没有加以区分。而且实际上许多人对于组件、模块的区别也不甚明了&#xff0c;甚至于许多博客文章专门解说这几个概念都有些谬误。 想分清这两个概念我觉得结合一下软件…

前端模块化开发

前端模块化开发 什么是模块化&#xff1f; 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元 编程领域中的模块化&#xff0c;就是遵守固定的规则&#xff0c;把一个大文件拆成…

模块化开发

模块化开发 1. 模块化开发最终的目的是将程序划分成 一个个小的结构 。 2. 这个结构中编写属于 自己的逻辑代码 &#xff0c;有 自己的作用域 &#xff0c;定义变量名词时不会影响到其他的结构。 3. 这个结构可以将自己希望暴露的 变量、函数、对象等导出 给其结构使用&#xf…

HttpClient CloseableHttpClient GetMethod PostMethod http

pom依赖 <!--HttpClient的依赖--><dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version></dependency><!--CloseableHttpClient的依赖--><de…

JAVA小工具-05-HttpClient/PostMethod上传文件(解决中文文件名乱码问题)

言于头:本节讨论的是在项目中利用HttpClient/PostMethod相关api进行上传文件操作时&#xff0c;会出现上传中文文件名乱码问题。为解决这个问题&#xff0c;下面是总结的一个HTTP工具类以及测试用例。 public class HttpUtils {public static final String UTF_8 "UTF-8&…

解决PostMethod的中文乱码

解决HttpClient的PostMethod的中文乱码问题 问题场景&#xff1a; 解决代码&#xff1a; 请求时设定编码格式&#xff1a; post.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8"); 完整代码&#xff1a; /*** 封装请求参数&#xff0…

php 取整,PHP取整的方法有哪些

本篇文章主要给大家介绍PHP取整的四种方法。 PHP实现取整的问题&#xff0c;不仅在我们学习PHP过程中会遇到&#xff0c;在我们PHP面试过程中也是常见的考点之一。 下面我们结合简单的示例给大家总结介绍PHP取整的四种方法。 第一种方法&#xff1a;直接取整&#xff0c;舍弃小…

php 如何取整,解析php取整的几种方式

解析php取整的几种方式 floor 舍去法取整 语法格式:float floor ( float value )返回不大于value 的下一个整数&#xff0c;将value 的小数部分舍去取整。floor() 返回的类型仍然是float&#xff0c;因为float 值的范围通常比integer 要大。 echo floor(4.3); // 4 echo floo…

VUE 数据分页

只要涉及到数据查询&#xff0c;通常我们都会进行分页查询。 假设你的表中有上百万条记录&#xff0c;不分页的话&#xff0c;我们不可能一次性将所有数据全部都载入到前端吧&#xff0c;那前后端都早就崩溃了。 结合 Spring Spring 和 Vue 都提供了开箱即用的分页功能。 S…

前端Vue分页及后端PageHelper分页综合运用

分页显示数据对项目开发中尤为重要&#xff0c;同时能提升用户体验&#xff0c;下面的前端css、js是我引用这篇文章的《使用Vue开发一个分页插件》&#xff0c;我在这个的基础上结合了后端稍微完善了一下&#xff0c;修改了disable的样式&#xff0c;在里面加了pointer-events:…