首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java文件是如何编译成Dex文件的?如何执行Dex文件?「建议收藏」

Dex文件介绍 ---- Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的存储了多有Java编译字节码的归档文件。 为什么要使用dex文件来存储呢?...Java源码经过编译后,得到很多个class文件,考虑到手机的内存较小,google改进了字节码的组织形式,将一个app中的所有class文件合到了一起构成dex文件,当然并不是简单的拼接在一起,而是遵从....class文件生成dex文件。 1. Java文件生成.class文件 Java文件是Java的源文件。 .class文件是Java的字节码文件,它可以被JVM识别、加载和执行。...示例: //进入dx所在目录,.class文件复制到该目录下,命令行执行命令: dx --dex --output demo.dex Demo.class dex文件执行 ---- 打包成.apk文件...dalvikvm的作用就是创建一个虚拟机并执行指定参数中的java类。 我们用一个示例来看如何使用?

1.7K10

【Android 安全】DEX 加密 ( Java 工具开发 | 生成 dex 文件 | Java 命令行执行 )

文章目录 一、生成 dex 文件 二、生成 dex 文件代码示例 三、生成 dex 结果 一、生成 dex 文件 ---- 上一篇博客解压了 代理 Application 依赖库 multiple-dex-core-debug.aar...( dex 转换前的文件 ) , classes.dex ( dex转换后的文件 ) 文件对象 , 使用这两个文件对象获取完整路径 ; // 拿到 multiple-dex-core-debug.aar..., 下面会开始创建该 dex 文件 var classesDexFile = File(aarUnzip, "classes.dex") Java 代码中调用命令行执行 : 使用 Runtime.getRuntime...("执行成功"); }else{ println("执行失败"); } 生成 dex 文件的完整代码 : fun main() { /* 1 ....\DexEncryption\multiple-dex-tools\aarUnzip\classes.jar 执行成功 Process finished with exit code 0 aar 文件解压及

82300
您找到你想要的搜索结果了吗?
是的
没有找到

【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 )

文章目录 一、DEX 字节码文件准备 二、拷贝 Assets 目录下的 classes2.dex 字节码文件到内置存储区 三、在 AndroidManifest.xml 清单文件中配置组件 四、启动 DEX...文件中的 Activity 一、DEX 字节码文件准备 ---- 在 dex_demo 应用 Module 中 , 创建 com.example.dex_demo.MainActivity2 类 ;...onCreate"); } } 编译上述 Module 生成 APK 文件 dex_demo-debug.apk , 解压 APK 文件dex_demo-debug 目录中 , 将 dex_demo-debug...目录中的 classes.dex 复制一份 , 重名为 classes2.dex , 这是为了与上一个示例中的文件重名而修改的 ; 二、拷贝 Assets 目录下的 classes2.dex 字节码文件到内置存储区...类 // 该类中有可执行方法 test() Class<?

66610

【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )

文章目录 一、拷贝 Assets 目录下的 classes.dex 字节码文件到内置存储区 二、加载 DEX 文件执行其中的方法 三、MainActivity 及执行结果 四、博客资源 一、拷贝 Assets...DEX 字节码文件 ) 博客中 , 准备了 classes.dex 字节码文件 , 将字节码文件拷贝到了 将 app\src\main\assets\classes.dex 目录中 ; 解析字节码文件时..."); } return dexPath; } 二、加载 DEX 文件执行其中的方法 ---- 使用 DexClassLoader 加载字节码文件时 , 要准备几个参数...DEX 字节码文件路径 : 必须制定准确的 DEX 字节码文件目录 ; /data/user/0/com.example.classloader_demo/files/classes.dex 优化目录...类 // 该类中有可执行方法 test() Class<?

50030

Android动态加载入坑指南

