![](/img/trans.png)
[英]com.android.dex.DexIndexOverflowException when compiling from command line
[英]Compiling Android project from command line is slow
我正在使用以下命令在OSX上從命令行編譯我的(相當簡單,只有5個文件和幾百個LOC)應用程序:
ant debug
有用。 但它運作緩慢:
BUILD SUCCESSFUL Total time:
26 seconds
這是為什么? 即使我只更改一個java文件中的一行,也需要很長時間。 大部分時間都花在dex
階段(大約20秒),這是AFAIK創建Dalvik字節碼。 但我的朋友也使用Eclipse在Windows上使用相同的項目,他說編譯只需要一兩秒鍾就可以在他的機器上運行。 有什么辦法可以加快這個過程嗎?
我終於找到了解決方案! 這有點像黑客,但它確實有效。
首先,轉到您的ANDROID-SDK / platform-tools目錄,然后將dx
app重命名為其他內容,例如dextool
,最后創建包含內容的新dx
文件:
#!/bin/sh
shift
dextool --dex --incremental --no-optimize $@
將“dextool”替換為您之前選擇的名稱。 這將為每個dex調用添加(未記錄的)--incremental屬性,這將通過僅對構建之間已更改的類進行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秒是一個巨大的差異!
編輯 - 幾點評論:
更新:
Google發布了SDK Tools 21.0,它使得上述調整過時,因為它確實支持pre-dexing。 最后!
即使在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;
dx
重命名為dx-orig
dx.bat
重命名為dx-orig.bat
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 $@`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.