2016-02-17 68 views
0

我們如何統計庫文件中的代碼行數。JAR和AAR的代碼行數(LOC)

例如,JAR或AAR。

注 - CLOC是一個很棒的工具,但不幸的是,它不處理「.class」文件。

轉換JAR-> DEX和反編譯DEX->代碼是實現它的一種方法,但在轉換和反編譯期間可能會丟失精度。

+2

「我們如何計算庫文件中的代碼行數」 - 您不知道。這是一個毫無意義的概念。 「轉換JAR - > DEX和反編譯DEX - >代碼是實現它的一種方式,但在轉換和反編譯過程中可能會丟失精度」 - 然後迫使庫的開發人員用槍來交出源代碼代碼到圖書館。請注意,在某些司法轄區這可能是非法的。只有當你有源代碼時纔可能計算源代碼行。其他度量標準 - 類別計數,方法計數等 - 可以在已編譯的Java/DEX字節碼上執行。 – CommonsWare

回答

1

在某些情況下,您可能能夠使用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)); 
}