浅谈 Android Dex 文件
概述
为什么要了解 Dex 文件
了解了 Dex 文件以后,对日常开发中遇到一些问题能有更深的理解。如:APK 的瘦身、热修复、插件化、应用加固、Android 逆向工程、64 K 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》开源 方法数限制。
什么是 Dex 文件
在明白什么是 Dex 文件之前,要先了解一下 JVM,Dalvik 和 ART。JVM 是 JAVA 虚拟机,用来运行 JAVA 字节码程序。Dalvik 是 Google 设计的用于 Android平台的运行时环境,适合移动环境下内存和处理器速度有限的系统。ART 即 Android Runtime,是 Google 为了替换 Dalvik 设计的新 Android 运行时环境,在Android 4.4推出。ART 比 Dalvik 的性能更 Android开源项目《ali1024.coding.net/public/P7/Android/git》 好。Android 程序一般使用 Java 语言开发,但是 Dalvik 虚拟机并不支持直接执行 JAVA 字节码,所以会对编译生成的 .class 文件进行翻译、重构、解释、压缩等处理,这个处理过程是由 dx 进行处理,处理完成后生成的产物会以 .dex 结尾,称为 Dex 文件。Dex 文件格式是专为 Dalvik 设计的一种压缩格式。所以可以简单的理解为:Dex 文件是很多 .class 文件处理后的产物,最终可以在 Android 运行时环境执行。
Dex 文件是怎么生成的
java 代码转化为 dex 文件的流程如图所示,当然真的处理流程不会这么简单,这里只是一个形象的显示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lLWLUjTY-1650450411612)(https://user-gold-cdn.xitu.io/2018/11/19/16729fad9dc6dcb3?imageView2/0/w/1280/h/960/ignore-error/1)]
注:图片来源于网络
现在来通过一个简单的例子实现 java 代码到 dex 文件的转化。
从 .java 到 .class
先来创建一个 Hello.java 文件,为了便于分析,这里写一些简单的代码。代码如下:
public class Hello {
private String helloString = “hello! youzan”;
public static void main(String[] args) {
Hello hello = new Hello();
hello.fun(hello.helloString);
}
public void fun(String a) {
System.out.println(a);
}
}
在该文件的同级目录下面使用 JDK 的 javac 编译这个 java 文件。
javac Hello
javac 命令执行后会在当前目录生成 Hello.class 文件,Hello.class 文件已经可以直接在 JVM 虚拟机上直接执行。这里使用使用命令执行该文件。
java Hello
执行后应该会在控制台打印出“hello! youzan”
这里也可以对 Hello.class 文件执行 javap 命令,进行反汇编。
javap -c Hello
执行结果如下:
public class Hello {
public Hello();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object.“”
浅谈 Android Dex 文件相关推荐
- 浅谈Android保护技术__代码混淆
浅谈Android保护技术__代码混淆 浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读 ...
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
原文地址: http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间 ...
- android分屏模式_浅谈 Android 7.0 多窗口分屏模式的实现
从 Android 7.0 开始,Google 推出了一个名为"多窗口模式"的新功能,也就是我们常说的"分屏模式".那么,这个功能有什么用呢?作为开发者,我们又 ...
- 浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解 本篇文章小编为大家介绍,Android onTouchEvent 与 onInterceptTo ...
- android 存储空间监控,浅谈 Android 内存监控(中)
前言 在上篇 浅谈 Android 内存监控(上) 中,我们聊了 LeakCanary,微信的 Matirx 和美团的 Probe,它们各自有不同的应用场景,例如,在开发测试环境,我们会偏向用 Lea ...
- android获取存储设备根目录,浅谈android获取存储目录(路径)的几种方式和注意事项...
通常, 我们创建文件/目录, 或者存储图片什么的, 我们都需要拿到手机的存储路径, 现在我们就来看一下获取手机存储路径的几种方式(作为工具类方法调用即可): 第一种: 获取 /storage/emul ...
- 浅谈Android Architecture Components
浅谈Android Architecture Components 浅谈Android Architecture Components 简介 Android Architecture Componen ...
- 浅谈Android文件管理器的几种实现方式(原理篇)--对我有帮助
转自 https://blog.csdn.net/weixin_33698823/article/details/87269955 浅谈Android文件管理器的几种实现方式 为了完成毕业设计,我花费 ...
- 浅谈Android游戏开发基础和经验
Android游戏开发基础和经验是本文要介绍的内容,主要是来了解并学习Android游戏开发的内容实例,具体关于Android游戏开发内容的详解来看本文. 做一个类似俄罗斯方块的android游戏开发 ...
- 浅谈Android中的MVP与动态代理的结合
浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...
最新文章
- nginx反向代理cas-server之2:生成证书,centOS下使用openssl生成CA证书(根证书、server证书、client证书)...
- 安装smac的注意事项
- pdm生成mysql sql语句_如何用Powerdesigner的PDM生成数据库
- AT3860-[AGC020F]Arcs on a Circle【dp】
- Study on Android【五】--自定义ContentProvider的语义
- 连接路由器后电脑连不上网_猫、路由器、交换机的区别
- HiveSQL技术原理、优化[深度解析]
- 【Sublime】Mac下Sublime代码自动换行
- Unity中脚本的生命周期
- Java完全参考手册笔记1
- 学生信息管理系统详细设计文档
- IT是什么意思?什么是IT行业?
- 联通4g 小米不显示无服务器,小米旗舰机断流严重,信号满格消息却发不出去?...
- 【代码记录】pytorch推理及与onnx推理精度对比
- 帆软报表配置入门(一丶普通报表和决策报表 )
- wagon-maven-plugin插件实现自动化构建部署到服务器
- 管理心智能量,在恐惧之下训练心流
- 2018百度之星程序设计大赛 - 资格赛 A B C E F
- img加载图片失败后处理
- [bzoj1502]月下柠檬树
热门文章
- android打开超链接屏幕太小,手机屏幕太小,教你2种方法投屏到电脑上,小白也能轻松搞定!...
- 手心输入法皮肤制作技巧
- QT实现的人机对战五子棋
- python海龟交易源码_海龟交易系统的Python完全版 | RiceQuant米筐量化社区 交易策略论坛...
- 驱动精灵的护眼大师屏保非常不错
- Nifi介绍、安装、实践案例
- 阿铭Linux_网站维护学习笔记201903026
- SAP 客户端不能访问解决方案
- RHEL 7 防火墙
- sangerbox使用教程_SangerBox:一款好用的生物信息分析可视化工具