Ant Build AAPT Crunch正在从Library资源图像中剥离draw9信息

时间:2013-12-06 12:03:15

标签: android ant android-drawable aapt

我有一个使用库项目的项目。图书馆计划有draw9(9.png)文件,当通过Ant构建apk时,它正在剥离可缩放和可填充区域的draw9信息。结果是应用程序只是在不使用draw9信息的情况下拉伸图像。 在Android的build.xml

 <target name="-package-resources" depends="-crunch">

这是调用crunch,它会更新预处理的PNG缓存(任何人都知道这个缓存的位置?)。

-crunch在aapt中运行一个叫做crunch的任务。但我无法找到有关这些论点的任何信息。它似乎从Res文件夹中取出文件并将其放在out res文件夹中(默认为bin / res)。

所以我甚至清除了任务,因此它不会运行紧缩,仍然没有正确拉伸图像。然后我用png文件直接复制到out res文件夹替换它,仍然是同样的问题。我甚至在这些任务之间尝试了干净,我遇到了同样的问题。这让我相信缓存是在项目区域之外,但在哪里?

注意当我使用Eclipse构建它时一切都很好。

另一个适用于我的解决方案是将这些图像从库中复制到主项目中,但它不是理想的解决方案。

其他人似乎对此crunch/resource packaging with aapt in ant build uses cache from other projects

有疑问

在此bug report they mention about the cache中仅使用时间戳来检查是否更新缓存。

这似乎是source code for aapt,但我无法通过阅读来查找此缓存的位置。

找出问题

对我来说导致问题的原因是我在Ant中使用不同的文件夹(故意)为我的res,src和bin。有一个引用 project.library.res.folder.path ,它会被依赖宏填充。它指向项目的默认res和bin文件夹。所以我做的是将它们更改为指向我的新文件夹。但在这样做的过程中,我改变了他们被列出的旧版本。它开始将资源文件混合到我正在运行aapt时使用的不同库项目中。当我修改订单时,它编译得很好。我也是为project.library.bin.r.file.path。

做的

2 个答案:

答案 0 :(得分:1)

我昨天遇到了完全相同的问题。

我有一个代码库,用于使用ant构建不同版本的应用程序(diff package-name和一些特定资源)。

build.xml工作正常,但是9个程序在使用app时被破坏(如你所说,被视为png和拉伸)。

我将问题解决到了ant中的-crunch任务(正如你所做的那样)。

在我的情况下,我使用两个不同的res文件夹,因此我从此

更改了原始的紧缩任务
<!-- Updates the pre-processed PNG cache -->
    <target name="-crunch">
        <exec executable="${aapt}" taskName="crunch">
            <arg value="crunch" />
            <arg value="-v" />
        <arg value="-S" />
            <arg path="${resource.absolute.dir}" />
            <arg value="-C" />
            <arg path="${out.res.absolute.dir}" />
        </exec>
    </target>

到这个

 <target name="-crunch">
        <exec executable="${aapt}" taskName="crunch">
            <arg value="crunch" />
            <arg value="-v" />
            <arg value="-S" />
            <arg path="${resource.flavour.dir}" />
            <arg value="-S" />
            <arg path="${resource.absolute.dir}" />
            <arg value="-C" />
            <arg path="${out.res.absolute.dir}" />
        </exec>
    </target>

但这产生了9patch人工制品(也在像fb这样的库中)..所以我想我会改变它来处理resourceflavour.dir只有当这不是一个给出正确结果的库(没有9pathc人工制品)

<target name="-crunch">
    <do-only-if-not-library elseText="Library project: do not package resources..." >
        <exec executable="${aapt}" taskName="crunch">
            <arg value="crunch" />
            <arg value="-v" />
            <arg value="-S" />
            <arg path="${resource.flavour.dir}" />
            <arg value="-C" />
            <arg path="${out.res.absolute.dir}" />
        </exec>
    </do-only-if-not-library>
        <exec executable="${aapt}" taskName="crunch">
            <arg value="crunch" />
            <arg value="-v" />
            <arg value="-S" />
            <arg path="${resource.absolute.dir}" />
            <arg value="-C" />
            <arg path="${out.res.absolute.dir}" />
        </exec>
</target>

这可能会为您提供适当解决方案的线索。

答案 1 :(得分:0)

我认为你必须要紧缩图书馆项目的资源。

尝试

aapt crunch -v -S res -C bin/res

在您图书馆的项目文件夹中,然后重建。这对我有帮助。现在的问题是如何实现自动化。