项目的搭建及Gradle配置 (一)

前言

想了一下暂时好像也没什么要逼逼的,那就直接拿起键盘来一梭子吧。

1.创建工程

首先在AS上创建一个项目并命名为Component,我们把AS默认生成的app module作为主(host)模块,然后再创建两个module分别命名为order、personal,好了此时已经有了三个独立的模块,那么如何将这三个模块关联起来是我们下一步要做的事情了。

2.build.gradle配置

三个moudle都能独自运行,模块化开发初衷是要做到模块之间既可以单独运行又可以集成在一起,那么现在三个可单独运行得模块是如何集成到一起的?目前来看AS是不允许将它们直接关联的,所以接下来要修改两个依赖模块的build.gradle中的apply plugin属性:

//apply plugin: 'com.android.application'  //表示Android module能单独运行  
//上边为创建事默认配置,将其改为如下
apply plugin: 'com.android.library' //表示Android library不能单独运行

这个时候我们创建得三个模块就可以通过Procejt Structure(Ctrl+alt+shift+s)来关联起来了,


image.png

至于如何依赖Android Library这里就不做细说了。
通过上边修改配置增加两个(order&personal)模块的依赖,目前主模块App已经可以调用home和personal中的界面了,现在这和要实现的目标还差很远,由于要同时管理多个模块的build.gradle文件,所以这里我们要引入一个公共的配置config.gradle。

3.config.gradle创建与配置

我们在工程的根目录下右键创建File并命名为config.gradle,在文件添加ext{}属性,这ext中就可以加入我们需要配置的公共项了,

ext{
    //组件化|集成化开关
    isDebug = false
    // 包名,用于存放APT生成的类文件
    packageNameForAPT = "per.xxx.modular.apt"
    //项目中的服务器地址
    url = [
            debug:'http://127.0.0.1/',
            release:'http://release/',
    ]
    android = [
            "compileSdkVersion": 29 ,
            "buildToolsVersion": "29.0.2"
    ]
    defaultConfig = [
            "minSdkVersion": 21 ,
            "targetSdkVersion": 29,
            "versionCode": 1,
            "versionName": "1.0",
            "testInstrumentationRunner":"androidx.test.runner.AndroidJUnitRunner"
    ]
    applicationId = [
            "app":"per.xxx.modular_app",
            "order":"per.xxx.modular_order",
            "personal":"per.xxx.modular_personal"
    ]
    //模块中的依赖库
    dependencies = [
            "appcompat":"androidx.appcompat:appcompat:1.1.0",
            "constraintlayout":"androidx.constraintlayout:constraintlayout:1.1.3",
            "recyclerview":"androidx.recyclerview:recyclerview:1.2.0-alpha01"
    ]
}

然后引入该配置文件,在工程的build.gradle中最外层添加
apply from: "config.gradle"
那么这个时候我们三个模块就可以通过该配置文件统一管理了。

4.如何使用config.gradle中配置项

在各个模块的build.gradle中可以通过rootProject.ext来获取config.gradle配置的属性,这里将rootProject.ext 赋值到一个变量def rootSet = rootProject.ext,然后在android和dependencies标签中我们就可以替换掉原来的配置项了,如下

//order模块的配置
def rootSet = rootProject.ext
if(rootSet.isDebug){//这里可以通过布尔值来切换是否可以单独运行
    apply plugin: 'com.android.application'
}else {
    apply plugin: 'com.android.library'
}
android {
    compileSdkVersion rootSet.android.compileSdkVersion
    buildToolsVersion rootSet.android.buildToolsVersion

    defaultConfig {
        if(rootSet.isDebug){
            applicationId rootSet.applicationId.personal
        }
        minSdkVersion rootSet.defaultConfig.minSdkVersion
        targetSdkVersion rootSet.defaultConfig.targetSdkVersion
        versionCode rootSet.defaultConfig.versionCode
        versionName rootSet.defaultConfig.versionName
        testInstrumentationRunner rootSet.defaultConfig.testInstrumentationRunner
        //传入APT参数
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [moduleName: project.getName(), packageNameForAPT: packageNameForAPT]
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main{
            if(rootSet.isDebug){
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            }else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
//                exclude{
//                    java{
//                        '**/debug/**'
//                    }
//                }
            }
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
//此处通过遍历Map方式来循环引入依赖,减少代码
//也可以通过implementation  rootSet.dependencies.appcompat 单独引入
    rootSet.dependencies.each{k,v -> implementation v }
    api project(':common')//此为公共组建
//测试相关库
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

可以看到我们通过rootSet.android.键来引入需要配置的值,这样做好处是只用修改config.gradle中的内容即可,便于统一管理,其中有两处用到了isDebug属性,这里大家应该能猜到其用处就是来区分是否能单独调试该模块的,需要注意的是App模块中是不需要加这两处判断的,因为App自始至终都是可以单独运行的,但是需要在dependencies 中加入如下判断:

    if (!rootSet.isDebug) {
         implementation project(':order')
         implementation project(':personal')
    }

否则,切换为单独调试模式时,我们的app会提示模块之间不能相互依赖的错误。

至此项目的grdle配置已经差不多了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • Gradle配置最佳实践 本文会不定期更新,推荐watch下项目。如果喜欢请star,如果觉得有纰漏请提交issu...
    Solang阅读 1,629评论 0 4
  • 原文地址 作为Android开发你必须明白的Gradle基础 作为一个Android开发程序员,如果你的build...
    Android_冯星阅读 673评论 0 1
  • 上一章我们学习了Gralde的使用,创建和转换Android工程。本章我们将深入了解构建文件,学习一些有用的tas...
    sollian阅读 1,368评论 0 3
  • gradle 编程框架的组成:groovy核心语法 ,build script block,gradle api....
    高斯巴阅读 626评论 0 0
  • 学焦点用焦点,说出来的都是自己的 ,父母的改变从这里开始,每天问问自己,关注正向了吗?看到难得了吗?重新建构了吗?...
    王琦_7de4阅读 220评论 0 1