精华内容
下载资源
问答
  • 深入解析Android虚拟机
    2021-06-07 13:14:12

    深入解析Android虚拟机

    编辑

    锁定

    讨论

    上传视频

    《深入解析Android虚拟机》是2014年由清华大学出版社出版的图书,作者是张子言。

    书    名

    深入解析Android虚拟机

    作    者

    张子言

    ISBN

    9787302344087定    价

    49.50元

    出版社

    清华大学出版社

    出版时间

    2013-12-27

    装    帧

    平装

    深入解析Android虚拟机图书简介

    编辑

    本书循序渐进地讲解了Android虚拟机技术的基本知识,内容新颖、知识全面、讲解详细。全书分为13个章节,分别讲解了Android系统的基础知识、Android系统的结构和核心框架、Java虚拟机和Dalvik虚拟机的知识、实现程序编译和调试、Dalvik的运作流程、DEX优化和安全管理、Android虚拟机生命周期管理和内存分配策略、虚拟机垃圾收集和线程管理、JNI的基本原理、JIT编译的基 本过程和具体方法,以及虚拟机中的异常管理机制方面的知识。[1]

    深入解析Android虚拟机目录

    编辑

    第1章Android系统介绍 1

    1.1Android是一款智能手机 1

    1.1.1什么是智能手机 1

    1.1.2当前主流的智能手机系统 2

    1.2Android的巨大优势 3

    1.3在电脑上启动Android虚拟机 4

    1.3.1安装AndroidSDK 4

    1.3.2安装JDK、Eclipse、

    AndroidSDK 5

    1.3.3设定AndroidSDKHome 12

    1.4Android模拟器 13

    1.4.1Android模拟器简介 14

    1.4.2模拟器和仿真机究竟有何区别 14

    1.4.3创建Android虚拟设备(AVD) 14

    1.4.4模拟器的总结 16

    1.5搭建环境过程中的常见问题 18

    1.5.1不能在线更新 18

    1.5.2显示“Projectnamemustbe

    specified”提示 20

    1.5.3Target列表中没有Target选项 21

    第2章Android系统的结构 23

    2.1Android安装文件简介 23

    2.1.1AndroidSDK目录结构 23

    2.1.2android.jar及内部结构 24

    2.1.3SDK帮助文档 25

    2.1.4解析AndroidSDK实例 26

    2.2分析Android的系统架构 26

    2.2.1Android体系结构介绍 27

    2.2.2Android工程文件结构 29

    2.2.3应用程序的生命周期 32

    2.3简析Android内核 34

    2.3.1Android继承于Linux 34

    2.3.2Android内核和Linux内核的

    区别 35

    2.4简析Android源码 37

    2.4.1获取并编译Android源码 37

    2.4.2Android对Linux的改造 38

    2.4.3为Android构建Linux的

    操作系统 39

    2.4.4分析Android源码结构 39

    2.4.5编译Android源码 44

    2.4.6运行Android源码 45

    2.5实践演练——演示两种编译Android

    程序的方法 46

    2.5.1编译NativeC的helloworld

    模块 46

    2.5.2手工编译C模块 47

    第3章虚拟机概述 51

    3.1虚拟机的作用 51

    3.2.1理解Java虚拟机 51

    3.2.2Java虚拟机的数据类型 52

    3.2.3Java虚拟机的体系结构 53

    3.2.4Java虚拟机的生命周期 58

    3.3Android虚拟机——DalvikVM 59

    3.3.1Dalvik架构 59

    3.3.2和Java虚拟机的差异 60

    3.3.3DalvikVM的主要特征 61

    3.3.4DalvikVM的代码结构 61

    3.4Dalvik控制VM详解 63

    3.5DalvikVM架构 66

    3.5.1Dalvik的进程管理 67

    3.5.2Android的初始化流程 67

    第4章编译和调试 68

    4.1Windows环境编译Dalvik 68

    4.2GDB调试Dalvik 71

    4.2.1准备工作 71

    4.2.2GDB调试C程序 72

    4.2.3GDB调试Dalvik 74

    4.3使用dexdump 75

    4.3.1dexdump的反编译功能 75

    4.3.2使用dexdump查看jar文件 76

    4.4Dalvik虚拟机编译脚本 80

    4.4.1Android.mk文件 80

    4.4.2ReconfigureDvm.mk文件 81

    4.4.3dvm.mk文件 84

    4.5Android4.0.1源码下载、模拟器编译和

    运行 85

    第5章Dalvik虚拟机的运作流程 88

    5.1Dalvik虚拟机相关的可执行程序 88

    5.1.1dalvikvm 88

    5.1.2dvz 89

    5.1.3app_process 90

    5.2Dalvik虚拟机的初始化 92

    5.2.1开始虚拟机的准备工作 92

    5.2.2初始化跟踪显示系统 93

    5.2.3初始化垃圾回收器 93

    5.2.4初始化线程列表和主线程环境

    参数 93

    5.2.5分配内部操作方法的表格内存 95

    5.2.6初始化虚拟机的指令码相关的

    内容 95

    5.2.7分配指令寄存器状态的内存 95

    5.2.8分配指令寄存器状态的内存 96

    5.2.9初始化虚拟机最基本用的

    Java库 96

    5.2.10进一步使用的Java类库

    线程类 97

    5.2.11初始化虚拟机使用的异常

    Java类库 99

    5.2.12释放字符串哈希表 100

    5.2.13初始化本地方法库的表 101

    5.2.14初始化内部本地方法 101

    5.2.15初始化JNI调用表 101

    5.2.16缓存Java类库里的反射类 104

    5.2.17最后的工作 106

    5.3启动zygote 110

    5.3.1在init.rc中配置zygote启动

    参数 111

    5.3.2启动Socket服务端口 111

    5.3.3加载preload-classes 113

    5.3.4加载preload-resources 114

    5.3.5使用folk启动新进程 115

    5.4启动SystemServer进程 116

    5.4.1启动各种系统服务线程 117

    5.4.2启动第一个Activity 119

    5.5class类文件的加载 119

    5.5.1DexFile在内存中的映射 119

    5.5.2ClassObject——Class在加载后

    的表现形式 121

    5.5.3findClassNoInit——加载Class

    并生成相应ClassObject的

    函数 122

    5.5.4加载基本类库文件 123

    5.5.5加载用户类文件 124

    5.6解释执行类 124

    5.6.1Dalvik虚拟机字节码和

    JVM字节码的区别 124

    5.6.2Davik虚拟机的解释器优化 125

    第6章dex的优化和安全管理 127

    6.1Androiddex文件优化简介 127

    6.2dex文件的格式 128

    6.2.1map_list 129

    6.2.2string_id_item 131

    6.2.3type_id_item 135

    6.2.4proto_id_item 136

    6.2.5field_id_item 137

    6.2.6method_id_item 137

    6.2.7class_def_item 138

    6.3dex文件结构 141

    6.3.1文件头(FileHeader) 142

    6.3.2魔数字段 143

    6.3.3检验码字段 143

    6.3.4SHA-1签名字段 145

    6.3.5map_off字段 146

    6.3.6string_ids_size和off字段 147

    6.4Android的DexFile接口 149

    6.4.1构造函数 149

    6.4.2公共方法 149

    6.5Dex和动态加载类机制 151

    6.5.1类加载机制 151

    6.5.2Dalvik虚拟机类加载机制 151

    6.5.3具体的实际操作 153

    6.5.4代码加密 153

    6.6Android动态加载jar和DEX 154

    6.6.1Android的动态加载 154

    6.6.2演练动态加载 154

    6.7dex文件的再优化 157

    第7章生命周期管理 158

    7.1Android程序的生命周期 158

    7.1.1进程和线程 158

    7.1.2进程的类型 159

    7.2Activity的生命周期 160

    7.2.1Activity的几种状态 160

    7.2.2分解剖析Activity 161

    7.2.3几个典型的场景 162

    7.2.4管理Activity的生命周期 163

    7.2.5Activity的实例化与启动 163

    7.2.6Activity的暂停与继续 164

    7.2.7Activity的关闭/销毁与

    重新运行 165

    7.2.8Activity的启动模式 166

    7.3Android进程与线程 166

    7.3.1进程 167

    7.3.2线程 167

    7.3.3线程安全的方法 167

    7.4测试生命周期 168

    7.5Service的生命周期 172

    7.5.1Service的基本概念和用途 172

    7.5.2Service的生命周期详解 172

    7.5.3Service与Activity通信 172

    7.6Android广播的生命周期 178

    7.7Dalvik的进程管理 180

    7.7.1Zygote 180

    7.7.2Dalvik的进程模型 191

    7.7.3Dalvik虚拟机的进程通信 196

    第8章内存分配策略 201

    8.1Java的内存分配管理 201

    8.1.1内存分配中的栈和堆 201

    8.1.2堆和栈的合作 204

    8.2运行时的数据区域 207

    8.2.1程序计数器

    (ProgramCounterRegister) 208

    8.2.2Java的虚拟机栈VMStack 209

    8.2.3本地方法栈NativeMethod

    Stack 209

    8.2.4Java堆(JavaHeap) 210

    8.2.5方法区 210

    8.2.6运行时常量池 211

    8.2.7直接内存 212

    8.3对象访问 212

    8.3.1对象访问基础 213

    8.3.2具体测试 214

    8.4内存泄漏 220

    8.4.1内存泄漏的分类 221

    8.4.2内存泄漏的定义 221

    8.4.3内存泄漏的常见问题和后果 221

    8.4.4检测内存泄漏 223

    8.5Davlik虚拟机的内存分配 223

    8.6分析Dalvik虚拟机的内存管理

    机制源码 225

    8.6.1表示堆的结构体 225

    8.6.2表示位图堆的结构体数据 226

    8.6.3HeapSource结构体 226

    8.6.4和markbits相关的结构体 227

    8.6.5结构体GcHeap 228

    8.6.6初始化垃圾回收器 230

    8.6.7初始化和Heap相关的信息 230

    8.6.8创建GcHeap 231

    8.6.9追踪位置 233

    8.6.10实现空间分配 234

    8.6.11其他模块 237

    8.7优化Dalvik虚拟机的堆内存分配 242

    8.8查看Android内存泄漏的工具

    ——MAT 243

    第9章垃圾收集 247

    9.1初探Java虚拟机中的垃圾收集 247

    9.1.1何谓垃圾收集 247

    9.1.2常见的垃圾收集策略 247

    9.1.3Java虚拟机的垃圾收集策略 249

    9.2Java虚拟机垃圾收集的算法 250

    9.2.1“标记-清除”算法 251

    9.2.2复制算法 251

    9.2.3标记-整理算法 252

    9.2.4分代收集算法 253

    9.3垃圾收集器 253

    9.3.3ParallelScavenge收集器 256

    9.3.4SerialOld收集器 256

    9.3.5ParallelOld收集器 257

    9.3.6CMS收集器 257

    9.3.7G1收集器 258

    9.3.8垃圾收集器参数总结 259

    9.4Android中的垃圾回收 260

    9.4.1sp和wp简析 260

    9.4.2详解智能指针(androidrefbase类[2]

    (sp和wp)) 262

    9.5Dalvik垃圾收集的三种算法 264

    9.5.1引用计数 264

    9.5.2MarkSweep算法 264

    9.5.3和垃圾收集算法有关的函数 266

    9.5.4在什么时候进行垃圾回收 275

    9.5.5调试信息 276

    9.6Dalvik虚拟机和Java虚拟机垃圾收集

    机制的区别 277

    第10章线程管理 279

    10.1Java中的线程机制 279

    10.1.1Java的多线程 279

    10.1.2线程的实现 280

    10.1.3线程调度 282

    10.1.4线程状态间的转换 283

    10.1.5线程安全 287

    10.1.6线程安全的实现方法 290

    10.1.7无状态类 294

    10.2Android的线程模型 296

    10.2.1Android的单线程模型 297

    10.2.2MessageQueue 297

    10.2.3AsyncTask 298

    10.3分析Android的进程通信机制 299

    10.3.1Android的进程间通信(IPC)

    机制Binder 299

    10.3.2ServiceManager是Binder

    机制的上下文管理者 301

    10.3.3分析Server和Client获得

    ServiceManager的过程 319

    第11章JNI接口 323

    11.1JNI技术基础 323

    11.1.1JNI概述 323

    11.1.2JNI带来了什么 323

    11.1.3JNI的结构 324

    11.1.4JNI的实现方式 325

    11.1.5JNI的代码实现和调用 325

    11.2JNI技术的功能 326

    11.2.1解决性能问题 326

    11.2.2解决本机平台接口调用问题 327

    11.2.3嵌入式开发应用 327

    11.3在Android中使用JNI 328

    11.3.1使用JNI的流程 328

    11.3.2使用JNI技术来进行

    二次封装 328

    11.3.3AndroidJNI使用的数据

    结构JNINativeMethod 330

    11.3.4通过JNI实现Java对

    C/C++函数的调用 331

    11.3.5调用Native(本地)方法传递

    参数并且返回结果 335

    11.3.6使用JNI调用C/C++开发的

    共享库 337

    11.3.7使用线程及回调更新UI 341

    11.3.8使用JNI实现Java与C之间

    传递数据 343

    11.4Dalvik虚拟机的JNI测试函数 348

    11.5总结Android中JNI编程的

    一些技巧 349

    11.5.1传递Java的基本类型 349

    11.5.2传递String参数 350

    11.5.3传递数组类型 351

    11.5.4二维数组和String数组 351

    第12章JIT编译 356

    12.1JIT简介 356

    12.1.1JIT概述 356

    12.1.2Java虚拟机主要的优化技术 358

    12.1.3Dalvik虚拟机中JIT的实现 359

    12.2Dalvik虚拟机对JIT的支持 359

    12.3汇编代码和改动 360

    12.3.1汇编部分代码 361

    12.3.2对C文件的改动 361

    12.4Dalvik虚拟机中的源码分析 361

    12.4.1入口文件 362

    12.4.2核心函数 373

    12.4.3编译文件 376

    12.4.4BasicBlock处理 387

    12.4.5内存初始化 388

    12.4.6对JIT源码的总结 392

    第13章异常管理 394

    13.1Java中的异常处理 394

    13.1.1认识异常 394

    13.1.2Java的异常处理机制 395

    13.1.3Java提供的异常处理类 397

    13.2处理Java异常的方式 398

    13.2.1使用try…catch处理异常 398

    13.2.2在异常中使用finally关键字 399

    13.2.3访问异常信息 399

    13.2.4抛出异常 400

    13.2.5自定义异常 401

    13.2.6Java异常处理语句的规则 402

    13.3Java虚拟机的异常处理机制 404

    13.3.1Java异常处理机制基础 404

    13.3.2COSIX虚拟机异常处理的

    设计与实现 405

    13.4分析Dalvik虚拟机异常处理的源码 409

    13.4.1初始化虚拟机使用的异常

    Java类库 409

    13.4.2抛出一个线程异常 410

    13.4.3持续抛出进程 411

    13.4.4抛出异常名 413

    13.4.5找出异常的原因 413

    13.4.6清除挂起的异常和等待

    初始化的异常 417

    13.4.7包装“现在等待”异常的

    不同例外 417

    13.4.8输出跟踪当前异常的

    错误信息 418

    13.4.9搜索和当前异常相匹配的

    方法 419

    13.4.10获取匹配的捕获块 421

    13.4.11进行堆栈跟踪 423

    13.4.12生成堆栈跟踪元素 425

    13.4.13将内容添加到堆栈跟踪

    日志中 426

    13.4.14打印输出为堆栈跟踪信息 427[2]

    词条图册

    更多图册

    参考资料

    1.

    深入解析Android虚拟机

    .清华大学出版社[引用日期2015-04-29]

    2.

    目录

    .清华大学出版社[引用日期2018-01-22]

    更多相关内容
  • 深入解析ANDROID虚拟机

    2016-04-28 08:14:30
    本书十三个章节,分别讲解了android系统基础知识,android系统的结构和核心框架,Java虚拟机和Dalvik虚拟机的知识,实现程序编译和调试,Dalvik的运作流程,DEX优化和安全管理,Android虚拟机生命周期的管理和内存...
  • 安卓虚拟机使用

    2013-06-15 22:44:13
    在WIN7上使用安卓虚拟机 让你的PC也能体验安卓
  • 安卓虚拟机Root工具

    2018-05-14 14:03:27
    这里Root安卓虚拟机主要为方便串口开发测试。作者在计划开发一款无需任何三方库完成安卓串口通讯的控件时(Delphi下一款跨平台串口通讯控件“SuperCom”),手上没有可使用的安卓设备,只能使用虚拟机完成调试。在...
  • 作者bunnyblue,源码AntiVM,关于这是一个 Android 虚拟机检测库,意在未授权的情况下禁止在虚拟机 App 上非法运行。
  • Android 虚拟机进化史

    2021-06-11 09:49:10
    Android 虚拟机进化史1. 按时间顺序开始介绍吧Dalvik or ART?Android 诞生之初 ——> 单纯的 DalvikAndroid 2.2 ——> JIT 首次登场JIT 的缺点Andorid 4.4 ——> ART 和 AOTAndroid 5.0 ——> ART 全面...

    梳理一下各个 Android 版本的 虚拟机和编译策略

    1. Dalvik or ART?

    Android 4.4 以前用的是 Dalvik 虚拟机,Android 4.4 开始引入 ART 虚拟机。

    Android 4.4 版本上两种运行时环境共存,可以相互切换。

    Android 5.0 之后,Dalvik 虚拟机被彻底丢弃,全部采用 ART。

    2. Android 诞生之初 ——> 单纯的 Dalvik

    虽然Android 平台使用 Java 语言来开发应用程序,但Android程序却不是运行在标准Java虚拟机上的。可能是为了解决移动设备上软件运行效率的问题,也可能是为了规避与Oracle公司的版权纠纷。Google为Android平台专门设计了一套虚拟机来运行Android程序,它就是 Dalvik Virtual Machine(Dalvik虚拟机)

    Dalvik 负责加载 dex/odex 文件并解析成机器码交由系统调用。

    2.1 Dalvik虚拟机概述

    Google于2007年底正式发布了Android SDK,Dalvik虚拟机也第一次进入了人们的视野。它的作者是丹·伯恩斯坦(Dan Bornstein),名字来源于他的祖先曾经居住过的名叫Dalvik的小渔村。Dalvik虚拟机作为Android平台的核心组件,拥有如下几个特点:

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

    2.2 Dalvik虚拟机与Java虚拟机的区别

    • Java虚拟机运行的是Java字节码,Dalvik虚拟机运行的是Dalvik字节码
      • Dalvik虚拟机运行的是Dalvik字节码,所有的Dalvik字节码由Java字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中
    • Dalvik可执行文件体积更小
      • dx的工具负责将Java字节码转换为Dalvik字节码。dx工具对Java类文件重新排列,消除在类文件中出现的所有冗余信息
    • Java虚拟机与Dalvik虚拟机架构不同
      • Java虚拟机基于栈架构,Dalvik虚拟机基于寄存器架构

    2.2.1 基于寄存器架构的优点

    • JVM 基于栈架构。程序在运行时虚拟机需要频繁的从栈上读取或写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费不少CPU时间,对于像手机设备资源有限的设备来说,这是相当大的一笔开销。

    • Dalvik虚拟机基于寄存器架构。数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。

    Dalvik设计之初是为了运行在嵌入式设备上,对性能要求比较高,并且对跨平台没有多大要求,因此Dalvik使用寄存器来加快代码的执行速度。

    2.2.2 为什么使用 .dex 文件

    Android SDK中有一个叫 dx 的工具负责将 Java 字节码转换为 Dalvik 字节码 --> .dex

    Android使用 Dex 文件来代替 Java 虚拟机的 class 文件,相比于 class 文件,Dex 文件有以下的改进:

    • Dalvik可执行文件体积更小
      • Dex 文件格式是专为 Dalvik 设计的一种压缩格式。所以可以简单的理解为:Dex 文件是很多 .class 文件处理后的产物,最终可以在 Android 运行时环境执行
      • 由于dx工具对常量池的压缩,使得相同的字符串、常量在DEX文件中只出现一次,从而减小了文件的体积
    • 由于生成的代码指令减少了,程序执行速度会更快一些
    • Dex文件的签名只有一份,验证也只有一次
    • dex文件有个天大的好处:可以直接用DexClassLoader类加载,这叫动态加载。于是我们只要在dex上加壳,在程序运行时脱壳,就可以规避静态反编译的风险

    2.3 为什么用 Dalvik 而不是传统的 JVM?

    Google为什么不用 JVM 来当做 android 虚拟机?原因是版权和效率问题:

    • 为了解决移动设备上软件运行效率的问题
    • 也可能是为了规避与Oracle公司的版权纠纷

    2.3.1 Dalvik 相对于 JVM 在 Android 上的优势

    • Dalvik 运行 .dex 文件,文件体积更小,执行速度更快
    • Dalvik虚拟机基于寄存器架构
      • 由于生成的代码指令减少了,程序执行速度会更快一些

    3. Android 2.2 ——> JIT 首次登场

    为了适应硬件速度的提升,Android 系统系统也在不断更新,单一的 Dalvik 虚拟机已经渐渐地满足系统的要求了,2010 年 5 月 20 日,Google 发布 Android 2.2(Froyo冻酸奶),在这个版本中,Google 在 Android 虚拟中加入了 JIT 编译器:Just-In-Time Compiler

    Dalvik 虚拟机可以看做是一个 Java VM,他负责解释dex文件为机器码,如果我们不做处理的话,每次执行代码,都需要Dalvik将dex代码翻译为微处理器指令,然后交给系统处理,这样效率不高。为了解决这个问题,Google在2.2版本添加了JIT编译器,当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行编译,经过编译后的代码,会被优化成相当精简的原生型指令码(即native code),这样在下次执行到相同逻辑的时候,速度就会更快。

    JIT(Just-in-time Compilation,即时编译),又称为动态编译,是一种通过在运行时将字节码翻译为机器码的技术,使得程序的执行速度更快

    官方宣称 JIT 的引入使得 Dalvik 的性能提升了 3~6 倍。

    3.0 JIT 编译方式

    主流的JIT包含两种字节码编译方式:

    • method方式:以函数或方法为单位进行编译。
    • trace方式:以trace为单位进行编译。

    那什么是 trace 方式呢?在函数中一般很少是顺序执行代码的,多数的代码都分成了好几条执行路径,其中函数的有些路径在实际运行过程中是很少被执行的,这部分路径被称为“冷路径”,而执行比较频繁的路径被称为“热路径”。采用传统的 method 方式会编译整个方法的代码,这会使得在“冷路径”上浪费很多编译时间,并且耗费更多的内存;

    trace方式编译则能够快速地获取“热路径”代码,使用更短的时间与更少的内存来编译代码。

    目前,Dalvik虚拟机默认采用trace方式编译代码

    3.1 JIT 优点

    • 安装速度超快 存储空间小
      • 每次应用在运行时,它实时的将一部分 dex翻译成机器码。在程序的执行过程中,更多的代码被被编译并缓存。由于 JIT 只翻译一部分代码,它消耗的更少的内存,占用的更少的物理存储空间

    3.2 JIT 的缺点

    但是 JIT 模式的缺点也不容忽视:

    • 运行时比较耗电,造成电池额外的开销
      • JIT中需要解释器,解释器解释的字节码会带来CPU和时间的消耗 由于热点代码的Monitor一直在运行,也会带来电量的损耗
    • Android SDK < 21, 安装或者升级更新之后,首次冷启动的耗时漫长
      • Multidex加载的时候会非常慢,因为Dalvik 虚拟机只能执行做过 OPT 优化的 DEX 文件,也就是我们常说的 ODEX 文件
    • 由于在Dex加载时会触发dexopt , 导致Multidex加载的时候会非常慢

    在这里插入图片描述

    3.3 Dalvik虚拟机是如何执行程序的

    Android系统的架构采用分层思想,这样的好处是拥有减少各层之间的依赖性、便于独立分发、容易收敛问题和错误等优点。

    Android系统由Linux内核、Libraries、Android Runtime、应用程序框架以及应用程序组成。

    Dalvik虚拟机属于Android运行时环境,它与一些核心库共同承担Android应用程序的运行工作
    在这里插入图片描述

    3.3.1 Android 进程如何创建出来的

    • Android系统启动加载完内核后,第一个执行的是init进程,init进程首先要做的是设备的初始化工作,然后读取init.rc文件并启动系统中的重要外部程序Zygote。
    • Zygote进程是Android所有进程的孵化器进程,它启动后会首先初始化Dalvik虚拟机,然后启动system_server并进入Zygote模式,通过socket等候命令。
    • 当执行一个Android应用程序时,system_server进程通过socket方式发送命令给Zygote,Zygote收到命令后通过fork自身创建一个Dalvik虚拟机的实例来执行应用程序的入口函数,这样一个程序就启动完成了。

    在这里插入图片描述
    Zygote提供了三种创建进程的方法:

    • fork(),创建一个Zygote进程;
    • forkAndSpecialize(),创建一个非Zygote进程;
    • forkSystemServer(),创建一个系统服务进程。

    其中,Zygote 进程可以再 fork() 出其他进程,非Zygote进程 则不能 fork 其他进程,而 系统服务进程 在终止后它的子进程也必须终止。

    3.3.2 Dalvik虚拟机执行程序流程

    当进程fork成功后,执行的工作就交给了Dalvik虚拟机。

    • Dalvik虚拟机首先通过loadClassFromDex()函数完成类的装载工作,每个类被成功解析后都会拥有一个ClassObject类型的数据结构存储在运行时环境中,虚拟机使用gDvm.loadedClasses全局哈希表来存储与查询所有装载进来的类
    • 随后,字节码验证器使用dvmVerifyCodeFlow() 函数对装入的代码进行校验
    • 接着虚拟机调用FindClass() 函数查找并装载main方法类
    • 随后调用dvmInterpret() 函数初始化解释器并执行字节码流。
      在这里插入图片描述

    4. Andorid 4.4 ——> 引入 ART 和 AOT

    2013 年 10 月 31 日,Google 发布 Android 4.4 Kitkat,带来了全新的虚拟机运行环境 ART:Android RunTime 的预览版和全新的编译策略 AOT(Ahead-of-time)

    Android Runtime (ART) 是 Android 上的应用和部分系统服务使用的托管式运行时。ART 及其前身 Dalvik 最初是专为 Android 项目打造的。作为运行时的 ART 可执行 Dalvik 可执行文件并遵循 Dex 字节码规范。

    ART 和 Dalvik 是运行 Dex 字节码的兼容运行时,因此针对 Dalvik 开发的应用也能在 ART 环境中运作。不过,Dalvik 采用的一些技术并不适用于 ART。

    需要注意的是,这时期 ART 是和 Dalvik 共存的,用户可以在两者之间进行选择(感觉怪怪的,用户可是小透明啊)

    4.1 ART 主要功能

    4.2 AOT 编译模式的特点

    • 优点 : 运行时省电 , 运行速度快
    • 缺点 :
      • 由于安装APK时触发dex2oat , 需要编译成native code , 导致安装时间过长
      • 由于dex2oat生成的文件较大 , 会占用较多的空间

    5. Android 5.0 ——> 全面使用 ART + AOT

    5.1 ART 的功能改进

    参考 Android 8.0 中的 ART 功能改进

    AOT 模式解决了应用启动和运行速度和耗电问题的同时也带来了另外两个问题:

    • 应用安装和系统升级之后的应用优化比较耗时
    • 优化后的文件会占用额外的存储空间

    在这里插入图片描述

    2014 年 10 月 16 日,Google发布Android 5.0:Lollipop,ART 全面取代 Dalvik 成为 Android 虚拟机运行环境,至此,Dalvik 退出历史舞台,AOT 也成为唯一的编译模式。

    AOT 和 JIT 的不同之处在于:

    • JIT 是在运行时进行编译,是动态编译,并且每次运行程序的时候都需要对 odex 重新进行编译
    • AOT 是静态编译,应用在安装的时候会启动 dex2oat 过程把 dex 预编译成 ELF 文件,每次运行程序的时候不用重新编译,是真正意义上的本地应用
      在这里插入图片描述

    6. Android 7.0 ——> JIT 回归

    在 Android 5.x 和 6.x 的机器上,系统每次 OTA 升级完成重启的时候都会有个应用优化的过程,这个过程就是 dex2oat 过程,这个过程比较耗时并且会占用额外的存储空间。

    2016年8月22日,Google发布Android 7.0(牛轧糖Nougat),JIT 编译器回归,形成 AOT/JIT 混合编译模式,这种混合编译模式的特点是:

    • 应用在安装的时候 dex 不会被编译
    • 应用在运行时 dex 文件先通过解析器(Interpreter)后会被直接执行(这一步骤跟 Android 2.2 - Android 4.4之前的行为一致),与此同时,热点函数(Hot Code)会被识别并被 JIT 编译后存储在 jit code cache 中并生成 profile 文件以记录热点函数的信息。
    • 手机进入 IDLE(空闲) 或者 Charging(充电) 状态的时候,系统会扫描 App 目录下的 profile 文件并执行 AOT 过程进行编译。

    可以看出,混合编译模式综合了 AOT 和 JIT 的各种优点,使得应用在安装速度加快的同时,运行速度、存储空间和耗电量等指标都得到了优化

    在这里插入图片描述

    7. 问题

    7.1 Android 7.0(Android N) 为什么安装速度更快?所需存储空间更小

    安装速度变快

    在Android N中,应用在安装时不再做编译,而是解释字节码。省去了冗长的编译时间,安装速度自然大大提升。

    这就要归功于新加入的这个 JIT/AOT 混合编译技术了。新增的JIT编译器用于对ART进行代码分析,使之可以在应用运行时,持续优化Android应用的性能。使得安装时不做编译,也能达到与安装时完整编译一样的效果。这种编译模式我们依旧同称为AOT,只不过它的含义不再是预编译,而是全时编译技术(All Of the Time compilation)

    此外,JIT的分析结果会被保存起来。当Android设备空闲或充电时,ART就会根据JIT的分析结果,将代码中的常用方法进行编译,而不常用的方法则待到需要时再编译,因而省下了部分存储空间。直观的体现就是我们安装完应用后,存储空间的占用变少了。

    应用占用空间对比

    根据实测,手机淘宝6.5.0安装完后在Android M中占用空间为171MB,而Android N中占用空间为156MB。
    王者荣耀1.17.1.23安装完后在Android M中占用空间为439MB,在Android N中占用空间为428MB。
    以下为个人推测:
    王者荣耀在两个版本中的占用空间差没有手机淘宝的大的原因,很可能是因为手游中多为常用的交互代码,而手机淘宝中大多数交互都能在web中完成,因而不常用的代码可能更多。造成了这个现象。

    总结

    Android N安装应用快,是因其在安装时只解释字节码,省去了编译所用的时间。之所以能省去编译环节,是因其加入了全新的AOT全时编译技术,使得应用执行效率保持与Android M相同甚至更好。因而ART不再编译所有代码,所以省下了部分存储空间。

    7.2 dexopt 与 dex2oat 的区别

    在这里插入图片描述
    前者针对 Dalvik 虚拟机,后者针对 Art 虚拟机。

    • dexopt 是对 dex 文件 进行 verification 和 optimization 的操作,其对 dex 文件的优化结果变成了 odex 文件,这个文件和 dex 文件很像,只是使用了一些优化操作码(譬如优化调用虚拟指令等)。

    • dex2oat 是对 dex 文件的 AOT 提前编译操作,其需要一个 dex 文件,然后对其进行编译,结果是一个本地可执行的 ELF 文件,可以直接被本地处理器执行。

    除此之外在上图还可以看到 Dalvik 虚拟机中有使用 JIT 编译器,也就是说其也能将程序运行的热点 java 字节码编译成本地 code 执行,所以其与 Art 虚拟机还是有区别的。

    Art 虚拟机的 dex2oat 是提前编译所有 dex 字节码,而 Dalvik 虚拟机只编译使用启发式检测中最频繁执行的热点字节码

    7.3 Android各版本虚拟机 dexopt 产物的区别

    5.0以下

    使用Dalvik虚拟机 , 生成 odex 文件 . Dalvik采用的是JIT编译+解释器,也就是即时编译,每次应用运行时会实时将Dex翻译成机器码.

    • 优点 : 安装速度超快 , 占用存储空间小
    • 缺点 :
      • 由于在Dex加载时会触发dexopt , 导致Multidex加载的时候会非常慢
      • 由于热点代码的Monitor一直在运行 , 解释器解释的字节码会带来CPU和时间的消耗, 会带来电量的损耗

    5.0 - 7.0

    使用ART虚拟机 , 生成 oat 文件. 在ROM OTA或者恢复出场设置后 , 会要进行 dex2oat 根据当前ROM进行重新编译生成 .oat 文件.

    • 优点 : 运行时省电 , 运行速度快
    • 缺点 :
      • 由于安装APK时触发dex2oat , 需要编译成native code , 导致安装时间过长
      • 由于dex2oat生成的文件较大 , 会占用较多的空间

    7.0 - 8.0

    使用ART虚拟机 , 但是在7.0之上 , 增加了.vdex.art 机制 , 在 ART 虚拟机再次启动/升级 , 加载 Dex/Oat 文件时 , 会减少 Dex 的校验时间 , 提升加载与运行效率

    9.0

    ART 虚拟机的基础上 , 增加了 Cdex ( Compat Dex )机制 ,

    Compiler-fileter

    在dex2oat的时候 , 会有一个目标编译类型 , 会有以下几类 , 根据时机不同dex2oat的编译方式也会不同

    • verify:只运行 DEX 代码验证。
    • quicken:运行 DEX 代码验证,并优化一些 DEX 指令,以获得更好的解译器性能。
    • speed:运行 DEX 代码验证,并对所有方法进行 AOT 编译。
    • speed-profile:运行 DEX 代码验证,并对配置文件中列出的方法进行 AOT 编译。

    8. odex、vdex、cdex、art 文件

    在这里插入图片描述

    8.0 dex

    dex(Dalvik VM Excutors)Dalvik 虚拟机执行程序,执行前需要优化

    8.1 vdex

    Android 8.0(Android O) 在 odex 的基础上又引入了 vdex 机制,目的是为了避免不必要的验证 dex 文件合法性以降低 dex2oa t时间

    因为当系统ota后,用户自己安装的应用是不会发生任何变化的,但framework代码已经发生了变化,

    所以就需要重新对这些应用也做dex2oat,所以如果有 vdex 的话,就可以省去重新校验 apkdex 文件合法性的过程,节省一部分时间

    主要目的:降低dex2oat执行耗时

    • 当系统OTA后,对于安装在data分区下的app,因为它们的apk都没有任何变化,那么在首次开机时,对于这部分app如果有vdex文件存在的话,执行dexopt时就可以直接跳过verify流程,进入compile dex的流程,从而加速首次开机速度;
    • 当app的jit profile信息变化时,background dexopt会在后台重新做dex2oat,因为有了vdex,这个时候也可以直接跳过

    原理:

    • 应用首次安装时,抽取出其中的dex文件,校验成功后,存储到一个独立的文件中,后面由于jit profile改变,或OTA等原因,而重新进行dexopt时,可以跳过dex文件校验流程

    8.2 odex

    在Android N 之前,Dalvik虚拟机执行程序 dex文件前,系统会对dex文件做优化,生成可执行文件 odex,保存到 data/dalvik-cache 目录,最后把apk文件中的dex文件删除。

    优点:

    • 减少了启动时间(省去了系统第一次启动应用时从apk文件中读取dex文件,并对dex文件做优化的过程。)和对RAM的占用(apk文件中的dex如果不删除,同一个应用就会存在两个dex文件:apk中和 data/dalvik-cache 目录下)

    • 防止第三方用户反编译系统的软件(odex文件是跟随系统环境变化的,改变环境会无法运行;而apk文件中又不包含dex文件,无法独立运行)。

    在Android O 之后,odex 是从vdex 这个文件中 提取了部分模块生成的一个新的 可执行二进制码 文件 , odex 从vdex 中提取后,vdex 的大小就减少了。

    • 第一次开机就会生成在 /system/app/<packagename>/oat/

    • 在系统运行过程中,虚拟机将其 从 /system/app 下 copy 到 /data/davilk-cache/

    • odex + vdex = apk 的全部源码 (vdex 并不是独立于odex 的文件 odex + vdex 才代表一个apk )

    8.3 .art

    odex 进行优化生成的可执行二进制码文件,主要是apk 启动的常用函数相关地址的记录,方便寻址相关; 通常会在 data/dalvik-cache/ 保存常用的jar包的相关地址记录。

    • 第一次开机不会生成在/system/app//oat/ 下,以后也不会;

    • odex 文件在运行时,虚拟机会计算函数调用频率,进行函数地址的修改, 最后在/data/davilk-cache/ 由虚拟机生成;

    • 生成art 文件后,/system/app 下的 odexvdex 会无效,即使你删除,apk也会正常运行

    • push 一个新的apk file 覆盖之前/system/app 下apk file ,会触发PKMS 扫描时下发force_dex flag ,强行生成新的vdex 文件 ,覆盖之前的vdex 文件,由于某种机制,这个新vdex 文件会copy到 /data/dalvik-cache/ 下,于是art文件也变化了。

    8.4 oat

    ART虚拟机使用的是 oat文件,oat 文件是一种Android私有 ELF文件格式,它不仅包含有从DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容。

    APK在安装的过程中,会通过 dex2oat 工具生成一个OAT文件。对于apk来说,oat文件实际上就是对odex文件的包装,即 oat=odex

    参考链接

    展开全文
  • 1、启动虚拟机 2、我的android sdk在“E:\android\android开发环境\android SDK\platform-tools”把要安装的apk复制到这个根目录(和adb.exe同文件夹)。 2、点击电脑左下角的“开始”按钮,输入cmd然后点击回车打开...
  • 长得好看的人都关注了这个严肃的公众号﹁关注就好运﹂前沿【好用的安卓虚拟机】编译:黑苹果软件 | G先生这是本公众号Mac软件的第五篇文章,作者是G先生,合作公众号《先生应用》第五篇文章,番外篇,为大家介绍一个...

    长得好看的人都关注了这个严肃的公众号

    关注就好运

    前沿

    【好用的安卓虚拟机】编译:黑苹果软件 | G先生

    这是本公众号Mac软件的第五篇文章,作者是G先生,合作公众号《先生应用》

    第五篇文章,番外篇,为大家介绍一个可以在mac中运行的安卓虚拟机。

    这种软件的意义在于使用mac运行安卓系统,并且可以使用安卓应用,其作用大多是是程序员、游戏爱好者或者临时使用应用时使用。

    无需安卓手机就可以在mac中玩安卓游戏,使用安卓应用


    本期无视频教程。

    733f40f5453807ffd3d0146da2b0c00c.png

    免费素材提供者-黑苹果软件 公众号 

    接下来是我们为大家编译整理好的 G先生亲自录制的视频 保存在百度云中下载观看

    回复黑苹果软件 “安卓虚拟机获取软件教程与所需素材

    54ddcff202d47150e3a8cfeee2a7498d.png

    免费版软件预览

    f64ca4534a644cf2efad8033fdc789da.png

    7f1e0e09e32ece15f2769f6b1ba5bc66.png


    咨询:Q-2575424851  |  T-18506474744

    微信二维码扫码添加好友设计交流

    f1dc3b74871eef4559b18dd867340ff6.png

    黑苹果软件公众号是你在使用Mac后急需寻找的第一个公众号

    长按识别二维码关注黑苹果软件 能提供给你在Mac上所有的软件硬件帮助

    836c19401b1f04ebef333ceb1980e888.png

    展开全文
  • 1、在虚拟机上我使用的是Android5.0版本,当前manifests的application标签配置如下,正确运行没问题。 2、但是放到真机上(Android 9)就会闪退,于是在application标签里面添加一行代码:android:...
  • VMware安装Android虚拟机

    千次阅读 热门讨论 2021-09-14 14:59:29
    VMware安装Android虚拟机 1、首先下载Android镜像:https://www.android-x86.org/ (那个下载速度快就选择哪一个) 2、使用VMware Workstation Pro 创建新的虚拟机。 3、安装步骤如下图文:

    1、首先下载Android镜像:https://www.android-x86.org/
    (哪个下载速度快就选择哪一个)(这里使用的ISO版本:android-x86_64-9.0-r2.iso)
    2、使用VMware Workstation Pro 创建新的虚拟机。
    3、安装步骤如下图文:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    内存设置大一点(这里是4G),其余未见步骤均直接点击下一步。
    在这里插入图片描述
    在这里插入图片描述

    以下是重点:(选中后按回车即可)

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    以下也是重点:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    系统配置步骤:

    在这里插入图片描述

    在这里插入图片描述
    等待,知道见logo界面。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    其余设置按自己的喜好配置吧。
    最后进入系统按任务栏模式显示的可见此界面:
    在这里插入图片描述
    此时并不能访问网络的,需要配置一下:
    在这里插入图片描述

    网络配置:(这里以无线网卡为例)

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    至此,所有配置均已完成。
    参考资料:https://www.bilibili.com/video/av286608678/

    展开全文
  • 本文主要讲解Android虚拟机动态调试背后涉及到的技术原理,除了JDWP协议细节,还包括任意位置断点、堆栈输出、变量值获取等基础调试功能的具体实现。另外本文提供了一款新的android动态调试工具——AVMDBG,提供调试...
  • 本书循序渐进地讲解了Android虚拟机系统的基本知识,并剖析了其整个内存系统的进程和运作流程,并对虚拟机系统优化和异常处理的知识进行了详细讲解。本书几乎涵盖了Dalvik VM系统的所有主要内容,并且讲解方法通俗...
  • android虚拟机非常深奥,这本书是市面上少有的深入解析android虚拟机的书籍,是android进阶不二的选择。
  • Android虚拟机获取root权限

    千次阅读 2021-06-05 10:48:14
    即使可以忍受,但无法解决在虚拟机里拿到root。尝试一键root工具,百度、360的root工具无法识别虚拟机,卓大师可以获取root但无法正常进行权限管理,也就达不到获得su的效果。下面是网上找到的可行方法=============...
  • 本文 「Android 路线」| 导读 —— 从零到无穷大 已收录,这里有 Android 进阶成长路线笔记 & 博客,欢迎跟着彭丑丑一起成长。(联系方式在 GitHub)目录前置知识这篇文章的内容会涉及以下前置 / 相关知识,贴心的...
  • 如何在电脑上安装一个Android虚拟机

    千次阅读 2022-02-22 14:57:16
    Android系统主要用于手机,电脑上能不能安装Android系统呢?电脑的CPU都是X86架构,而手机的CPU是ARM架构,但是Android系统也有X86架构的适配版。 首先安装VMware Workstation或Virtual Box,我使用的VMware ...
  • 年龄达到一定程度(默认15),就会晋升到老年代 如果晋升到老年代发现老年代没有足够内存存放晋升对象,触发FullGC System.gc()也会触发FullGC 一图流: Android虚拟机 Android虚拟机主要包括Dalvik(4.4默认及4.4以前)和...
  • 安卓虚拟机 选择分辨率
  • 公司要测试手机app,但没有配手机怎么办?想要刷机,怕手机变砖怎么办?...今天就给大家带来一款解决难办的问题VMOS Pro 安卓虚拟机解决上面提到的所有顾虑。。。。安装包公众号后台发送:0010,即...
  • 1.JAVA虚拟机运行的是JAVA字节码,Dalvik虚拟机运行的是Dalvik字节码 java虚拟机:JAVA->class文件 dalvik虚拟机:JAVA->class文件->Dalvik字节码->打包到dex中->DVM通过解释DEX文件来执行这些字节码...
  • 安卓虚拟机

    2014-07-25 11:33:35
    安卓虚拟机界面,页面布局,点击按钮可存入SQLite资源库,源码开发
  • Android虚拟机参数

    2021-07-05 14:05:01
    单个虚拟机可分配的最大内存256m,影响到整个系统对RAM的使用程序和程序在运行一段时间后的反应速度。 值越大,系统消耗RAM则越快,但是程序会运行的非常稳 定,尤其是游戏和视频程序的内容加载速度可以大幅度提升。...
  • JVM和Android虚拟机的区别 区别一: dvm执行的是.dex格式文件 jvm执行的是.class文件 android程序编译完之后生产.class文件,然后,dex工具会把 .class文件处理成 .dex文件,然后把资源文件和.dex文件等打包成
  • 最近工作开发环境有Windows切换到了Ubuntu,以前在Windows环境下使用Genymotion搞Android开发还蛮好用的。那么在Ubuntu环境下桌面创建Genymotion虚拟机呢,今天搞搞试试看~!~! Virtualbox 先安装虚拟机软件...
  • 我从事 Android 也有些年头了,大多时候都在跟项目,写写业务代码,很少花时间去研究关于 Android 开发基础方面的东西,时至今日我却越发明白了底层逻辑和基础知识才是进阶更加高阶 Android 开发技术以及以后发展...
  • 主要介绍了unity3d发布apk在android虚拟机中运行的详细步骤,需要的朋友可以参考下
  • Android Studio创建安卓虚拟机并测试app

    千次阅读 2022-01-16 17:08:51
    创建安卓虚拟机并输出Hello World!
  • Android虚拟机连接网络

    千次阅读 2019-10-31 14:41:46
    点击查看
  • Android的体系框架中有一部分叫做AndroidRuntime,即Android运行时环境,这个环境包括了两个部分,一个是Android的核心类库,还有一个就是Dalvik虚拟机了。Android之所以开发Dalvik虚拟机而不使用JAVA自带的JVM是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 134,179
精华内容 53,671
关键字:

安卓虚拟机

友情链接: PCB封装库.rar