2016-02-17 5 views
0

Как подсчитать количество строк кода в файле библиотеки.Подсчитайте строки кода (LOC) для JAR и AAR

Например, 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)); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^