我在OSX上从命令行编译我的(相当简单,只有5个文件和几百个LOC)应用程序,使用:
ant debug
它起作用了。但它的运行速度很慢:
BUILD SUCCESSFUL Total time:
26 seconds
为什么会这样呢?即使我在一个java文件中只更改一行,也要花费这么多时间。大部分时间花费在dex
阶段(大约20秒),这是AFAIK创建Dalvik字节码的阶段。但我的朋友也使用Eclipse在Windows上处理相同的项目,他说在他的机器上编译只需要一两秒钟。我能做些什么来加速这个过程吗?
发布于 2012-08-28 17:39:07
我终于找到了解决这个问题的办法!这是一个小技巧,但它是有效的。
首先,转到ANDROID-SDK/platform-tools目录,然后将dx
应用程序重命名为其他名称,如dextool
,最后创建包含内容的新dx
文件:
#!/bin/sh
shift
dextool --dex --incremental --no-optimize $@
将"dextool“替换为您之前选择的名称。这将为每个dex调用预先添加(未记录的)--属性,这将通过仅对在构建之间发生更改的类进行dexing来大量减少构建时间。现在它看起来像这样:
[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秒是一个巨大的差异!
编辑-少量备注:
以外的其他Android工具链时,您可能会遇到问题。
更新:
Google发布了SDK Tools 21.0,它将上面的调整渲染为absolete,因为它确实支持pre-dexing。终于来了!
发布于 2014-11-13 00:34:57
即使在21.1.1中,在原始的dex.bat中添加了--incremental --no-optimize
,它也很慢,所以我继续弄清楚了一些事情,结果是:如果你按大小对传递给dex的.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脚本复制到ANDROID-SDK/-
dx-orig
:将dx
重命名为Unix
dx-orig.bat
dx.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 $@`
https://stackoverflow.com/questions/12088375
复制相似问题