计算 JAR 和 AAR 的代码行数 (LOC)

Count lines of code (LOC) for JAR and AAR

我们如何计算库文件中的代码行数。

例如,Jar 或 AAR。

注意 - CLOC 是一个很棒的工具,但不幸的是,它不处理“.class”文件。

转换 JAR -> DEX 并反编译 DEX -> 代码,是一种方法,但在转换和反编译过程中可能会丢失精度。

在某些情况下,您可以使用 dex 文件中的调试信息大致了解行数。

使用 dexlib2,你可以这样做:

public static void main(String[] args) throws IOException {
    DexFile dexFile = DexFileFactory.loadDexFile(args[0], 15);

    long lineCount = 0;

    for (ClassDef classDef: dexFile.getClasses()) {
        for (Method method: classDef.getMethods()) {
            MethodImplementation impl = method.getImplementation();
            if (impl != null) {
                for (DebugItem debugItem: impl.getDebugItems()) {
                    if (debugItem.getDebugItemType() == DebugItemType.LINE_NUMBER) {
                        lineCount++;
                    }
                }
            }
        }
    }

    System.out.println(String.format("%d lines", lineCount));
}

另一个比较代码大小的指标可能是 dex 文件中的指令数。例如

public static void main(String[] args) throws IOException {
    DexFile dexFile = DexFileFactory.loadDexFile(args[0], 15);

    long instructionCount = 0;

    for (ClassDef classDef: dexFile.getClasses()) {
        for (Method method: classDef.getMethods()) {
            MethodImplementation impl = method.getImplementation();
            if (impl != null) {
                for (Instruction instruction: impl.getInstructions()) {
                    instructionCount++;
                }
            }
        }
    }

    System.out.println(String.format("%d instructions", instructionCount));
}