传统的pc端动态加载 熟悉Java的同学应该比较清楚,Java的可执行文件是Jar,运行在虚拟机上JVM上,虚拟机通过ClassLoader加载Jar文件执行里面的代码。...我们知道,在Android的apk文件中往往有一个或者多个Dex文件,系统的类加载器(PathDexClassLoader)加载的就是dex文件,虽然一个apk一旦构建出来,我们是无法更换里面的Dex文件的...参数意思如下: 第一个参数指的是我们要加载的 dex 文件的路径,它有可能是多个 dex 路径,取决于我们要加载的 dex 文件的个数,多个路径之间用 : 隔开。...优化之后的 dex 文件我们把它叫做 odex (optimized dex,说明这是被优化后的 dex文件。...第三个参数的意义是库文件的的搜索路径,一般来说是 .so 库文件的路径,也可以指明多个路径。

2.1K113

ART 在 Android 安全攻防中的应用

阅读上述代码可以得知,当 ART 运行时尚未启动或者指定强制使用解释执行时,虚拟机执行函数使用的是解释模式,ART 可以在启动时指定 -Xint 参数强制使用解释执行,但即便指定了使用解释执行模式,还是有一些情况无法使用解释执行...,比如: 当所执行的方法是 Native 方法时,这时只有二进制代码,不存在字节码,自然无法解释执行; 当所执行的方法无法调用,比如 access_flag 判定无法访问或者当前方法是抽象方法时; 当所执行的方式是代理方法时...Dex 文件结构的对这个字段应该不会陌生,后面可能会单独写一篇 DexFile 文件格式的介绍,这里限于篇幅先不展开,只需要知道这个字段包含类的定义即可。...文件中的字节码,并在运行时还原; 替换掉 DEX 文件中每个方法的字节码为解密代码,运行时解密执行; …… 这些加固方案根据解密粒度不同也常称为整体壳、抽取壳。...由于抽取壳本身对字节码进行了加密,因此在应用安装期间 dex2oat 就无法优化这些代码,以至于在运行时只能通过解释执行,虽然有一部分 JIT 的加持,但还是让 ART 的大部分优化心血付诸东流;另外,

98910

面试必问的安卓虚拟机,你真的掌握了么?——安卓虚拟机基础知识回顾

dex2oat 触发场景 dex2oat 的作用:对 dex 文件进行编译,根据参数,生成 oat vdex art 文件。...Oat 文件是一种特殊的 ELF 文件格式,它包含 dex 文件编译得到的机器指令,在 8.0 以下包括原始的 dex 内容,8.0 之后 raw dex 在 quicken 化之后是在 .vdex 里...::kOther; } 如果之前做过 dex2oat,有 vdex 文件,下次执行 dex2oat 时(比如系统 OTA)就可以省去重新 verify dex 的过程。...- 保存该类直接实现或间接实现(继承)的接口信息 - 接口信息包含两个部分 vtable_: - 保存该类直接定义或间接定义的 virtual 方法 - 比如Object类中的wait、notify...,不论是解释执行还是以本地机器指令执行,都通过 ArtMethod 的 GetEntryPointFromCompiledCode 获取入口点。

55340

android加载dex方法,android Dex文件的加载

上篇文章讲到了apk的分包,通过multidex构建出包含多个dex文件的apk,从而解决65536的方法数限制问题《Android Dex分包》。...在dalvik虚拟机上,应用启动时只会加载主dex文件,而从dex需要我们手动去加载,那么问题来了,如何手动加载一个dex文件?...、jar、apk文件的路径,多个路径之间用:分隔 optimizedDirectory: dex文件首次加载时会进行dexopt操作,optimizedDirectory即为优化后的odex文件的存放目录...openDexFileNative代码中主要是对dex文件进行了优化操作,并将优将优化后得dex文件(odex文件)通过mmap映射到内存中。...Class.classForName(name, false, null); } findClass方法也是返回Class.classForName,这里第三个参数为null,采用的是根加载器,而根加载器是用来加载java核心类,无法加载用户定义的类

1.5K20

Android热修复AndFix

与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。...当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class文件加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。...一个ClassLoader可以包含多个dex文件,每个dex文件是一个Element(元素),多个dex文件排列成一个有序的数组dexElements,当找类的时候,会按顺序遍历dex文件,然后从当前遍历的...dex文件中找类,如果找类则返回,如果找不到从下一个dex文件继续查找。...自己试了方法可以 资源文件无法替换   试了下换原有的图片可以,但是新增的不行 不能修改xml布局文件   不能 加固后的包补丁无法使用,如果要加固,需要加固前的包来生成补丁,不过这样生成的补丁也很容易破解

74180

浅谈Android热更新的前因后果

app发版成本高 用H5集成某些经常变动的业务逻辑,但这种方案需要学习成本,而且对于无法转为H5形式的代码仍旧是无法修复; Instant Run 上面三个原因中,我们主要来谈一下 Instant Run...,文件可以是包含了 classes.dex 的 JAR/APK/ZIP,也可以直接使用 classes.dex 文件多个文件用 “:” 分割 // librarySearchPath: 存放需要加载的...的 JAR/APK/ZIP,也可以直接使用 classes.dex 文件多个文件用 “:” 分割 // optimizedDirectory: 存放优化后的 dex,可以为空 // librarySearchPath...dex文件,它可以被用来执行未安装的代码或者未被应用加载过的代码,也就是我们修复过的代码。...,文件可以是包含了 classes.dex 的 JAR/APK/ZIP,也可以直接使用 classes.dex 文件多个文件用 “:” 分割 // optimizedDirectory: 存放优化后的

1.6K40

Android 虚拟机:你需要掌握的基本知识

的作用:对 dex 文件进行编译,根据参数,生成 oat vdex art 文件。...Oat 文件是一种特殊的 ELF 文件格式,它包含 dex 文件编译得到的机器指令,在 8.0 以下包括原始的 dex 内容,8.0 之后 raw dex 在 quicken 化之后是在 .vdex 里...::kOther; } 如果之前做过 dex2oat,有 vdex 文件,下次执行 dex2oat 时(比如系统 OTA)就可以省去重新 verify dex 的过程。...vtable_: 保存该类直接定义或间接定义的 virtual 方法 比如Object类中的wait、notify、toString 等方法 methods_: 只包含本类直接定义的 direct...,不论是解释执行还是以本地机器指令执行,都通过 ArtMethod 的 GetEntryPointFromCompiledCode 获取入口点。

