首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从命令行编译Android项目速度很慢

从命令行编译Android项目速度很慢
EN

Stack Overflow用户
提问于 2012-08-23 17:11:56
回答 2查看 3.9K关注 0票数 16

我在OSX上从命令行编译我的(相当简单,只有5个文件和几百个LOC)应用程序,使用:

ant debug

它起作用了。但它的运行速度很慢:

BUILD SUCCESSFUL Total time:

26 seconds

为什么会这样呢?即使我在一个java文件中只更改一行,也要花费这么多时间。大部分时间花费在dex阶段(大约20秒),这是AFAIK创建Dalvik字节码的阶段。但我的朋友也使用Eclipse在Windows上处理相同的项目,他说在他的机器上编译只需要一两秒钟。我能做些什么来加速这个过程吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-28 17:39:07

我终于找到了解决这个问题的办法!这是一个小技巧,但它是有效的。

首先,转到ANDROID-SDK/platform-tools目录,然后将dx应用程序重命名为其他名称,如dextool,最后创建包含内容的新dx文件:

代码语言:javascript
复制
#!/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秒是一个巨大的差异!

编辑-少量备注:

  • 在使用它之前,您必须至少编译一次您的项目,因为它使用以前的classes.dex文件
  • 当使用ant

以外的其他Android工具链时,您可能会遇到问题。

更新:

Google发布了SDK Tools 21.0,它将上面的调整渲染为absolete,因为它确实支持pre-dexing。终于来了!

票数 13
EN

Stack Overflow用户

发布于 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。

代码语言:javascript
复制
#!/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/-

  • /v.v.v/中的ANDROID-SDK/build-tools/v.v.v/dx.pl
  • rename dx中。

dx-orig:将dx重命名为Unix

dx-orig.bat

  • add :将dx.bat重命名为通过

调用的新替换dx

Windows:dx.bat

代码语言:javascript
复制
@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

代码语言:javascript
复制
#!/bin/sh
dx-orig `perl dx.pl $@`
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12088375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档