Android模块化编译打包配置

2019-06-19  本文已影响0人  在寻找雪见的景天

最近,把我们的灵机项目拆分了一下,增加模块编译配置,然后,编译和打包速度快了挺多的,记录一下。

主要有两个操作:

一、组件化

之前很多组件都丢在了一个叫lib_plug的module里面,一个大集合,代码和资源文件啥的,都在里面。现在把组件都一个一个拆出来了,拆为 lib_xxxx 这样单独的一个module。module可以单独运行,也可当成是lib模块依赖。组件间通信,都依赖基础的base库,等等这些就不说了,因为组件化,很多大佬们都写了博客,大同小异,差不多。

二、组件上传到仓库

拆完组件,发现,其实有很多组件是万年不更新了的,这样,每次编译都会过一遍,肯定会影响一点速度。那我们同样用一个配置解决,需要修改组件时,用本地module,修改完了传maven,用aar依赖。那这样,速度会快一些。

主要就是上面两个操作,那剩下的就是配置了,怎样通过一个变量来控制组件是否单独运行,是否用maven版本?

1、先在项目的根目录,新建一个 version.gradle 的文件,里面配置组件的信息。类似下面:

class ModuleInfo {
    /**
     * 是否单独运行
     */
    boolean alone
    /**
     * 是否用maven版本
     */
    boolean maven
    /**
     * 版本
     */
    String version

    ModuleInfo() {
    }

    ModuleInfo(boolean alone, boolean maven, String version) {
        this.alone = alone
        this.maven = maven
        this.version = version
    }

    @Override
    String toString() {
        return "ModuleInfo{" +
                "alone=" + alone +
                ", maven=" + maven +
                ", version='" + version + '\'' +
                '}'
    }
}

ext {
    // 组名,防止上传maven的时候覆盖掉其他,可以用包名来代替
    moduleGroup = "com.lingjimiaosuan"

    // 配置每个组件的状态,是否单独运行,是否用maven版本,版本号
    modules = [
            "lib_aaa"          : new ModuleInfo(false, true, "1.0.0"),
            "lib_bbb"          : new ModuleInfo(false, true, "1.0.0"),
            "lib_ccc"          : new ModuleInfo(false, true, "1.0.0"),
            "lib_ddd"          : new ModuleInfo(false, true, "1.0.0"),
            "lib_eee"          : new ModuleInfo(false, true, "1.0.0"),
    ]

    // 统一,每个组件module都是这个版本
    android = [
            compileSdkVersion: 28,
            minSdkVersion    : 18,
            targetSdkVersion : 28,
    ]

}

2、修改 settings.gradle 的配置文件,读取 version.gradle 里面的配置,看是否要引入module。如下:

// 引入配置文件
apply from: 'version.gradle'
//必用模块,就不需要判断了
include ':app_cn'

if (!ext.modules.get("lib_aaa").maven) {
    include ':lib_aaa'
}

if (!ext.modules.get("lib_bbb").maven) {
    include ':lib_bbb'
}

if (!ext.modules.get("lib_ccc").maven) {
    include ':lib_ccc'
}

if (!ext.modules.get("lib_ddd").maven) {
    include ':lib_ddd'
}

3、新建上传maven配置,upload.gradle ,用来上传组件到maven。

//是否提交到仓库
def upload = true
def release = false
def name = project.name
def info = rootProject.ext.modules.get(name)
def vername = info.version
if (upload) {
    apply plugin: 'maven'
    print('upload library logn to maven...')
    group = rootProject.ext.moduleGroup
    version = release ? vername : vername + '-SNAPSHOT'

    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.sourceFiles
    }
    artifacts {
        archives androidSourcesJar
    }

    uploadArchives {
        repositories.mavenDeployer {
            repository(url: MAVEN_R_URL) {
                authentication(userName: MAVEN_D_USERNAME, password: MAVEN_D_PASSWORD)
            }
            snapshotRepository(url: MAVEN_S_URL) {
                authentication(userName: MAVEN_D_USERNAME, password: MAVEN_D_PASSWORD)
            }
            pom.artifactId = name
        }
    }
}

4、在组件里面引入 upload.gradle,在组件的build加上:

apply from: '../upload.gradle'

当我们对这个组件修改完毕时,就把这个组件上传到maven



5、在APP的build里面配置引用组件

    def lib_aaa = "lib_aaa"
    def aaaInfo = rootProject.ext.modules.get(lib_aaa)
    if (aaaInfo.maven) {
        api rootProject.ext.moduleGroup + ":" + lib_aaa + ":" + aaaInfo.version + "-SNAPSHOT"
    } else {
        api project(':lib_aaa')
    }

读取version.gradle的配置,来决定是用maven版本,还是用本地module。

大概这样就ok啦。比如我们要修改aaa模块,就去version.gradle里面修改参数为

 "lib_aaa"          : new ModuleInfo(false, false, "1.0.0")

然后,就可以对aaa模块,进行修改,修改完了,传完maven,再改回

 "lib_aaa"          : new ModuleInfo(false, true, "1.0.0")

这样重新编译后,就ok。速度应该是快一点的,可以试下。

上一篇 下一篇

猜你喜欢

热点阅读