即使在--incremental --no-optimize
原始 dex.bat 中添加的 21.1.1 中它也很慢,所以我继续想办法,结果是:如果您按大小对传递给 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 在你的道路上
- 将上面的 perl 脚本复制到 ANDROID-SDK/build-tools/vvv/dx.pl
- 在 ANDROID-SDK/build-tools/vvv/ 中重命名 dx
Unix:重命名dx
为dx-orig
Windows:重命名dx.bat
为dx-orig.bat
- 添加一个新的替换 dx,它通过以下方式调用:
视窗:
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 $@`