美文网首页
利用Java代码统计Android项目代码量

利用Java代码统计Android项目代码量

作者: 晖仔Milo | 来源:发表于2024-03-04 17:29 被阅读0次

今天需求方突然来了兴致,要我们统计应用的代码量。
好家伙,靠人数肯定是数不过来,没办法,不如就写一段java代码代劳吧。

import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List;

/**
 * Title:代码行数统计工具
 * Describe:
 * Remark:
 * <p>
 * Created by Milo
 * E-Mail : 303767416@qq.com
 * 2024/3/4
 */
public class CodeLinesReadHelper {

    public static class ReadObject {
        public String projectName;
        public String projectDir;

        public ReadObject(String projectName, String projectDir) {
            this.projectName = projectName;
            this.projectDir = projectDir;
        }
    }

    public void startRead(List<ReadObject> readObjects) {
        FileFilter fileFilter = new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getAbsolutePath().contains(".java") || pathname.getAbsolutePath().contains(".kt");
            }
        };

        FileFilter uiFilter = new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getAbsolutePath().contains("VH")
                        || pathname.getAbsolutePath().contains("ViewHolder")
                        || pathname.getAbsolutePath().contains("Activity")
                        || pathname.getAbsolutePath().contains("Fragment")
                        || pathname.getAbsolutePath().contains("Dialog");
            }
        };

        int totalLineCount = 0;
        int totalUiLineCount = 0;
        for (ReadObject readObject : readObjects) {
            int projectLineCount = 0;
            int uiLineCount = 0;

            List<File> allDirList = getAllDirs(readObject.projectDir);
            allDirList.add(0, new File(readObject.projectDir));
            for (File dirFile : allDirList) {
                File[] allFiles = dirFile.listFiles(fileFilter);
                if (allFiles != null) {
                    for (File file : allFiles) {
                        projectLineCount += getFileLineNum(file.getAbsolutePath());
                    }
                }

                File[] uiFiles = dirFile.listFiles(uiFilter);
                if (uiFiles != null) {
                    for (File file : uiFiles) {
                        uiLineCount += getFileLineNum(file.getAbsolutePath());
                    }
                }
            }

            System.out.println(String.format("%s 共计行数%s", readObject.projectName, projectLineCount));
            totalLineCount += projectLineCount;
            totalUiLineCount += uiLineCount;
        }

        System.out.println("所有ui总行数/项目总行数:" + totalUiLineCount + "/" + totalLineCount + ",ui占比大致为:" + formatDouble(1.0 * totalUiLineCount / totalLineCount));
    }

    private String formatDouble(double num) {
        DecimalFormat format = new DecimalFormat("#0.00");
        return format.format(num);
    }

    private List<File> getAllDirs(String rootDir) {
        List<File> list = new LinkedList<>();
        File rootFile = new File(rootDir);

        File[] fileList = rootFile.listFiles();
        if (fileList != null) {
            for (File f : fileList) {
                if (f.isDirectory()) {
                    list.add(f);
                    list.addAll(getAllDirs(f.getAbsolutePath()));
                }
            }
        }
        return list;
    }

    private int getFileLineNum(String filePath) {
        try (LineNumberReader lineNumberReader = new LineNumberReader(new FileReader(filePath))) {
            lineNumberReader.skip(Long.MAX_VALUE);
            int lineNumber = lineNumberReader.getLineNumber();
            return lineNumber + 1;//实际上是读取换行符数量 , 所以需要+1
        } catch (IOException e) {
            return 0;
        }
    }

}

入口处调用

        CodeLinesReadHelper linesReadHelper = new CodeLinesReadHelper();
        List<CodeLinesReadHelper.ReadObject> readObjects = new ArrayList<>();
        readObjects.add(new CodeLinesReadHelper.ReadObject("工程1", "xxxDir/app/src/main/java"));
        readObjects.add(new CodeLinesReadHelper.ReadObject("工程2", "xxxDir/app/src/main/java"));
        //fz-libs

        linesReadHelper.startRead(readObjects);

大功告成

相关文章

  • 使用git 统计代码量

    利用awk语言,代码统计,包含了使用框架自带的代码量 xxx代码量统计 项目总代码量统计 每个人的统计

  • 程序员代码量统计

    代码量的多少不能证明程序员的能力! 该程序以Java语言编写以统计Java语言写的项目代码量为例:

  • 统计项目代码量

    有遇到过这样的情况,项目经理在写文档时会要求开发人员提供项目的代码量。下面就说一下代码量的统计问题。 1、统计总的...

  • GIT统计代码量

    GIT统计代码量 Git统计个人提交代码行数 Git统计项目总行数 查看git上个人代码量(需要修改usernam...

  • git 代码量统计

    git代码量统计 代码量按人员统计 代码量按人员和时间统计 markdown语法入门

  • [code]统计项目代码量

    功能统计一个文件夹中所有指定后缀名文件中的数据行数 应用场景统计项目代码行数 代码 用例

  • iOS项目代码量统计

    1、打开终端工具,用cd切换到工程所在目录下,然后执行下面代码 其中 -name "*.m" 就表示扩展名为.m的...

  • [iOS] 统计项目代码量

    这是一个有意思的功能,闲得无聊看看自己敲过多少代码 嘿嘿~ 如果要统计ios开发代码,包括头文件的,终端命令进入项...

  • 统计代码量

    按作者统计代码量: git log --author=myname --format='%aN' | sort -...

  • 几个有用的shell命令

    (1)统计代码量平时统计代码量可能只是用 wc -l 粗略的统计一下,但是不方便判断真实代码量有多少。 用 clo...

网友评论

      本文标题:利用Java代码统计Android项目代码量

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