Android组件化1-Gradle组件化配置

news/2024/5/20 2:17:25 标签: android, 组件化, Gradle

代码Github:

文章目录

  • 1 配置config.gradle
  • 2 配置app的build.gradle
  • 3 配置module1的build.gradle
  • 4 配置module2的build.gradle
  • 5 配置isModule的值
    • 5.1 isModule = true
    • 5.2 isModule = false

配置流程简介

  1. 在项目根目录中新建config.gradle,并添加需要统一配置的属性值
  2. 在项目的build.gradle中引入配置好的config.gradle
  3. 在app的build.gradle中使用config.gradle中统一配置好的属性值。其中通过isModule可以控制项目是否需要依赖我们的module
  4. 在我们的Module中需要使用isModule来决定我们的Module是组件模式还是集成模式。当然在不同的模式下,我们还需要配置不同的SourceSet。

Gradle组件化配置
简介: gradle 是一个构建工具。负责管理项目依赖,组织项目结构,完成项目构建的工作。基于Groovy语言(Groovy是一种基于JVM的敏捷开发语言,可以简单的理解为强类型语言java的弱类型版本)。

  • build.gradle // 构建脚本文件,主要的构建配置都在这里写
  • gradle // 存放gradle wrapper 执行配置和工具的文件夹,
  • gradlew // gradle wrapper 执行脚本文件,用来在没有安装 gradle 的情况下执行 gradle 命令。当然,第一次执行时会下载 gradle。
  • gradlew.bat // gradle wrapper 执行脚本文件的 windows 版
  • settings.gradle // 项目配置,指明根项目名字和引入的 module

1 配置config.gradle

config.gradle配置工程下所有module配置

1 新建config.gradle (和Project的build.gradle同级).
在这里插入图片描述
2 在Project的build.gradle文件中引入config.gradle,如下:

//相当于引入头文件 将 config中的内容引入进来
apply from: "config.gradle"

3 config.gradle中添加内容,如下:

ext {  //extend
    // false: 组件模式
    // true :集成模式
    isModule = false
    android = [
            compileSdkVersion: 28,
            minSdkVersion    : 15,
            targetSdkVersion : 28,
            versionCode      : 1,
            versionName      : "1.0"
    ]

    appId = ["app"  : "com.hongx.host",
             "module1": "com.hongx.module1",
             "module2" : "com.hongx.module2" ]

    supportLibrary = "28.0.0"
    dependencies = [
            "appcompat-v7"     : "com.android.support:appcompat-v7:${supportLibrary}",
    ]
}

2 配置app的build.gradle

apply plugin: 'com.android.application'

//赋值与引用
def cfg = rootProject.ext.android
def appId = rootProject.ext.appId

