16

私はOSXのコマンドラインから以下を使用して(かなり単純で、数百のLOCを持つわずか5つのファイル)アプリをコンパイルしています。

ant debug

できます。しかし、それはゆっくりと動作します:

BUILD SUCCESSFUL Total time:

26 seconds

何故ですか?1つのJavaファイルの1行だけを変更しても、これだけの時間がかかります。この時間のほとんどはdexステージ(約20秒)で費やされます。これは、AFAIKがDalvikバイトコードを作成することです。しかし、Eclipseを使用してWindowsで同じプロジェクトに取り組んでいる私の友人は、自分のマシンでコンパイルするのに1、2秒しかかからないと言っています。このプロセスをスピードアップするために私にできることはありますか?

4

2 に答える 2

13

私はついにこれに対する解決策を見つけました!ちょっとしたハックですが、機能します。

まず、ANDROID-SDK / platform-toolsディレクトリに移動し、dxアプリの名前を、などの別の名前に変更してdextool、最後に次の内容の新しいdxファイルを作成します。

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

「dextool」を前に選択した名前に置き換えます。これにより、すべてのdex呼び出しに(文書化されていない)--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

20秒ではなく0.5秒は大きな違いです!

編集-いくつかのコメント:

  • 以前のclasses.dexファイルを使用しているため、これを使用する前にプロジェクトを少なくとも1回コンパイルする必要があります。
  • ant以外のAndroidツールチェーンを使用すると問題が発生する可能性があります

アップデート:

GoogleはSDKTools21.0をリリースしました。これは、pre-dexingをサポートしているため、上記の調整を廃止しました。ついに!

于 2012-08-28T09:39:06.680 に答える
0

元のdex.batに追加された21.1.1でも--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 /
    Unixでdxの名前を変更 :Windowsに名前を変更:に名前dxを変更dx-orig
    dx.batdx-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 $@`
于 2014-11-12T16:34:57.087 に答える