从命令行编译Android项目很慢

我正在编译我的(相当简单,只有5个文件与几百LOC)应用程序从OSX命令行使用:

ant debug

有用。 但是它运作缓慢:

BUILD SUCCESSFUL Total time:

26 seconds

这是为什么? 即使我只更改一个java文件中的一行,也需要这么多时间。 大部分时间都花在dex阶段(大约20秒),这是AFAIK创buildDalvik字节码。 但是我的朋友也使用Eclipse在Windows上的同一个项目上工作,他说编译在他的机器上只花了一两秒钟的时间。 有什么我可以做的,以加速这一进程?

Solutions Collecting From Web of "从命令行编译Android项目很慢"

我终于find了这个解决scheme! 这是一个黑客,但它的作品。

首先,进入你的ANDROID-SDK / platform-tools目录,然后将dx应用程序重命名为dextool类的dextool ,最后创build一个新的dx文件。

 #!/bin/sh shift dextool --dex --incremental --no-optimize $@ 

将“dextool”replace为您之前select的名称。 这将在每个dex调用前加上(未logging的) – 增量属性,这样可以大大减less构build时间,只需要在构build之间进行更改即可。 现在看起来像这样:

[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是一个巨大的差异!

编辑 – 几句话:

  • 在使用这个之前,你必须至less编译一次你的项目,因为它使用了以前的classes.dex文件
  • 使用其他Android工具链时,可能会遇到问题而不是ant

更新:

Google发布了SDK Tools 21.0,这个版本已经过时了,因为它支持预分离。 最后!

即使在21.1.1中,在原来的dex.bat中添加了--incremental --no-optimize也是很慢的,所以我继续计算出一些东西,结果是:如果您将.jar文件传递给dex,大小你得到更好的performance。

观看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
  • 将上面的perl脚本复制到ANDROID-SDK / build-tools / vvv / dx.pl
  • 在ANDROID-SDK / build-tools / vvv /
    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 $@`