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

6 篇文章 1 订阅
3 篇文章 0 订阅

引入

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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这款APK反编译工具(ApkToolkit)拥有编译、反编译、签名等功能,对于经常DIY安卓软件的朋友来说,是必不可少的工具。能够支持WIN7系统,但是这款安卓apk反编译工具暂不支持WIN8系统。 APK 反编译工具 ApkToolkit 中文版APK 反编译工具 ApkToolkit 中文版 功能介绍 1、反编译.apk 对.apk文件进行反编译。 2、重建.apk 根据反编译.apk得到目录重建.apk文件。 3、签名.apk 对.apk文件进行签名。 4、优化.apk 对.apk文件进行优化。 5、framework-res.apk工具 实现framework-res.apk的安装和管理。 6、.apk转.jar 将.apk文件转换为.jar文件。 7、.dex转.jar 将.dex文件转换为.jar文件。 插件版本: Java版本:1.7.0_60 Aapt版本:0.2 Apktool版本:2.0.0-dirty Dex2Jar版本:translator-0.0.9.15 使用说明 1、反编译.apk 拖拽【XXX.apk】程序到”反编译.apk”按钮前的输入区,点击”反编译.apk”按钮, 会在文件【XXX.apk】的同级目录下生成文件夹【XXX】。 2、重建.apk 把第一步得到的文件夹【XXX】拖拽到”重建.apk”按钮前面的输入区,点击”重建.apk”按钮, 会在文件夹【XXX】的同级目录下生成未签名的程序【XXX.R.apk】。 3、签名.apk 把第二步得到的程序【XXX.R.apk】拖拽到”签名.apk”按钮前的输入区,点击”签名.apk”按钮, 会在文件【XXX.R.apk】的同级目录下生成已经签名好的程序【XXX.RS.apk】。 4、优化.apk 把第三步得到的程序【XXX.RS.apk】拖拽到”优化.apk”按钮前的输入区,点击”优化.apk”按钮, 会在【XXX.RS.apk】的同级目录下生成已经优化好的程序【XXX.RSO.apk】。 5、framework-res.apk工具 拖拽【XXX.apk】文件到”安装”按钮前的输入区,点击”安装”按钮,会生成相应的apk,编译对某 些APK程序的反编译和重建。 点击”查看”,即可在资源管理器中看到已经安装的framework-res.apk,可对其进行管理或删除。 6、.apk转.jar 拖拽【XXX.apk】文件到”.apk转.jar”按钮前的输入区,点击”.apk转.jar”按钮, 会在文件【XXX.apk】的同级目录下生成文件【XXX_dex2jar.jar】。 7、.dex转.jar 拖拽【XXX.dex文件到”.dex转.jar”按钮前的输入区,点击”.dex转.jar”按钮, 会在文件【XXX.dex】的同级目录下生成文件【XXX_dex2jar.jar】。 注意事项 1、使用环境:首先必须安装JDK 6/7。 2、使用“反编译.apk”功能时,路径中不能出现任何中文字符或全角字符! 3、使用“重建.apk ”功能时,路径中不能出现任何中文字符或全角字符!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值