有没有人知道dx的任何文档?
我特别感兴趣的是知道--core-library
选项的作用。
有人可以对此有所了解吗?
答案 0 :(得分:31)
dx 工具将Java类文件转换为 .dex(Dalvik可执行文件)文件
dx.jar原来位于 android-sdk / platforms / android-X / tools / lib / 之前(特别是在android-3和android-4中),并转移到 android-sdk / platform-tools / lib / 稍后。
Java编译器将 Java源文件转换为 Java类文件。
dx 工具将Java类文件转换为 .dex(Dalvik可执行文件)文件。应用程序的所有类文件都放在此.dex文件中。在此转换过程中,类文件中的冗余信息在.dex文件中进行了优化。
例如,如果在不同的类文件中找到相同的String,则.dex文件只包含该String的一个引用。
因此,这些.dex文件的大小远小于相应的类文件。
.dex文件和Android项目的资源(例如图像和XML文件)被打包到.apk(Android Package)文件中。
要更好地了解android构建过程
程序 aapt(Android资产包装工具)执行apk创建。 生成的.apk文件包含运行Android应用程序所需的所有数据,可以通过adb(android设备桥接器)工具部署到Android设备。
答案 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)。当然我希望有一个更清洁的方法来解决这个问题,但重写高级图书馆以避免使用杰克逊不是一个选择。