1.APK是Android Package的缩写,即Android安装包。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。使用Android打包工具(aapt)将DEX文件,资源文件以及AndroidManifest.xml文件组合成一个应用程序包(APK)。Dex是Dalvik VM executes的全称,即Android Dalvik执行程序。META-INF\ Jar文件,res\ 存放资源文件,AndroidManifest.xml 应用全局配置文件,*.dex Dalvik虚拟机字节码(应用程序),resources.arsc 编译后的二进制资源文件,Android在运行程序时首先需要解压apk文件,然后获取编译后的androidmanifest.xml文件中配置信息,执行dex程序。
2.Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,通常执行时都进行优化 。优化后的文件大小会有所增加。 优化发生
的时机有两个:对于预置应用,可以在系统编译后,生成优化文件,以ODEX结尾。这样在发布时除APK文件(不包含DEX)以外,还有
一个相应的Android DEX文件;对于非预置应用,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。
Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个 Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时。Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。
3.fork(叉子)函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。hexdump命令是Linux下的打印16进制的利器,它可以按我们指定的格式输出16进制。
4.dex文件使用到的数据类型,u1等同于uint8_t,表示1字节的无符号数。sleb128有符号LEB128,可变长度1~5字节。sleb128,uleb128与uleb128p1则是dex文件中特有的LEB128数据类型。其中,每个LEB128由1~5个字节组成,所有的字节组合在一起表示一个32位的数据。如果第1个字节的最高位是1,表示LEB128需要使用到第2个字节。dex header为dex文件头,它指定了dex文件的一些属性,并记录了其它6部分数据结构在dex文件中的物理偏移。string_ids到class_def结构可以理解为"索引结构区",真实的数据存在data数据区,最后的link_data为静态链接数据区,对于目前生成的dex文件而言,它始终为空。整个dex文件结构从上往下为dex header->string_ids->type_ids->proto_ids->field_ids->method_ids->
class_def->data->link_data.
5.在DexHeader中magic为dex版本标识.Adler32可用于计算数据流的 Adler-32 校验和的类。checksum段为dex文件的校验和,通过它来判断dex文件是否被损坏或篡改。signature字段用来识别最佳化之前的dex文件。endianTag字段指定了dex运行环境的cpu字节序。mapOff字段指定了DexMapList结构的文件偏移。Dalvik虚拟机解析dex文件的内容,最终将其映射成DexMapList数据结构。DexHeader结构的mapOff字段指明了DexMapList结构在dex文件中的偏移。
6.dalvikvm的作用就是创建一个虚拟机并执行参数中指定的Java类,使用adb shell执行dalvikvm程序。dalvikvm的执行语法如下:dalvikvm -cp 类路径 类名.javac -source 1.6 -target 1.6 test.java, dx --dex --output=test.dex test.class。
2.Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,通常执行时都进行优化 。优化后的文件大小会有所增加。 优化发生
的时机有两个:对于预置应用,可以在系统编译后,生成优化文件,以ODEX结尾。这样在发布时除APK文件(不包含DEX)以外,还有
一个相应的Android DEX文件;对于非预置应用,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。
Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个 Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时。Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。
3.fork(叉子)函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。hexdump命令是Linux下的打印16进制的利器,它可以按我们指定的格式输出16进制。
4.dex文件使用到的数据类型,u1等同于uint8_t,表示1字节的无符号数。sleb128有符号LEB128,可变长度1~5字节。sleb128,uleb128与uleb128p1则是dex文件中特有的LEB128数据类型。其中,每个LEB128由1~5个字节组成,所有的字节组合在一起表示一个32位的数据。如果第1个字节的最高位是1,表示LEB128需要使用到第2个字节。dex header为dex文件头,它指定了dex文件的一些属性,并记录了其它6部分数据结构在dex文件中的物理偏移。string_ids到class_def结构可以理解为"索引结构区",真实的数据存在data数据区,最后的link_data为静态链接数据区,对于目前生成的dex文件而言,它始终为空。整个dex文件结构从上往下为dex header->string_ids->type_ids->proto_ids->field_ids->method_ids->
class_def->data->link_data.
5.在DexHeader中magic为dex版本标识.Adler32可用于计算数据流的 Adler-32 校验和的类。checksum段为dex文件的校验和,通过它来判断dex文件是否被损坏或篡改。signature字段用来识别最佳化之前的dex文件。endianTag字段指定了dex运行环境的cpu字节序。mapOff字段指定了DexMapList结构的文件偏移。Dalvik虚拟机解析dex文件的内容,最终将其映射成DexMapList数据结构。DexHeader结构的mapOff字段指明了DexMapList结构在dex文件中的偏移。
6.dalvikvm的作用就是创建一个虚拟机并执行参数中指定的Java类,使用adb shell执行dalvikvm程序。dalvikvm的执行语法如下:dalvikvm -cp 类路径 类名.javac -source 1.6 -target 1.6 test.java, dx --dex --output=test.dex test.class。