Подтвердить что ты не робот

Компиляция проекта Android из командной строки медленная

Я компилирую свое (довольно простое, всего 5 файлов с несколькими сотнями LOC) из командной строки в OSX, используя:

ant debug

Это работает. Но он работает медленно:

BUILD SUCCESSFUL Total time:

26 seconds

Почему? Это занимает много времени, даже если я изменяю только одну строку в одном java файле. Большая часть этого времени проводится в стадии dex (около 20 секунд), что является AFAIK, создающим байт-код Dalvik. Но мой друг, который также работает в одном проекте в Windows с использованием Eclipse, говорит, что компиляция занимает всего секунду или два на его машине. Можно ли что-то сделать, чтобы ускорить этот процесс?

4b9b3361

Ответ 1

Наконец-то я нашел решение для этого! Это немного взломать, но он работает.

Сначала перейдите в каталог ANDROID-SDK/платформы, а затем переименуйте dx приложение на что-то еще, например dextool, и, наконец, создайте новый файл dx с содержимым:

#!/bin/sh
shift
dextool --dex --incremental --no-optimize [email protected]

Замените "dextool" на имя, которое вы выбрали ранее. Это добавит (недокументированный) --incremental атрибут для каждого обращения к dex, который будет массово уменьшать время сборки, используя только классы, которые изменились между сборками. Теперь это выглядит так:

[dx] Merged dex A (1 defs/11,3KiB) with dex B (359 defs/1253,2KiB). Result is 359 defs/1519,3KiB. Took 0,5s

0.5s вместо 20s - огромная разница!

Изменить - несколько замечаний:

  • вам нужно скомпилировать свой проект хотя бы один раз, прежде чем использовать его, потому что он использует предыдущий файл classes.dex
  • вы можете столкнуться с проблемами при использовании других инструментов для Android, чем ant

ОБНОВЛЕНИЕ:

Google выпустил SDK Tools 21.0, который отображает выше настройки, поскольку он поддерживает предварительное удаление. Наконец-то!

Ответ 2

Даже в 21.1.1 с --incremental --no-optimize, добавленным в исходный файл dex.bat, он медленный, поэтому я продолжал вычислять что-то, результат: если вы заказываете файлы .jar, переданные в dex по размеру, вы получить лучшую производительность.

Наблюдайте https://code.google.com/p/android/issues/detail?id=79166 для обновлений, я надеюсь, что они согласятся, и это переходит в vNext.

#!/usr/bin/perl
use strict;
use warnings;
#use Data::Dump qw(dump);
use List::Util qw(first), qw(sum);

# size of the argument, -s for files, -s on **/*.class for folders
sub size {
        if (-d $_) {
                # directory size is sum of all class files in the dir recursively
                # account for pre-dexing and compression with a 25% decrease
                return sum(map { size($_) * 0.25 } <$_/*.class>) || 0;
        }
        return -s $_; # use built-in size operator
}

my $dx_args_with_args =
   qr/^--(output|positions|(no-)?optimize-list|dump-(to|width|method)|num-threads|main-dex-list|input-list)$/;
my $nArgs = $#ARGV;
# last argument like --blah, those are for dx
my $lastArg = $nArgs - first { $ARGV[$nArgs - $_] =~ /^--/ } 0..$nArgs;
if ($lastArg != -1 && $ARGV[$lastArg] =~ /$dx_args_with_args/) {
        $lastArg += 1;
}

my @inputs = map { $_->[1] }
             sort { $a->[0] <=> $b->[0] }
             map { [size(), $_] }
             @ARGV[$lastArg + 1 .. $nArgs];

print join(" ", @ARGV[0..$lastArg], @inputs);

exit 0;

Использование

  • Перл на вашем пути
  • скопируйте вышеуказанный perl script в ANDROID-SDK/build-tools/v.v.v/dx.pl
  • переименовать dx в ANDROID-SDK/build-tools/v.v.v/
    Unix: переименовать dx в dx-orig
    Windows: переименовать dx.bat в dx-orig.bat
  • добавьте новую замену dx, которая вызывает через:
Windows: dx.bat
@echo off
setlocal
set args=%*
for /f "delims=" %%i in ('perl "%~dp0dx.pl" %args%') do set args=%%i
call "%~dp0dx-orig.bat" %args%
endlocal
Unix: dx
#!/bin/sh
dx-orig `perl dx.pl [email protected]`