IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Gradle的神奇之处 ---- 组件化优化 -> 正文阅读

[移动开发]Android Gradle的神奇之处 ---- 组件化优化

1 组件化优化

首先先创建一个组件化的工程,包括业务层、基础层
在这里插入图片描述
其实在创建组件的时候,没有必须要说直接创建一个Library,可以直接创建application,然后通过gradle做build配置即可
在这里插入图片描述
在创建base组件库的时候,可以直接创建一个Library
在这里插入图片描述
在这里插入图片描述
在setting.gradle中可以看到这些组件已经注册进来了

include ':app'
include ':business:main'
include ':core:common'
include ':base:baseLib'

1.1 library和application

app壳工程依赖business/main模块,因为business/main是一个application是一个可以单独运行的模块,只有library才可以被依赖,因此当组件化打包的时候,business/main是作为一个library进来的

plugins {
    //id 'com.android.application'
    id 'com.android.library'
    id 'kotlin-android'
}

android {
    compileSdk 31

    defaultConfig {
    	//不能有appId的存在
        //applicationId "com.study.main"
        minSdk 21
        targetSdk 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

每个业务模块之前其实是解耦的,如果在测试的时候,只需要测试某个模块,那么可以单独打成一个apk提供给测试,跑整体流程的时候,又可以作为library打进app壳,下面就介绍一下简单的方式来配置组件化

step1:创建config.gradle

ext {
    //模块单独运行 设置为true
    //打包运行 设置为false
    isModuleDebug = true
}

step2:business/main依赖这个脚本插件

# business/main/build.gradle
//config.gradle不是跟 business/main/build.gradle在同级目录下,需要声明路径
apply from:"${rootProject.rootDir}/config.gradle"

if(isModuleDebug){
    apply plugin:'com.android.application'
}else{
    apply plugin:'com.android.library'
}
apply plugin:'kotlin-android'

如果是打包的模式,那么就是以library的形式存在,如果是测试模式,那么就可以单独打包application

与library和application对应的就是applicationId

defaultConfig {
   if(isModuleDebug){
       applicationId "com.study.main"
   }
   ......

step3:清单文件的配置

sourceSets {
   main{
       if(isModuleDebug){
           manifest.srcFile 'src/main/debug/AndroidManifest.xml'
       }else {
           manifest.srcFile 'AndroidManifest.xml'
       }
   }
}

在测试环境下,可能有一些测试专用的activity,可以放置在debug下的清单文件中,正式环境下的就是用src/main文件夹下的清单文件

step4:调试模式场景下,不用将组件依赖到app壳

if(!isModuleDebug){
    implementation project(':business:main')
}

1.2 组件化配置优化

前面讲到的,是针对单独的一个模块进行组件化配置,如果你的项目中有20个或者30个模块,岂不是要自己手动配置20多次,这种方式显然是不可取的,对理解组件化是一个不错的方式,但是真正的实际场景中,下面的方式才是主流

ext {
    //模块单独运行 设置为true
    //打包运行 设置为false
    isModuleDebug = false
    //所有项目的默认风味配置
    defaultConfigMap = [
            "compileSdk"               : 31,
            "applicationId"            : "com.study.gradleapp",
            "minSdk"                   : 21,
            "targetSdk"                : 31,
            "versionCode"              : 1,
            "versionName"              : "1.0",
            "testInstrumentationRunner": "androidx.test.runner.AndroidJUnitRunner"
    ]
    //一些三方依赖库
    libs = [
            "coreKtx": 'androidx.core:core-ktx:1.7.0',
            "appCompat": 'androidx.appcompat:appcompat:1.4.1',
            "meterial": 'com.google.android.material:material:1.5.0',
            "constraintlayout": 'androidx.constraintlayout:constraintlayout:2.1.3'
    ]
    //aar依赖
    aars = [
            "MyLibs":"libs/MyLibs-release.aar"
    ]
    //组件化项目依赖
    modules = [
            "main":":business:main"
    ]

    //每个project基本就是使用这两个插件
    setProjectDefaultConfig = { project ->
        //这里需要判断一下,app不能是一个library
        if (isModuleDebug || project.name == 'app') {
            project.apply plugin: 'com.android.application'
        } else {
            project.apply plugin: 'com.android.library'
        }
        project.apply plugin: 'kotlin-android'
        //设置project中的Android节点
        setProjectAndroidConfiguration project.android
        setProjectDependencies project.dependencies
    }

    //Android节点的配置
    setProjectAndroidConfiguration = { android ->
        android.compileSdk = defaultConfigMap.compileSdk

        android.defaultConfig {
            if (project.isModuleDebug) {
                applicationId = defaultConfigMap.applicationId
            }

            minSdk = defaultConfigMap.minSdk
            targetSdk = defaultConfigMap.targetSdk
            versionCode = defaultConfigMap.versionCode
            versionName = defaultConfigMap.versionName
            testInstrumentationRunner = defaultConfigMap.testInstrumentationRunner
        }
        //
        android.buildTypes {
            release {
                minifyEnabled false
                //这里需要使用android的代理
                proguardFiles android.getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
        android.compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
        android.kotlinOptions {
            jvmTarget = '1.8'
        }

        //对于sourceSet的处理
        if(isModuleDebug){
            android.sourceSets
        }
    }
    //设置项目的依赖配置
    setProjectDependencies = { dependencies->
        //设置了代理,就会使用dependencies中的implementation
        delegate = dependencies
        project.libs.each{ key,value->
            implementation value
        }
        //针对不同的模块,做不同的依赖配置
        if(project.name == 'app'){
            project.aars.each{ key,value->
                implementation files(value)
            }
            if(!project.isModuleDebug){
                project.modules.each{ key,value->
                    implementation project(value)
                }
            }
        }
        testImplementation 'junit:junit:4.+'
        androidTestImplementation 'androidx.test.ext:junit:1.1.3'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    }


}
//执行setProjectDefaultConfig闭包配置
project.setProjectDefaultConfig project  

创建一个闭包setProjectDefaultConfig,就像在某个模块下的build.gradle一样,会调用apply来导入插件,使用android节点配置产品风味、dependencies依赖配置等等,都是对project的一个扩展

当完成这样的组件化配置之后,在每个节点的build.gradle中,只需要一行代码即可

apply from:"${rootProject.rootDir}/config.gradle"

看到上面肯定很多人会想,我配置的依赖,很多模块不需要,但是也依赖进去了,其实不需要考虑这些,因为依赖配置本来在打包之前,就已经完成了依赖去重

在组件化配置中,dependencies做的更多的是公共属性的配置,如果在这里做每个组件的详细配置就会使得代码变得很臃肿,其实在单独的gradle中,可以做自己特殊的依赖

# business/main/build.gradle

apply from:"${rootProject.rootDir}/config.gradle"
//做自己特殊的配置
android{
//产品风味等
}
dependencies {
    implementation project(':base:baseLib')
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:44:56  更:2022-03-22 20:45:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:53:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码