将.class转换为.dex

时间:2017-11-21 12:54:18

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

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

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

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

通过将android.jar作为类路径传递

,编译成功
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 defns但实际的源代码不存在。

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

2)我们可以在dex转换步骤中传递源代码

3)当构建或引用足够时,apk是否包含源代码

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

1 个答案:

答案 0 :(得分:1)

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

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

另一个解决方案是告诉javac使用-source和-target标志编译早期版本的java。 e.g。

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

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