APK文件 | Dalvik虚拟机与Smali语法

APK结构

apk文件从文件结构上来讲,是zip压缩包格式,可以直接通过解压工具打开,例如:

APK文件 | Dalvik虚拟机与Smali语法

META-INF目录

这个文件夹下存放的是签名信息。

res目录

这个文件夹下存放的是app需要的资源文件,如图片、布局等。

lib目录

这个文件夹下存放的是应用的依赖库,是以.so的后缀名结尾的文件。根据硬件的CPU架构,可分为4种:ARM、ARM-V7、MIPS和X86,所以通常存在4个不同的目录,但这些文件本质上的功能是相同的,只是机器语言有所差别。不过绝大多数手机都使用的ARM架构,所以大多数情况只需要有armeabi和armeabi-v7a两种类型的库即可。

assets目录

assets目录中也是资源文件,但与res目录不同的是,assets目录中的资源文件不会映射到R中,即无法用R.id获取assets中的资源,必须通过AssetManager进行操作与获取资源;assets目录下可以存在多级目录,而res目录下是不能有其他目录的。

classes.dex

Dalvik虚拟机的可执行文件。

resources.arsc

这个文件实际上是App的资源索引表,记录了资源文件和资源文件ID的映射关系。

AndroidManifest.xml 

Android应用的配置清单文件,系统在安装apk时首先通过这个文件来了解该应用相关的配置信息。

APK的打包

APK文件 | Dalvik虚拟机与Smali语法

一图胜千言。

写了半天不想写了。上现成的。

https://www.cnblogs.com/sjm19910902/p/6416022.html

APK的解包

apktool解包后将dex文件反汇编为smali代码,并对AndroidManifest.xml文件进行解密。要获取java源码,可提取apk中的dex文件,再依次使用dex2jar和jd-gui等工具反编译得到源码。

 

Dalvik虚拟机

Dalvik 虚拟机作为Android 平台的核心组件,拥有如下几个特点:

  •  体积小,占用内存空间小;
  •  专有的DEX 可执行文件格式,体积更小,执行速度更快;
  •  常量池采用32 位索引值,寻址类方法名、字段名、常量更快;
  •  基于寄存器架构,并拥有一套完整的指令系统;
  •  提供了对象生命周期管理、堆栈管理、线程管理、安全和异常管理以及垃圾回收等重要功能;
  • 所有的Android 程序都运行在Android 系统进程里,每个进程对应着一个Dalvik 虚拟机实例。

不想写了。。。