有没有关于'dx‘的文档?
特别是,我很想知道--core-library选项的作用。
发布于 2011-12-14 02:35:57
这是一个特殊用途的标志,仅在构建某些框架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 (如Eclipse)时,无意中在应用程序的项目中包含了一个核心库文件。如果你确定你不是故意定义一个核心类,那么这是最有可能的解释。但是,您可能实际上正在尝试在核心名称空间中定义一个类,例如,您可能从一个非Android虚拟机项目中获取了该名称空间的源代码。这肯定是行不通的。至少,它会危及应用程序与平台未来版本的兼容性。它的合法性也经常受到质疑。如果您真的想要构建一个核心库--这只适合作为创建一个完整的虚拟机发行版的一部分,而不是编译一个应用程序--那么使用"-- core - library“选项来消除这个错误消息。如果您继续使用"--core-library“,但实际上是在构建一个应用程序,那么要预先警告您的应用程序在某个时刻仍然无法构建或运行。请为愤怒的客户做好准备,例如,一旦他们升级了操作系统,您的应用程序就会停止运行。你将为这个问题承担责任。如果您合法地使用了一些恰好位于核心包中的代码,那么最简单、最安全的替代方法就是重新打包这些代码。也就是说,将有问题的类移动到您自己的包命名空间中。这意味着它们永远不会与核心系统类冲突。JarJar是一个可能在这方面对你有帮助的工具。如果你发现你不能做到这一点,那么这表明你所走的道路最终将导致痛苦、痛苦、悲伤和悲痛。
发布于 2014-05-29 23:24:57
什么是'dx‘工具?
dx工具将Java类文件转换为*.dex (Dalvik可执行文件)*文件。
它在哪里?
dx.jar文件原来位于android-sdk/platform/android-X/tools/lib/下(特别是在Android 3和Android 4中),后来被移到android-sdk/platform-tools/lib/下。
它是如何适应Android系统的呢?
Java编译器将Java源文件转换为Java类文件。
dx工具将Java类文件转换为*.dex (Dalvik可执行文件)*文件。应用程序的所有类文件都放在这个.dex文件中。在此转换过程中,类文件中的冗余信息将在.dex文件中进行优化。
例如,如果在不同的类文件中找到相同的字符串,则.dex文件仅包含此字符串的一个引用。
因此,这些.dex文件的大小比相应的类文件小得多。
将.dex文件和安卓项目的资源(例如图像和XML文件)打包到.apk (安卓包)文件中。
为了更好地理解,请查看Android构建过程:

仅供参考:
程序AAPT ()执行APK创建。生成的.apk文件包含运行Android应用程序所需的所有数据,并且可以通过ADB (Android device bridge)工具部署到Android设备上。
Reference
发布于 2012-06-19 04:54:39
Dx上的-- core -library选项将绕过愚蠢检查,以防止您在Android应用程序中意外包含Java核心库。
如果您尝试在java.*或javax.*名称空间中包含包含包的库,则Dx将失败。想法是,该命名空间中的类可能依赖于其他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 "$@"在我的例子中,我包含了一个依赖于Jackson的库,它依赖于JAXB。对我来说,覆盖愚蠢检查是可以接受的,因为该库对Jackson的使用仅用于JSON,而不用于XML序列化(我只包括JAXB API库,而不包括实现)。当然,我希望有一种更干净的方法来解决这个问题,但重写顶层库以避免使用Jackson不是一种选择。
https://stackoverflow.com/questions/8487268
复制相似问题