• Android Studio Gradle提高工作效率小技巧


    【前言】

      Android项目很多时候需要编译成aar或者jar的形式提供给其他项目引入,特别是做Android Sdk开发的;若是Android项目只有一个变体还好,若是有多个变体,就需要编译成多个aar或者jar,这样子的话,麻烦的问题就来了,每次修改代码,编译成aar/jar之后,你都需要经过多次修改aar/jar文件名,然后复制到其他地方使用,这种重复的工作很累也很容易出错

    一、问题现状

      由于不同版本、不同公司主体的SDK,在配置、资源、代码实现等方面都有些许差异,要是额外开一个新项目去开发就会出现代码大量冗余的问题,而且后期维护也会很麻烦,修改一个地方,多个项目都得一起改,幸好Android Studio提供productFlavors这个功能,在build.gradle中声明对应的变体,然后在对应变体目录下实现差异化的代码即可

     	publishNonDefault true
        flavorDimensions "company", "slideVerify", "version"
        productFlavors {
            ay {
                dimension "company"
            }
    
            sswl {
                dimension "company"
            }
            ft {
                dimension "company"
            }
            yy {
                dimension "company"
            }
            zhwl {
                dimension "company"
            }
            lcwl {
                dimension "company"
            }
            fcxx {
                dimension "company"
            }
            shwl {
                dimension "company"
            }
            nc {
                dimension "company"
            }
    
            cg {
                dimension "company"
            }
            cs { 
                dimension "company"
            }
    
            re {
                dimension "company"
            }
    
            xb {
                dimension "version"
            }
    
            jb {
                dimension "version"
            }
    
            yyz {
                dimension "slideVerify"
            }
    
            myz {
                dimension "slideVerify"
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    上面是设置3个维度(版本、公司主体、滑动验证)共16个差异化代码项,按照自由组合规则,编译之后一共会生成:12 x 2 x 2 = 48个aar/jar
    在这里插入图片描述
    生成的aar/jar之后,需要修改文件名,起码得加上版本号标识,然后复制到需要用到的地方,这样重复的动作需要做48次,光是想想都劝退大部分人,显然手动去完成这部分工作实在是不现实,那么下面看看怎么在Android Studio的build.gradle中实现脚本自动化处理这部分工作

    二、解决方案

    因为分包打包主要是用到jar,下面主要是以修改jar文件名与复制jar示例(aar同理),先来看看生成jar之后的目录结构
    在这里插入图片描述
    1、修改jar文件名,并复制到指定目录备份保存,因为build目录下的文件下次编译就会被清除了

    //指定只关注的维度
    def slideVerifyJarOptions = ['myz', 'yyz']
    def companyJarOptions = ['ay', 'fcxx', 'ft', 'lcwl', 'nc', 'sswl', 'yy', 'zhwl', 'shwl']
    task makeSdkLibJar() {
        //设置依赖build任务,即先编译项目之后再运行下面的代码
        dependsOn build
        //指定执行任务时候才运行下面代码,否则会在初始化编译器运行
        doLast {
            //遍历
            for (String s : slideVerifyJarOptions) {
                //指定复制任务
                copy {
                    //遍历
                    for (String c in companyJarOptions) {
                        //指定从哪个目录拷贝
                        from('build/intermediates/aar_main_jar/' + c + s.capitalize() + 'JbRelease/') {
                            //重命名
                            rename('classes.jar', "sswlsdk-" + c + "-" + s + "-" + sdkLibVersion + "-" + modifyDate + ".jar")
                        }
                    }
                    //复制到指定目录
                    into('jarlibs/' + s)
                    //指定只复制哪些文件
                    include('classes.jar')
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    1)dependsOn build:指定makeSdkLibJar任务依赖于build 任务,即你在运行makeSdkLibJar任务时,build任务会先开始运行,build任务运行结束之后makeSdkLibJar任务才开始运行
    2)doLast {}:指定makeSdkLibJar任务在执行阶段才运行(doFirst{}效果亦是如此),假如任务执行代码不声明在doLast {}/doFirst{}闭包内,那么每次编译build.gradle都会执行,这样就不是我们所想要的效果了
    3)copy {}:指定复制任务,在copy闭包内,才有fromrenameintoinclude这些方法
    4)from():指定从哪个目录进行拷贝,其中s.capitalize()是将字符串首字母转为大写
    5)rename():复制过去之后,将指定文件classes.jar重命名为新的文件名

    2、清除打包资源目录下的旧版本jar,然后将备份目录的新版本jar复制到打包资源目录下

    //删除旧版本的jar
    task cleanOldJarFiles() {
        //指定先执行makeSdkLibJar任务再执行下面代码
        dependsOn makeSdkLibJar
        //指定执行阶段才运行
        doLast{
            println("删除文件")
            def path = "E:\\svn-project\\sdk\\company"
            FileTree tree = fileTree(path)
            //遍历文件树的元素
            tree.visit {
                element ->
                    //删除jar目录下的文件
                    if (element.relativePath.contains("/jar/")) {
                        println "删除 $element.relativePath"
                        //删除指定文件
                        delete element.file
                    }
            }
        }
    
    }
    
    
    //拷贝新版本的jar
    task copyNewJarFiles(type: Copy) {
        //指定先执行cleanOldJarFiles任务再执行下面代码
        dependsOn cleanOldJarFiles
        //指定执行阶段才运行
        doLast{
            for (String s : slideVerifyJarOptions) {
                def srcPath = 'E:/AS-workspace/jarlibs/' + s
                def destPath = 'E:/svn-project/sdk/company/' + s
                for (String c in companyJarOptions) {
                    def fileName = "sswlsdk-" + c + "-" + s + "-" + sdkLibVersion + "-" + modifyDate + ".jar"
                    File srcFile = new File(srcPath + "/" + fileName)
                    File destFile = new File(destPath + "/" + c + "/jar/" + fileName)
                    if (!destFile.exists()) {
                        println "复制: " + destFile.getPath().substring(119).replace("\\", "/")
                        destFile.createNewFile()
                    }
                    //读取源文件srcFile数据,然后输出到目标文件destFile中,也就是复制操作
                    srcFile.withDataInputStream {
                        input ->
                            destFile.withDataOutputStream {
                                output -> output << input
                            }
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    3、完成上述代码编写之后,之前繁琐的操作,现在直接点击一下执行任务就慢慢等待执行完成即可
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    2021 年的 Flutter 状态管理:如何选择?
    网易云课堂-课程分析
    Spring Boot整合Spring Data Jpa + QueryDSL
    安卓App生成签名证书,uniapp生成自有证书打包
    APT级全面免杀拿Shell
    xss跨站脚本攻击
    制作一个简单HTML大学生抗疫感动专题网页(HTML+CSS)
    数据结构-堆
    001. 组合
    Selenium 获取请求响应
  • 原文地址:https://blog.csdn.net/qq_43278826/article/details/125421454