【Android】从零搭建组件化项目

这篇具有很好参考价值的文章主要介绍了【Android】从零搭建组件化项目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

组件化系列文章介绍的内容稍微多了点,本着研究透这玩意的精神,从组件化的简介开始说起。

简介

什么是组件化?

将多个功能模板拆分、重组的过程。

为什么要使用组件化?

1、加快编译速度,提高开发效率,增强可维护性、移植性。
2、高内聚(软件模块是由相关性很强的代码组成,只负责一项任务,即单一责任原则)、低耦合(模块间的依赖关系低)。
3、使每个业务模块变得相对独立,各个组件在组件模式下可以独立开发调试,集成模式下又可以集成到”app壳工程”中,从而得到一个具有完整功能的APP。

组件化架构构成:
【Android】从零搭建组件化项目,Android,android,组件化,kotlin,java

组件化、模块化与插件化

/ 概念 优点
组件化 解耦复杂系统时,将多个功能模板拆分、重组的过程。 1、提高组件复用性。
2、提高工程编译速度。
3、降低组件间的耦合。
4、能够独立运行在设备上。
5、利于多人团队协作开发。
模块化 将代码库组织为多个松散耦合的独立部分的做法。 1、提高代码复用性。
2、降低组件间的耦合。
3、利于多人团队协作开发。
插件化 插件化源于免安装运行apk的想法,免安装的apk可以理解为插件,支持插件的app成为宿主。 1、动态更新插件。
2、解决方法数超过65535的问题。
3、宿主和插件分开编译,提升开发效率。
4、减少安装Apk的体积、按需下载模块。

组件化和插件化的区别

  • 组件化:组件化开发就是将一个app分成多个模块,每一个模块都是一个组件,开发过程中让这些组件相互依赖或者单独调试。最终发布将这些组件合并统一成一个apk。
  • 插件化:插件化开发是将整个app拆分成多个模块,这些模块包含一个宿主和多个插件,每个模块都是一个apk,最终打包的时候宿主apk和插件apk分开打包。

开始

启动Android Studio创建一个Android项目,在项目里new Module,弹出的Create New Module中选择Android LibaryPhone & Tablet,配置完成Module name等参数后点击finish完成创建。

【Android】从零搭建组件化项目,Android,android,组件化,kotlin,java
在上图中,创建了commonorder组件,common组件推荐作为一个基础库,第三方的一些都在该库进行依赖,其它组件库使用第三方库直接引用common组件即可,一定程度上避免了组件库重复引用的问题。

创建好的Module文件目录下都有一个属于自己的build.gradle文件,Gradle文件执行顺序:settings.gradle > Project build.gradle > Module build.gradle

Module build.gradle中可以通过plugins修改当前Modelapplicationlibrary,如下:

plugins {
    id 'com.android.application'  // application,可以作为app独立运行
    id 'com.android.library'      // library,可作为aar包引入application包使用
}

com.android.applicationcom.android.library无法共存,同一个Model只能存在一个。不同的Model可以相互使用implementation引入到Model中,使得Model里的方法可以相互调用。

创建配置共享文件

在Android项目中,每个Module都有自己的.gradle文件,Gradle是一个使用Groovy语言(核心代码是 Java )编写的构建工具,具体使用教程可参考:来自Gradle开发团队的Gradle入门教程

使用组件化的项目一般会有多个 Module ,为了使不同 Module 的版本库配置使用相同的参数,需要在项目根目录创建一个app_config.gradle,用以共享组件间相同的配置,避免过度碎片化。

app_config.gradle:

ext {
    app_android = [
            compileSdk : 32,
            minSdk     : 21,
            targetSdk  : 32,
            versionCode: 1,
            versionName: "1.0"
    ]
}

app_config.gradle 要想使其它 Module 都可以引用,需要在 Projectbuild.gradle 中对其进行全局引用。

apply from: 'app_config.gradle'

这样一来,所有 Modulebuild.gradle 就可以使用 app_config.gradle 的共享参数了

android {
    compileSdk app_android.compileSdk

    defaultConfig {
        minSdk app_android.minSdk
        targetSdk app_android.targetSdk
        versionCode app_android.versionCode
        versionName app_android.versionName
    }
}

打包模式配置

组件化的优点中有一个加快编译速度、提升开发效率的功能。
上面说到:在 Modulebuild.gradle 可以通过修改 applicationlibrary 控制当前组件为打包或集成模式。为了方便后续修改打包模式,app_config.gradle 增加了一个 isRelease 的打包配置参数。

ext {
    // 控制打包的模式
    isRelease = true
}

通过控制 isRelease 的布尔值,即可实现自动配置对应的 build.gradle 值,当然,前提是自动配置的代码提前写好。

// 公用的插件
plugins {
    id 'org.jetbrains.kotlin.android'
}
// 根据打包模式使用的插件
if (isRelease){
    apply plugin : 'com.android.library'
} else {
    apply plugin : 'com.android.application'
}

当模块处于打包模式时,为避免安装一次出现两个应用图标的问题,整个App工程的所有 AndroidManifest.xml 只能出现一个带android.intent.action.MAINintent-filter

针对这种情况需要额外对不同打包模式下的 AndroidManifest.xml 文件做处理。

为此,我们可以在除主工程以外,需要在 debug 期间作为 application 工程独立运行项目的 build.gradle 文件添加以下配置。

android {
	// 源集 —— 用来设置Java目录或者资源目录
	sourceSets {
	    main {
	        if (!isRelease) {
	            // 如果是组件化模式,需要单独运行时使用该文件
	            manifest.srcFile 'src/main/debug/AndroidManifest.xml'
	        } else {
	            // 集成化模式,整个项目打包时使用该文件
	            manifest.srcFile 'src/main/AndroidManifest.xml'
	            java {
	                // release 时 debug 目录下的Java文件不需要合并到主工程
	                exclude '**/debug/**'
	            }
	        }
	    }
	}
}

