计算 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));
}
我们如何计算库文件中的代码行数。
例如,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));
}