Android dx工具

时间:2011-12-13 10:02:27

标签: android dx

有没有人知道dx的任何文档?

我特别感兴趣的是知道--core-library选项的作用。

有人可以对此有所了解吗?

3 个答案:

答案 0 :(得分:31)

什么是dx工具?

dx 工具将Java类文件转换为 .dex(Dalvik可执行文件)文件

它在哪里?

dx.jar原来位于 android-sdk / platforms / android-X / tools / lib / 之前(特别是在android-3和android-4中),并转移到 android-sdk / platform-tools / lib / 稍后。

它如何适合Android?

Java编译器将 Java源文件转换为 Java类文件

dx 工具将Java类文件转换为 .dex(Dalvik可执行文件)文件。应用程序的所有类文件都放在此.dex文件中。在此转换过程中,类文件中的冗余信息在.dex文件中进行了优化。

例如,如果在不同的类文件中找到相同的String,则.dex文件只包含该String的一个引用。

因此,这些.dex文件的大小远小于相应的类文件。

.dex文件和Android项目的资源(例如图像和XML文件)被打包到.apk(Android Package)文件中。

要更好地了解android构建过程

build process

供参考:

程序 aapt(Android资产包装工具)执行apk创建。 生成的.apk文件包含运行Android应用程序所需的所有数据,可以通过adb(android设备桥接器)工具部署到Android设备。

Reference

答案 1 :(得分:10)

这是一个特殊目的标志,仅在构建一些框架jar(core.jar,framework.jar等)时使用。通常,dx将拒绝处理任何java。*或javax。*类。所以这个选项用于core.jar,其中实际定义了所有这些类。

这是来自dx源代码的相关模糊(dalvik / dx / src / com / android / dx / command / dexer / Main.java),如果您尝试包含java。*或javax。*类,则会打印出来在一个应用程序中。

  

错误使用或错误使用核心类(java。*或javax。*)   什么时候不建立核心库。   这通常是由于无意中包含核心库文件   在您的应用程序的项目中,使用IDE(例如   日食)。如果你确定你不是故意定义一个   核心类,那么这就是最可能的解释   继续。

     

但是,您实际上可能正在尝试在核心中定义类   命名空间,例如,您可能采用的来源   来自非Android虚拟机项目。这将是最多的   肯定不行。它至少会危害它   您的应用与该平台的未来版本的兼容性。   它的合法性通常也是有问题的。

     

如果你真的打算建立一个核心库 - 这只是   适合作为创建完整虚拟机的一部分   分发,而不是编译应用程序 - 然后使用   “ - core-library \”选项可以禁止显示此错误消息。   如果你继续使用\“ - core-library \”,但事实上   构建应用程序,然后预先警告您的应用程序   在某些时候仍然无法建立或运行。请   为愤怒的顾客做好准备,例如找到你的   应用程序在升级其运行后停止运行   系统。你应该为这个问题负责。

     

如果您合法地使用了恰好位于的某些代码   核心包,那么你最简单的安全选择就是   重新包装那段代码。也就是说,将有问题的类移到   你自己的包命名空间。这意味着他们永远不会进入   与核心系统类冲突。 JarJar是一个可能有用的工具   你在这努力。如果你发现你不能这样做,那么   这表明你所处的道路最终将成为现实   导致痛苦,痛苦,悲伤和悲伤。

答案 2 :(得分:4)

Dx上的--core-library选项将绕过愚蠢检查,以防止您在Android应用程序中意外包含Java核心库。

如果您尝试在java。*或javax。*名称空间中包含包含包的库,则Dx会barf。我认为该名称空间中的类可能依赖于其他JDK“核心”类,这会破坏您的应用程序,因为它们(可能)不会出现在Android上。

现在,当然,仅仅因为java包以java。*或javax开头。*并不一定意味着它依赖于JDK本身。它可能在android中完美运行。建议,如果你知道你在做什么,如果你知道你的java / x。*类不依赖于JDK核心类,那就是使用像JarJar这样的工具在不同的名称空间下重新打包JAR。

据说,为了解决愚蠢问题,请将-core-library选项添加到dx。更改$ANDROID_HOME/platform-tools/dx的最后一行,

exec java $javaOpts -jar "$jarpath" "$@"

要,

exec java $javaOpts -jar "$jarpath" --core-library "$@"

在我的情况下,我包括一个依赖于杰克逊的图书馆,这依赖于JAXB。对我来说,重写愚蠢检查是可以接受的,因为该库使用Jackson仅用于JSON而不用于XML序列化(我只包括JAXB API库,而不是impl)。当然我希望有一个更清洁的方法来解决这个问题,但重写高级图书馆以避免使用杰克逊不是一个选择。