95210

ClassLoader解析(二):Android中的ClassLoader

文件以及包含dex的apk文件或jar文件。...文件以及包含dex的apk文件或jar文件的路径集合,多个路径用路径分隔符(File.pathSeparator)分隔,Android中默认分隔符为”:“ * @param librarySearchPath...文件以及包含dex的apk文件或jar文件,也支持从SD卡进行加载,这也意味着DexClassLoader可以在应用未安装的情况下加载dex相关文件。...文件以及包含dex的apk文件或jar文件的路径集合,多个路径用路径分隔符(File.pathSeparator)分隔,Android中默认分隔符为”:“ * @param optimizedDirectory...这个参数从API26开始弃用,原本代表dex的优化后的odex文件的路径 * @param librarySearchPath 包含C/C++库的路径集合,多个路径用路径分隔符分隔,可以为空

1.4K40

浅谈Android Classloader动态加载分析

BootClassLoader是ClassLoader的内部类,是包内可见,我们无法直接使用,也无法直接动态加载。...URLClassLoader的特点就是只能加载jar文件,但是dalvik不能直接识别jar。所以在Android中无法直接使用这个类加载器。...因为dex版本只有第一次启动会解压执行程序到/data/dalvik-cache(针对PathClassLoader),或者optimizedDirectory文件目录下(针对DexClassLoader...原因在于其父类BaseDexClassLoader对于“.jar”,“.apk”,”.zip”,”.dex”后缀的文件都会进行对应的处理,最终提取成可执行dex文件。...每个ClassLoader可以有多个dex文件,每个dex文件是一个Element,多个dex文件组成一个dexElements,类加载器寻找类的时候,会遍历dexElements中的dex文件,再通过

1.2K10

Tinker Android热补丁框架

另一方面,由于无法增加变量与类等限制,无法做到功能发布级别; java的代表Qzone;最大挑战在于性能,即Dalvik平台存在插桩导致的性能损耗,Art平台由于地址偏移问题导致补丁包可能过大的问题;...是因为判断犯规有个条件,即如果类没有被打上IS_PREVERIFIED标记则不会触发判定.如果类在静态代码块或构造函数中引用 到了不在同一个dex文件则不会有IS_PREVERIFIED标记.因此最直接的办法就是手动在所有类的构造函数或.../src/main/java/com/tencent/tinker/loader ?...它的粒度是Dex格式的每一项,可以充分利用原本Dex的信息,而BsDiff的粒度是文件,AndFix/QZone 的粒度为class。 关于微信所使用的三种算法,如图所示 ?...合并时占用额外磁盘空间,对于多DEX的应用来说,如果修改了多个DEX文件,就需要下发多个patch.dex与对应的classes.dex进行合并操作时这种情况会更严重,因此合并过程的失败率也会更高。

88230

Android ClassLoader详解

URLClassLoader 只能用于加载jar文件,但是由于 dalvik 不能直接识别jar,所以在 Android 中无法使用这个加载器。...BaseDexClassLoader的构造函数包含四个参数,分别为: dexPath,指目标类所在的APK或jar文件的路径,类装载器将从该路径中寻找指定的目标类,该类必须是APK或jar的全路径.如果要包含多个路径...其实APK是一个程序压缩包,里面包含dex文件,ODEX优化就是把包里面的执行程序提取出来,就变成ODEX文件,因为你提取出来了,系统第一次启动的时候就不用去解压程序压缩包的程序,少了一个解压的过程。...是因为DEX版本的也只有第一次会解压执行程序到 /data/dalvik-cache(针对PathClassLoader)或者optimizedDirectory(针对DexClassLoader)目录...DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容。

1.3K100

Tinker原理

中的类是oldDex1中除了dex.loader中标明的类之外的所有类,dex.loader中的类依然在oldDex1中。...就是在应用安装和首次运行不做AOT编译,先让用户愉快的玩耍起来,然后把在运行中JIT解释执行的那部分代码收集起来,在手机空闲的时候通过dex2aot编译生成一份名为app image的base.art文件...错误原因在加载补丁dex一节其实已经提到一些,我们引用过来,这个配置(dex.loader)中的类不会出现在任何全量补丁dex里,也就是说在合成后,这些类还在老的dex文件中,比如在补丁前dex顺序是这样的...那是因为在ART虚拟机原生支持从APK文件加载多个dex文件。...在应用安装时执行dex2oat扫描 classes(…N).dex文件,并将它们编译成单个oat文件,供 Android设备执,也就不存在MultiDex的问题了。

48910
领券