接着在main文件夹添加debug文件,将用到的 AndroidManifest.xml 文件放入里面,并将 src/main/AndroidManifest.xml 文件的配置设置为集成模式,可参考如下代码:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <activity
            android:name=".MainActivity"
            android:exported="true" >
        </activity>
    </application>
</manifest>

APT与JavaPoet

组件化的进一步使用需要用到APTAPT全称为Annotation Processing Tool,即注解处理器。有很多的框架都是基于APT实现,例如:ButterKnifeDaggerEvenBusARouter等。

关于 APTJavaPoet 的相关知识已整理好相关文章 👉 【Android】APT与JavaPoet学习与实战

前往本文项目👉 【Android】从零搭建组件化项目

参考文档
1、Android 组件化实战(视频)文章来源地址https://www.toymoban.com/news/detail-554719.html

到了这里,关于【Android】从零搭建组件化项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android GreenDao 使用全面讲解,Android组件化入门

    5. 在多个线程中使用QueryBuilder 如果在多个线程中使用查询,则必须调用 forCurrentThread ()以获取当前线程的Query实例。Query的对象实例绑定到构建查询的拥有线程。 这使您可以安全地在Query对象上设置参数,而其他线程不会干扰。如果其他线程尝试在查询上设置参数或执行绑

    2024年04月27日
    浏览(42)
  • Android AGP8.1.0组件化初探

    前面两篇完成了从AGP4.2到 AGP8.1.0的升级,本文是由于有哥们留言说在AGP8.0中使用ARouter组件化有问题,于是趁休息时间尝试了一下,写了几个demo,发现都没有问题,跳转和传值都是正常的,这里我也是直接从groovy转换成version-catalogs的依赖方式,由于之前升级过,所以这次很顺

    2024年02月10日
    浏览(32)
  • Android彻底组件化—UI跳转升级改造

    (2)host对应的是share。在组件化框架中,每个组件对应一个唯一的host,例如分享组件的host就是share,读书组件的host是reader等等。 host是路由分发的第一级,根据host可以定位到每个组件。 host还可以对所有的路由URL进行一个分组,只有调用到该分组的路由的时候,组内的路由

    2024年04月16日
    浏览(26)
  • Android学习之路(23)组件化框架ARouter的使用

    支持直接解析标准URL进行跳转,并自动注入参数到目标页面中 支持多模块工程使用 支持添加多个拦截器,自定义拦截顺序 支持依赖注入,可单独作为依赖注入框架使用 支持InstantRun 支持MultiDex (Google方案) 映射关系按组分类、多级管理,按需初始化 支持用户指定全局降级与局

    2024年01月22日
    浏览(70)
  • Android学习之路(22) 从模块化到组件化

    Android 应用项目 , 都存在一个应用模块 ( Application Module ) , 在 build.gradle 构建脚本中 , 第一个插件配置 com.android.application , 表明 该 Module 编译打包后的输出是 APK 安装包 ; 该项目可以直接运行 ; 如果在 build.gradle 配置的是 com.android.library 插件 , 那么 编译 Module 打包后输出的是 a

    2024年01月22日
    浏览(38)
  • 现代化 Android 开发:组件化与模块化的抉择

    作者:古哥E下 项目初始的时候,一般都是使用一个分层架构,接入各种框架,然后就写业务代码。但如果项目慢慢变大,那就会出现很多项目管理的问题,诸如: 1.代码复用与抽象问题 2.编译速度问题 3.版本迭代速度问题 所以组件化、模块化、动态化、插件化、跨平台等各

    2024年02月11日
    浏览(47)
  • Android组件化方案及组件消息总线modular-event实战,渣本Android开发小伙如何一步步成为架构师

    美团外卖团队开发的一款Android路由框架,基于组件化的设计思路。主要提供路由、ServiceLoader两大功能。之前美团技术博客也发表过一篇WMRouter的介绍:《WMRouter:美团外卖Android开源路由框架》。WMRouter提供了实现组件化的两大基础设施框架:路由和组件间接口调用。支持和文

    2024年04月22日
    浏览(37)
  • Android技术栈(二)组件化改造,目前最稳定和高效的UI适配方案

    .build(PR.navi.navi) .navigation(); 而 Activity 则不需要,它会立即显示 ARouter.getInstance() .build(PR.navi.navi) //还可以设置参数,ARouter会帮你存在Bundle中 .withString(“pathId”,UUID.randomUUID().toString()) //Activity 或 Context .navigation(this); navi 模块是典型的业务逻辑模块,这里你可导入一些只有这个模块才

    2024年03月24日
    浏览(37)
  • 一篇读懂 Android 开发中模块化、组件化、插件化和热修复

    网上关于 “Android 开发\\\" 的文章很多,我本人学习 Android 开发的过程也借鉴了网上先辈们的文章;但大多数文章都从底层的细枝末节开始讲述,由下而上给人一种这门技术“博大精深”望而生畏的感觉;而我写这篇文章的初衷就是由上而下,希望别人在阅读的过程中能够觉得

    2023年04月08日
    浏览(30)
  • iOS 搭建组件化私有库

    步骤1是在没有索引库的情况下或者是新增索引的时候才需要用到(创建基础组件库) 首先在码云上建立一个私有库索引,起名为 SYComponentSpec 添加私有库索引 当你需要新建组件的时候,就在这里开始,如果是想修改原有的库,就可以直接在之前的组件仓库里面修改即可 1.在

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包