美文网首页我爱编程
Gradle的一次实践-删除日志功能

Gradle的一次实践-删除日志功能

作者: 选一个昵称这么难 | 来源:发表于2018-05-29 17:11 被阅读177次

    需求:在打正式包的时候删除代码中和日志相关的代码,比如项目在开发阶段经常会加如下类似的代码:

     private fun init() {
              ......
            AppLogger.v(TAG, "initPlayer()")
              ......
        }
    

    我们希望在发布正式包的时候,删除

     AppLogger.v(TAG, "initPlayer()")
    

    这行代码

    完成思路:

    (1)删除代码的功能肯定是写在一个task里面,因此要知道gradle 自定义task
    (2)task写好后,关键的异步要确定这个task在什么时候执行
    一:如何定义这个task
    task dellog << {
    
        def rootPath = rootProject.projectDir.absolutePath;
    
        def files = new File(rootPath);
    
        println files.getAbsolutePath()
    
        deleteLog(files)
    }
    
    
    void deleteLog(File listFiles) {
        if (listFiles != null) {
            listFiles.eachFile {File file ->
                if (file != null) {
                    if (file.isFile()) {
                        if (file.canRead() && !file.name.endsWith("AppLogger.java")&&(file.name.endsWith(".java")||file.name.endsWith(".kt"))) {
                            println file.getAbsolutePath()
    
                            deleteFileLog(file);
                        }
                    } else if (file.isDirectory()) {
                        deleteLog(file);
                    }
                }
            }
        }
    }
    void deleteFileLog(File javafile) {
        def path =javafile.getAbsolutePath()
        if (javafile==null){
            return
        }
        if (!(javafile.exists())){
            return
        }
        if (!(javafile.length()>0)){
            return
        }
        if (path.contains("/build/")){
            return
        }
    
        def endFlag = 0;
        File ftmp = file(javafile.getAbsolutePath() + ".tmp");
        def printWriter = ftmp.newPrintWriter("utf-8");
        def reader = javafile.newReader("utf-8");
        def tmpline = null;
        String line;
        while ((line = reader.readLine()) != null) {
            if (line != null) {
                tmpline = line.trim();
                if (tmpline.startsWith("AppLogger.") || endFlag == 1) {
    
                    if (tmpline.endsWith(")")||tmpline.endsWith(");")) {
                        endFlag = 0;
                        printWriter.write(";\n")
                        continue
                    } else {
                        endFlag = 1;
                        continue
                    }
                } else {
                    printWriter.write(line + "\n");
                }
            }
        }
    
        reader.close();
    
        printWriter.flush();
        printWriter.close();
    
        javafile.delete();
        ftmp.renameTo(javafile.getAbsolutePath());
    }
    

    需要注意一下几点:
    ① 项目是java和kotlin混合开发的,因此要考虑.java和.kt文件
    ② 因为是要删除整个项目中的和该日志相关的代码,因此

    def rootPath = rootProject.projectDir.absolutePath;
    

    这里一定是rootProject,因为这个task是定义在项目下的app所属的build.gradle,因此如果如果这里写的是project,则只能删除app下的相关日志代码。

    二: 何时执行这个task

    这个需要了解task的执行顺序,依赖等知识点
    我们先看一下我们在打一个正式包的时候会执行哪些task,点击assembleRelease,在控制台能看到执行这个task会以此先执行哪些task
    最终我们会看到一些列task
    比如:

    ...
    :app:preBuild UP-TO-DATE
    :app:extractProguardFiles
    :app:preReleaseBuild
    :app:compileReleaseAidl
    ...
    

    我们在这些个task里面找一个合适的,哎,preReleaseBuild这个看着就行,试试
    我们在app的build.gradle加入如下代码

    project.afterEvaluate {
        preReleaseBuild.dependsOn dellog
    
    }
    

    这个意思就是说当project的所有task建立好有向图之后(有向图就是task的执行顺序),让preReleaseBuild这个task依赖我们自定义的删除日志的dellog,也就是说当执行到preReleaseBuild会让dellog先执行。因此,上面这个需求就完成了。

    相关文章

      网友评论

        本文标题:Gradle的一次实践-删除日志功能

        本文链接:https://www.haomeiwen.com/subject/yiyajftx.html