将java文件转换为DEX并在Android真机运行

引入

DEX文件在Android中很重要,它与APK瘦身、热修复、插件化、应用加固、逆向工程、64K方法数限制都有关系[1]。

所以,我们先来认识一下本文的主角,DEX文件。

Dalvik虚拟机在Android中的作用,与JVM在Linux中的作用类似。我们用java语言来开发Android程序,但Android的Dalvik并不能直接运行java字节码(.class文件)。所以需要把.class文件转换为DEX文件。转换过程如下:

在这里插入图片描述

如图可见,DEX文件可以认为是多个.class文件转换而来的。DEX文件可以直接在Android下运行。

下面我们就讲解如何将.java文件转换为.dex文件,并在Android下运行这个.dex文件。

本文实验环境

  • windows 10
  • android studio
  • JDK 1.8.0

步骤

  1. 写出如下java代码,并将其保存为Hello.java
public class Hello
{
    public static void main(String[] args)
    {
        System.out.println("hello ybdesire");
    }
}
  1. 添加build-tools的环境变量

由上面图1可知,要将.class文件转换为.dex文件,必须要用dx工具。dx一般位于Android SDK的build-tools中。所以需要把dx工具的路径,添加到Windows系统的环境变量中,本文的build-tools路径为C:\Users\xxx\AppData\Local\Android\Sdk\build-tools\28.0.3

  1. 将.java转换为.class

使用javac命令(JDK的路径中),可以将.java文件转换为.class文件。

E:\java_to_dex>javac Hello.java
E:\java_to_dex>java Hello
hello ybdesire

使用java命令,可以运行.class文件,并得到结果。

  1. 将.class文件转换为.dex文件

做了如上配置后,使用如下的dx命令,可以将.class文件转换为.dex文件

E:\java_to_dex>dx --dex --output=Hello.dex Hello.class
  1. 在Android环境中运行.dex文件

首先打开Android模拟器,或连接真机。如下出现devices的显示,就说明能连接Android。

E:\java_to_dex>adb devices
List of devices attached
emulator-xxxx   device

使用adb,将.dex文件push到Android端。

E:\java_to_dex>adb root
E:\java_to_dex>adb push Hello.dex /sdcard/
Hello.dex: 1 file pushed. 0.1 MB/s (728 bytes in 0.013s)

再进入shell,使用如下的dalvikvm命令,就能运行.dex文件。

E:\java_to_dex>adb shell
generic_x86:/ $ dalvikvm -cp /sdcard/Hello.dex Hello
hello ybdesire

本文实验代码可以在这里获取:

  • https://github.com/ybdesire/android_security_learn/tree/master/compile_build/build_dex_from_java_and_run

思考

  1. 上面讲了一个很简单的java文件转换为dex在Android运行,是否可以直接从APK中抽出DEX并在Android运行呢?

答案是不行的。从两个方面考虑:首先,dalvikvm命令运行DEX必须要指定class name,任意APK中抽出的classes.dex我们无法获取class name;其次,APK中除了DEX,还有资源文件,动态链接库等,缺一不可。

参考

  • [1] https://juejin.im/post/5bf22bb5e51d454cdc56cbd5
  • [2] https://github.com/ybdesire/android_security_learn/tree/master/compile_build/build_dex_from_java_and_run
发布了190 篇原创文章 · 获赞 259 · 访问量 122万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章