В некоторых случаях вы можете получить приблизительное представление о количестве строк, используя отладочную информацию в файле 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 -> DEX и декомпиляция кода DEX -> - это один из способов сделать это, но точность может быть потеряна во время преобразования и декомпиляции» - затем заставляйте разработчиков библиотеки, под дулом пистолета, передать источник код в библиотеку. Обратите внимание, что это может быть незаконным в некоторых юрисдикциях. Подсчет строк исходного кода возможен только при наличии исходного кода. Другие метрики - количество классов, количество методов и т. Д. - могут выполняться на скомпилированном байт-коде Java/DEX. – CommonsWare