簡體   English   中英

從命令行編譯Android項目很慢

[英]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秒是一個巨大的差異!

編輯 - 幾點評論:

  • 你必須在使用它之前至少編譯一次你的項目,因為它使用以前的classes.dex文件
  • 使用除ant之外的其他Android工具鏈時,您可能會遇到問題

更新:

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;

用法

  • 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:
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 $@` 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM