在命令行编译Android项目很慢(Compiling Android project from c

2019-06-27 07:04发布

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

ant debug

有用。 但工程进展缓慢:

BUILD SUCCESSFUL Total time:

26 seconds

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

Answer 1:

我终于找到了一个解决方案! 这是一个黑客攻击的一位,但它的作品。

首先,进入到你的Android-SDK /平台的工具目录,然后重命名为dx应用到别的东西,像dextool ,终于创造新的dx文件,其内容:

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

替换“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.5秒,而不是20多岁是一个巨大的差别!

编辑 - 谈几点看法:

  • 您必须使用此之前至少一次编译你的项目,因为它使用以前的classes.dex文件
  • 您可以使用其他Android工具链比蚂蚁时遇到问题

更新:

谷歌发布SDK工具21.0,这使得上述的调整absolete,因为它支持预德兴。 最后!



Answer 2:

即使在21.1.1与--incremental --no-optimize原添加dex.bat它是缓慢的,所以我继续想办法的,其结果是:如果你为了顺利通过,以敏捷的.jar文件大小你获得更好的性能。

关注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 /编译工具/ VVV / dx.pl
  • 在重命名DX And​​roid的SDK /编译工具/ VVV /
    Unix的:重命名dxdx-orig
    窗户:重命名dx.batdx-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 $@`


文章来源: Compiling Android project from command line is slow