android {
    compileSdkVersion cfg.compileSdkVersion
    defaultConfig {
        applicationId appId["app"]
        minSdkVersion cfg.minSdkVersion
        targetSdkVersion cfg.targetSdkVersion
        versionCode cfg.versionCode
        versionName cfg.versionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
   
   ...
}

dependencies {
    ...

	//false: 组件模式 ; true :集成模式
    if(isModule){//如果isModule为true,就将module1和module2依赖到app中
        implementation project(':module1')
        implementation project(':module2')
    }
}

3 配置module1的build.gradle

module1是一个android的library,其build.gradle配置如下:

apply plugin: 'com.android.library'

//赋值与引用
def cfg = rootProject.ext.android

android {
    compileSdkVersion cfg.compileSdkVersion

    defaultConfig {
        minSdkVersion cfg.minSdkVersion
        targetSdkVersion cfg.targetSdkVersion
        versionCode cfg.versionCode
        versionName cfg.versionName

       ...

    }

   ...

}

...

4 配置module2的build.gradle

module2是library还是application由isModule决定,如下:

//根据isModule标签动态的切换 集成/组件模式
if(isModule){
    apply plugin: 'com.android.library'
} else {
    apply plugin: 'com.android.application'
}

//赋值与引用
def cfg = rootProject.ext.android
def appId = rootProject.ext.appId

android {
    compileSdkVersion cfg.compileSdkVersion

    defaultConfig {
        minSdkVersion cfg.minSdkVersion
        targetSdkVersion cfg.targetSdkVersion
        versionCode cfg.versionCode
        versionName cfg.versionName

  		...

        //组件模式下
        if(!isModule){
            applicationId appId['module2']//com.hongx.module2
        }

         //资源配置
        sourceSets{
            main{
                //在组件模式下 使用不同的manifest文件
                if(!isModule){
                    manifest.srcFile 'src/main/module/AndroidManifest.xml'
                    java.srcDirs 'src/main/module/java','src/main/java'

                }else{
                    manifest.srcFile 'src/main/AndroidManifest.xml'
                }
            }
        }

    }

...

}

...

5 配置isModule的值

5.1 isModule = true

当config.gradle中的isModule = true时,此时module1和module2将作为依赖库导入到app中。

在app的MainActivity中设置两个按钮,一个跳转到module1中的某个Activity,一个跳转到module2中的某个Activity。

import com.hongx.module1.Module1Activity;
import com.hongx.module2.Module2Activity;

 public void module1Jump(View view) {
        Intent intent = new Intent(MainActivity.this, Module1Activity.class);
        startActivity(intent);
    }

    public void module2Jump(View view) {
        Intent intent = new Intent(MainActivity.this, Module2Activity.class);
        startActivity(intent);
    }

在module1中的AndroidManifest.xml中添加Module1Activity,如下:

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

在module2中的AndroidManifest.xml中添加Module2Activity,如下:

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

Make Project后,module1和module2前都有一个红叉,说明module1和module2都不能单独作为app运行。
在这里插入图片描述

运行app后,都能跳转到module1和module2的Activity中。

5.2 isModule = false

当config.gradle中的isModule = true时,此时app将不再依赖module1和module2。

如果再运行app会报错,如下:
在这里插入图片描述

当然我们可以将module2作为一个单独的app运行
在这里插入图片描述

添加红色框中代码,对应的就是在build.gradle中配置的,如下:
在这里插入图片描述

在AndroidManifest.xml中就是和正常的一样,如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hongx.module2">

    <application
        android:name=".Module2Application"
     	...
        <activity android:name=".Module2MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

此时,Make Project后
在这里插入图片描述
module2已经可以作为一个app单独运行了。

代码Github:


http://www.niftyadmin.cn/n/1838837.html

相关文章

华为IdeaHub的商业市场启示“路”

编辑 | 阿冒 设计 | 沐由在过去的很多年里&#xff0c;商业世界里中小企业的需求&#xff0c;多多少少有几分像是“薛定谔的猫”&#xff1a;虽然在各种新闻发布会上&#xff0c;针对SME&#xff08;Small and Medium Enterprise&#xff0c;即中小企业&#xff09;的产品方…

土人系列AS入门教程--语法篇

接下来我要讲的是AS的语法。 首先要让大家明白的是&#xff1a;AS 语法的大小写是敏感的。如&#xff1a; gotoAndPlay() 正确 gotoAndplay() 错误 。关键字的拼写必须和语法一致&#xff0c;要做到很容易&#xff0c;因为在Flash的AS面板里面&#xff0c;关键字会有不一样的颜…

索引机制

全值匹配我最爱&#xff0c;最左前缀要遵守&#xff1b; 带头大哥不能死&#xff0c;中间兄弟不能断&#xff1b; 索引列上少计算&#xff0c;范围之后全失效&#xff1b; like百分写最左&#xff0c;覆盖索引不写星&#xff1b; 不等空值还有or&#xff0c;索引失效要少用&…

同方有云,加速领跑信创新时代

编辑 | 阿冒 设计 | 沐由得益于数字经济的快速和健康发展&#xff0c;中国云计算产业正在迈入一个全新的阶段。曾经顽固地飘荡于这方天空之上的某种声音&#xff0c;也在被无情地涤荡开来。“赢者通吃&#xff01;”不消说&#xff0c;在相当长的一段时间里&#xff0c;领跑…

Windows系统文件用途

详细的介绍了WINDOWS系统文件的用途,我觉得比较好&#xff0c;就转来了&#xff0c;分享出来以后说不定会有用吧! A ↑ ACCESS.CHM - Windows帮助文件 ACCSTAT.EXE - 辅助状态指示器 ADVAPI32.DLL - 高级Win32应用程序接口 AHA154X.MPD - SCSI驱动程序 AM1500T.VXT - 网卡驱动…

C#如何识别引用的真实类型(一)——转载

知识储备,如果您已经十分熟习这些,可以跳过 1 什么是引用? 引用是一个数据结构,包含了一个计算机内存堆地址的值,就类似C中的指针一样,本文中所有出现有关"引用"字句,读者都可以把它理解成C,C中的指针 再说一遍,引用 与 指针 是不同的,例如 GC在回收内存的时候,会修…

026-请问你怎么测试网络协议

协议测试包括四种类型的测试1、一致性测试&#xff1a;检测协议实现本身与协议规范的符合程度 2、互操作性测试&#xff1a;基于某一协议检测不同协议实现间互操作互通信的能力 3、性能测试&#xff1a;检测协议实现的性能指标&#xff0c;比如数据传输速度&#xff0c;连接时间…

微软的操作系统已占据96.97%的市场份额(来自OneStat.com的权威调查)

Windows XP还是独领风骚&#xff0c;如火如荼的Linux还是只有可怜的0.36&#xff05;&#xff0c;Apple的MacOS有上升的趋势!OneStat.com通过对大量网站的用户点击和网络代理客户的抽样分析&#xff0c;得出了以下较为客观的数据。 The 10 most popular operating systems in t…