将java文件转换为DEX并在Android真机运行
引入DEX文件在Android中很重要,它与APK瘦身、热修复、插件化、应用加固、逆向工程、64K方法数限制都有关系[1]。所以,我们先来认识一下本文的主角,DEX文件。Dalvik虚拟机在Android中的作用,与JVM在Linux中的作用类似。我们用java语言来开发Android程序,但Android的Dalvik并不能直接运行java字节码(.class文件)。所以需要把.class...
引入
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
步骤
- 写出如下java代码,并将其保存为Hello.java
public class Hello
{
public static void main(String[] args)
{
System.out.println("hello ybdesire");
}
}
- 添加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
。
- 将.java转换为.class
使用javac命令(JDK的路径中),可以将.java文件转换为.class文件。
E:\java_to_dex>javac Hello.java
E:\java_to_dex>java Hello
hello ybdesire
使用java命令,可以运行.class文件,并得到结果。
- 将.class文件转换为.dex文件
做了如上配置后,使用如下的dx命令,可以将.class文件转换为.dex文件
E:\java_to_dex>dx --dex --output=Hello.dex Hello.class
- 在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
思考
- 上面讲了一个很简单的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
更多推荐
所有评论(0)