转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/5736305.html
本文出自【赵彦军的博客】

1、什么是dex?

简单说就是优化后的android版.exe。每个apk安装包里都有。
相对于PC上的java虚拟机能运行.class;android上的Davlik虚拟机能运行.dex。
为何要研究dex格式?因为dex里面包含了所有app代码,利用反编译工具可以获取java源码。理解并修改dex文件,就能更好的apk破解和防破解。

2、dex好处

dex文件有个天大的好处:它可以直接用DexClassLoader类加载,这叫动态加载。于是我们只要在dex上加壳,在程序运行时脱壳,就可以规避静态反编译的风险。

3、一般的反编译流程是什么样子的。

1、下载apk文件,然后解压 ,得到 class.dex 文件

2、用dex2jar 把 class.dex 还原成 classes-dex2jar.jar 文件

3、用 jd-gui.exe 把 classes-dex2jar.jar 文件打开,就可以看到源码了。

4、Android 为什么会出现 65536限制问题?

  在Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的包,存储了很多Java编译字节码的归档文件。因为Android系统使用Dalvik虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。这里需要强调的是,Dex和Jar一样是一个归档文件,里面仍然是Java代码对应的字节码文件。当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多。但是在早期的Android系统中,DexOpt有一个问题,也就是这篇文章想要说明并解决的问题。DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面。但是这个链表的长度是用一个short类型来保存的,导致了方法id的数目不能够超过65536个。当一个项目足够大的时候,显然这个方法数的上限是不够的。尽管在新版本的Android系统中,DexOpt修复了这个问题,但是我们仍然需要对老系统做兼容。

Android DEX 基础相关推荐

  1. Android编译及编译脚本、Android构建基础学习笔记

    Android编译及编译脚本.Android构建基础学习笔记 Android编译及编译脚本 概述 Android.mk转换成Android.bp 例子(简单Android.mk文件转Android.b ...

  2. Android应用基础开发入门

    本文写给Android小白,起步入门参考,不过还是喜欢从原理上尽量多讲一点东西. 本文从以下四个方面展开,重点介绍前3节: 第一节:什么是apk? 第二节:android开发 工具介绍 第三节:我们开 ...

  3. 2017-2018-2 20165236 实验四《Android开发基础》实验报告

    2017-2018-2 20165236 实验四<Android开发基础>实验报告 一.实验报告封面 课程:Java程序设计       班级:1652班       姓名:郭金涛     ...

  4. Android NDK基础样例

    Android NDK基础样例 NDK(Native Development Kit),用C/C++封装一些东西?好像就这么理解好了== 一.环境准备 这个好讨厌==!因为我环境都已经搭了很久了. 已 ...

  5. Android零基础入门第11节:简单几步带你飞,运行Android Studio工程

    2019独角兽企业重金招聘Python工程师标准>>> 之前讲过Eclipse环境下的Android虚拟设备的创建和使用,现在既然升级了Android Studio开发工具,那么对应 ...

  6. Android零基础入门第30节:两分钟掌握FrameLayout帧布局

    原文:Android零基础入门第30节:两分钟掌握FrameLayout帧布局 前面学习了线性布局.相对布局.表格布局,那么本期来学习第四种布局--FrameLayout帧布局. 一.认识FrameL ...

  7. Android零基础入门第25节:最简单最常用的LinearLayout线性布局

    原文:Android零基础入门第25节:最简单最常用的LinearLayout线性布局 良好的布局设计对于UI界面至关重要,在前面也简单介绍过,目前Android中的布局主要有6种,创建的布局文件默认 ...

  8. qtdesigner怎么实现菜单栏跳转_人人都可写代码-Android零基础编程-app 入口菜单栏实操08...

    欢迎来到人人都可写代码,大家好,我是杨晓华,今天我们的课程内容是项目实操,以智者精选项目为例,编写一个Android app的入口关联菜单栏逻辑. 这是要实现的菜单栏组件展示效果,下面就是教大家如何制 ...

  9. Android零基础入门第44节:ListView数据动态更新

    2019独角兽企业重金招聘Python工程师标准>>> 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据 ...

最新文章

  1. linux 权限 775 777 区别
  2. IS-IS 的 DIS (伪节点) 及 DIS 和 OSPF中DR 的区别
  3. 【Canal源码分析】TableMetaTSDB
  4. sts (eclipse)安装配置lombok
  5. springboot开发的项目上传图片到服务器后不能访问
  6. WebRTCon 2018 Day One精彩回顾
  7. C++ class实现双亲表示法
  8. ejb的maven_针对新手的Java EE7和Maven项目-第3部分-定义ejb服务和jpa实体模块
  9. linux读整个文件内容,Linux查看整个文件
  10. 小程序开发(4)-之登录
  11. 多线程 循环 锁_大多数人还不清楚的iOS多线程
  12. 修改ranger ui的admin用户登录密码踩坑小记
  13. 通过SmartGit把java maven项目传到码云
  14. Apache+tomcat配置集群(1)
  15. 云计算和虚拟化都要用到的核心技术 VXLAN 网络,你掌握了吗?
  16. 中标麒麟linux界面设置ftp,中标麒麟下sambat和vsftp配置
  17. 安卓平台有哪些好的时间管理软件
  18. 前端框架中的大熊猫Ember
  19. 交换机测试丢包软件,交换机丢包问题定位
  20. Axure RP 基于母版实现页面框架/页眉/页脚/导航栏

热门文章

  1. vue前端怎么导出图片_vue前端实现导出表格
  2. java 异步事件_Java编程入门——异步事件:轮询与中断
  3. html float菜鸟,这些年,我们前端菜鸟遇到的坑(1)--CSS易错点--float、透明度、rem......
  4. 【小白学习C++ 教程】三、C++用户输入、判断语句和switch
  5. 一、Go语言环境搭建
  6. 六、乘胜追击,将剩下的Git知识点搞定
  7. CVPR 2019 | 基于可解释性以及细粒度的可视化解释卷积神经网络
  8. 算法分析与设计-实验二 动态规划算法设计
  9. 丑憨批的Transformer笔记
  10. Python ord()函数和chr()函数