Компиляция проекта Android из командной строки медленная
Я компилирую свое (довольно простое, всего 5 файлов с несколькими сотнями LOC) из командной строки в OSX, используя:
ant debug
Это работает. Но он работает медленно:
BUILD SUCCESSFUL
Total time:
26 seconds
Почему? Это занимает много времени, даже если я изменяю только одну строку в одном java файле. Большая часть этого времени проводится в стадии dex
(около 20 секунд), что является AFAIK, создающим байт-код Dalvik. Но мой друг, который также работает в одном проекте в Windows с использованием Eclipse, говорит, что компиляция занимает всего секунду или два на его машине. Можно ли что-то сделать, чтобы ускорить этот процесс?
Ответы
Ответ 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]`