.dex 或 .apk 的 Java 字节码不起作用......该怎么办?

Posted

技术标签:

【中文标题】.dex 或 .apk 的 Java 字节码不起作用......该怎么办?【英文标题】:Java-Bytecode to .dex or .apk dont work... What's to do? 【发布时间】:2017-11-29 03:39:00 【问题描述】:

我正在测试在 Eclipse (IDE) 中编写 Java 程序。 我的目标是,它可以在 Windows、Linux 和 android 上运行。

将其导出为 .class 或 .jar 没问题! 我设法使用 Android-Studio-Tool “dx” 将它转换为 .jar 也转换为 .dex 和 .apk(天哪,这是一个可怕的过程)

当我尝试在我的 android 手机 (v6.0.1) 上运行它们时,只有 .apk 是可执行的......当我运行 .apk 时,我得到了:

“Parsingfehler - Beim Parsen des Pakets ist ein Fehler aufgetreten” (Parsingerror - 在解析数据包时发生错误)

我做错了什么?我发布了我的代码,可能有错误:

/** v0.01 vom 22.06.2017 @author Rudolf Geist */
package allgemeines;

import javax.swing.JOptionPane;

public class Systemausleser 


    public static void main(String[] args)
    
        // Ich will eine Main, die überall läuft
        System.out.println("Infos auslesen \n");

        System.out.println("Zeichen zwischen Ordnern (Betriebssystem-Abhängig!) : " + System.getProperty("file.separator") );
        System.out.println("OS-Name: " + System.getProperty("os.name") );
        System.out.println("OS-Architektur (OS-Bit-Version): " + System.getProperty("os.arch") );
        System.out.println("User Name: " + System.getProperty("user.name") );

        JOptionPane.showConfirmDialog(null, "Es klappt!");
    


当我尝试使用 .bat [Windows] 或 sh 启动此程序的 .class 或 .jar [称为“testi”] 时。 [Linux - Lubuntu] 成功了!

我可以继续只在空白 Eclipse 上进行开发,然后尝试转换为与 android 兼容的格式...还是应该重新处理我的流程?

【问题讨论】:

【参考方案1】:

您正在使用 Java Swing 库;这个doesn't exist 在Android 上。

Swing 处理JFrames 和JPanels,Android 使用Activitys 和FrameLayouts 之类的东西。这意味着 Android 不知道如何执行您的代码,因为它甚至不知道 JOptionPane 是什么。

您应该尝试仅迁移基本计算,并避免任何操作系统特定的调用。您可以通过对照Android API 检查您的包调用来验证支持哪些功能,或者将您的代码快速粘贴到Android Studio 以查看是否有任何投诉。

如果您确实需要独立于平台的 UI,您应该寻找与可用库(例如 nanovg)的原生集成,或搜索与平台无关的解决方案。我为这个确切的问题创建了ribbon-vg

【讨论】:

如果我理解你的答案是正确的,这意味着整个 GUI 处理是不同的。所以后台逻辑应该是兼容的。在我的情况下,所有 sysout-Lines 都应该工作,或者你的操作系统也是特定的?我在 androd studio 中复制了该部分,但是由于注释掉的两行它不再起作用(在我再次转换了这个新的 .jar 之后)。我试图用 java.swing 注释这两行...我错过了什么吗? 你说得对。 System.out.println() 受 Android 支持,它将使用标签 System.out 在 Logcat 输出中出现。您是否尝试过将代码编译为 .jar 并将其包含在 Android 构建路径中? 我不明白你所说的构建路径是什么意思。是的,我有 Eclipse(在 v1.7 上设置了编译器)和 Android Studio。现在我将它导出为 jar (Testi.jar)。接下来我打开 CMD,用“:d”切换到硬盘,导航到 android studio 的文件夹“cd D:\AndroidStudiosDK\build-tools\25.0.3”,然后启动 dx-tool:dx --dex - -output="[path]\testi.apk" "[path]\testi.jar" 我将这个创建的 .apk (testi.apk) 通过 usb-cable 移动到我的 androidphone...当我尝试通过我的方便的触摸板...我收到了错误消息...您看到我的错误或如何让它工作吗?【参考方案2】:

恕我直言,您的方法对于 Android 是错误的。你不能创建一个在任何地方都可以运行的main 方法,尤其是Android 不是一个常见的Java 环境。

从我的角度来看,更有用的方法是开发一个独立于系统的库,然后可以由系统相关的应用程序使用。

因此您可以提供三种不同的应用程序:

一个基于控制台/无头的 Java 应用程序 一个基于 Swing 的 Java 应用程序 一个基于 Android 的应用程序

【讨论】:

来自底部答案的 cmets 我明白了。我现在正在测试你只用 sysouts 在顶部编写我的代码......但这也不适用于我的安卓......同样的错误。我做错了什么? 您是否使用 AndroidManifest.xml(二进制编码)、正确的 dex 文件、Java-Manifest 和签名创建了一个真正的 Android 应用程序? 不,我没有。我在 Eclipse 中编写了上面的 .java 文件(没有扩展!)。我安装了 android studio 并尝试将使用 dx 工具编译的 .class 转换为 .apk。这不会开始。我该怎么办? 使用 Android Studio 和/或 Gradle 并创建一个包含您的代码的完整 Android 应用程序。否则你的代码将永远不会被执行。 Android不是Java,比如没有main函数。

以上是关于.dex 或 .apk 的 Java 字节码不起作用......该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

D8,下一代 dex 编译器

Android 逆向类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 准备 DEX 字节码文件 )

Android 插件化Hook 插件化框架 ( 创建插件应用 | 拷贝插件 APK | 初始化插件包 | 测试插件 DEX 字节码 )

使用dex2jar和jd-gui反编译一个apk

apk 反编译

Android的4种文件类型Java,class,dex,apk