java - .class 到 .dex 的转换

标签 java android android-studio android-gradle-plugin dex

我有 1 个使用 Android Keystore API 的 java 程序。 我们需要运行这个程序来验证基于 android 的板上的一些符号操作。

通过 android studio 运行这个程序工作正常,即创建一个示例应用程序并安装该 apk。 但是我们需要通过命令行运行这个程序,因为实际的程序不会是 apk 格式。

当尝试将此程序转换为 dex 格式时,它抛出错误。

将android.jar作为classpath传递,编译成功

javac -cp /<path>/Android/Sdk/platforms/android-23/android.jar  ApiClientAndroidKeyStore.java

但是 dex 转换失败并出现以下错误:

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Exception parsing classes
    at com.android.dx.command.dexer.Main.processClass(Main.java:752)
    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:718)
    at com.android.dx.command.dexer.Main.access$1200(Main.java:85)
    at com.android.dx.command.dexer.Main$FileBytesConsumer.processFileBytes(Main.java:1645)
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
    at com.android.dx.command.dexer.Main.processOne(Main.java:672)
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:574)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:311)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)
Caused by: com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
    at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
    at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
    at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
    at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
    at com.android.dx.command.dexer.Main.parseClass(Main.java:764)
    at com.android.dx.command.dexer.Main.access$1500(Main.java:85)
    at com.android.dx.command.dexer.Main$ClassParserTask.call(Main.java:1684)
at com.android.dx.command.dexer.Main.processClass(Main.java:749)

在进一步的调试中观察到 android.jar 只包含 API 定义,但实际的源代码不存在。

1) 是否有任何包含源代码的 android.jar 可用(大小可能是个问题)

2)我们能否在dex转换步骤传递源码

3) apk 是否也包含源代码,而构建或引用就足够了

4) 我们可以在命令行中使用 android studio 在构建 apk 时使用的相同命令吗

最佳答案

问题是错误的类文件 magic (cafebabe) 或版本 (0034.0000)。版本 0x34(十进制 52)是一个 java 8 类文件,旧版本的 dx 无法处理。

有两种方法可以解决这个问题。首先是运行 android sdk 管理器并获取最新版本的构建工具。这应该包含更新版本的 dx 工具,它可以处理 java 8 类文件。

另一种解决方案是使用 -source 和 -target 标志告诉 javac 为较早版本的 java 编译。例如

javac -source 1.7 -target 1.7 -cp /<path>/Android/Sdk/platforms/android-23/android.jar  ApiClientAndroidKeyStore.java

关于仅包含 stub 的 android.jar 文件 - 这是正常的,无需担心。 javac 只需要 stub 进行编译。这些类由 Android 框架提供,不包含在您的应用程序中。所以 javac 实际上并不需要具有这些类的完整实现的类文件 - 它只需要知道类/方法/字段签名,以便它可以正确地链接到它们。

关于java - .class 到 .dex 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47413641/

相关文章:

java - 在java中连接到oracledb

java - 线程等待另一个线程

android - 如何根据位置更改 Listview 按钮的背景图像?

java - 从 android.com 运行 hellogridview 时出现问题

java - 整个程序中的独特任务

java - 当我在手机上运行该应用程序时,我的元素全乱了

java - 为什么我的主要函数在声明时没有在我的 Activity 文件中被选取?

java - 如何添加缺少的 Android list 文件

android - Android Studio Gradle在Android L上设置了目标API

android - 即使正确安装了 KVM 并启用了 BIOS 支持,AVD 仍拒绝启动