Proguard在更新到ADT 20后导出Android项目时出错



更新到ADT 20后,我无法再成功导出任何Android项目。我得到:

Proguard returned with error code 1. See console

在控制台中,我会收到大量的can't find referenced class警告,偶尔还会收到can't find superclass or interface警告。在警告的最后,我得到了这样的东西:

    You should check if you need to specify additional program jars.
Warning: there were 199 unresolved references to classes or interfaces.
    You may need to specify additional library jars (using '-libraryjars').
java.io.IOException: Please correct the above warnings first.
 at proguard.Initializer.execute(Initializer.java:321)
 at proguard.ProGuard.initialize(ProGuard.java:211)
 at proguard.ProGuard.execute(ProGuard.java:86)
 at proguard.ProGuard.main(ProGuard.java:492)

每次我尝试构建时,我都会收到不同数量的警告(不是很一致)。此外,当我在导出前执行清理时,导出会完成,不会产生任何警告,但生成的APK在启动时崩溃,通常是由于ClassNotFoundException

我的proguard-project.txt包括Android支持库和ActionBarSherlock所必需的-keep class规则。

在ADT 20之前,我构建这个项目没有遇到任何问题。我甚至尝试构建我的上一个版本(当我发布它时,它显然构建得很好),但我收到了同样的proguard警告和失败的导出。

正如许多其他SO问题所建议的那样,我尝试添加-libraryjars和/或-dontwarn规则,但没有成功。它有时会成功构建,但APK在发布时造成崩溃。

有什么建议吗?

AAPT中有一个错误,它只会处理

<fragment android:name"..." />

但不是

<fragment class="..." />

我们将修复AAPT,但在此期间,您可以使用其他属性,它会起作用。

在ADT 20中,我们使用了aapt的一个功能(请参见-G标志),它可以创建一个proguard文件,该文件包含代码使用的自定义视图的保留规则。

旧的proguard配置文件将保留所有视图。当您使用诸如兼容性库之类的库项目时,您可能只使用可用代码的一小部分,这可能最终包括许多您不需要的东西。通过删除通用的保留规则,并根据您的应用程序添加一个新的保留文件,您的.apk会变得更小,因为可以删除很多未使用的东西。

如果您更新到Tools 20(因此您有了新的较小的proguard-android.txt文件),并继续使用ADT 18,则可能会出现错误。请确保使用ADT20,因为它不仅会添加project.properties设置中指定的proguard文件,还会添加生成的proguar德文件,其中还列出了aapt-G中的keep文件。我相信ant构建也将使用-G功能。

(注意-请参阅http://code.google.com/p/android/issues/detail?id=35107对于任何后续行动)

据报道,ADT中Eclipse插件的最新更新存在问题,它没有正确地重新编译所有源代码。在这种情况下,ProGuard将打印出有关程序类(与库类相反)的警告。您应该检查导出(以及生成的应用程序)是否在没有ProGuard的情况下工作。您还应该检查Ant构建是否有效("Ant发布")。这可能是一个变通办法。

最新更新