精华内容
下载资源
问答
  • 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

    参考链接

    展开全文
  • Android虚拟机参数

    2021-07-05 14:05:01
    每个应用程序最大内存可分配到128m,超过就会出现OOM崩溃。 [dalvik.vm.heapsize]: [256m] 单个虚拟机可分配的最大内存256m,影响到整个系统对RAM的使用程序和程序在运行一段时间后的反应速度。 值越大,系统消耗RAM...

    [dalvik.vm.heapgrowthlimit]: [128m]  
    每个应用程序最大内存可分配到128m,超过就会出现OOM崩溃。

    [dalvik.vm.heapsize]: [256m]
    单个虚拟机可分配的最大内存256m,影响到整个系统对RAM的使用程序和程序在运行一段时间后的反应速度。
    值越大,系统消耗RAM则越快,但是程序会运行的非常稳 定,尤其是游戏和视频程序的内容加载速度可以大幅度提升。
    值越小,系统的RAM剩余则越多,但是程序会很卡,尤其是游戏在切换场景Loading的时候会 花费很多的时间。
    若应用程序需要使用超过这个值的内存时,将会触发系统的垃圾收集器,系统和程序就会卡顿。

    [dalvik.vm.heapstartsize]: [16m]
    表示应用程序启动后为其分配的初始大小为16M,影响到整个系统对RAM的使用程度和第一次使用应用程序时的流畅程序。
    值越大,系统消耗RAM则越快,但是应用程序打开后的反应也越快。
    值越小,系统的RAM剩余则越多,但是程序在启动后会比较慢。

    [dalvik.vm.heaptargetutilization]: [0.75]
    可以设定内存利用率的百分比,当实际的利用率偏离这个百分比的时候,虚拟机会在GC的时候调整堆内存大小,让实际占用率向个百分比靠拢。

    展开全文
  • 说实话,我其实很少使用 Android Studio 自带的 Emulator 。一来巨慢(电脑太渣),二来 IDE 全屏...你可以在 IDE 内部直接运行 Emulator,而不再是一个单独的应用了。来一张官网上的图片给你感受一下。不得不说,Andr...

    说实话,我其实很少使用 Android Studio 自带的 Emulator 。一来巨慢(电脑太渣),二来 IDE 全屏的时候不能直接查看,还得快捷键切来切去,甚是麻烦。

    在最新的 Android Studio 4.1 Canary 8 中,直接内置了 Emulator 。你可以在 IDE 内部直接运行 Emulator,而不再是一个单独的应用了。来一张官网上的图片给你感受一下。

    b79e90cb270b80a19f237bace06639a2.png

    不得不说,Android Studio 团队最近可谓诚意满满,之前刚刚放出了 Database Inspector 功能。我在之前的推文 数据库还可以这么查看 中也介绍过。

    另外,最新的 Database Inspector 已经支持了 Live Update 功能,当你在应用中对数据库数据进行改变时,视图工具中会自动展示数据修改,而不用再手动刷新了。

    下面简单介绍一下 内置 Emulator 的使用方法。

    使用方式

    File > Settings > Tools > Emulator (or Android Studio > Preferences > Tools > Emulator on macOS)

    692c24e03f835b8bffcac05bb99849e6.png

    勾选右侧的 Launch in a Tool Window 。

    然后和往常一样运行应用就可以了。你可以先通过 AVD Manager 开启虚拟机,或者指定虚拟机直接运行 App 。

    限制

    内置虚拟机支持的扩展功能很少,目前只有关机、音量、屏幕旋转、返回键、Home 键、截图等。如果你的应用强烈依赖各种扩展功能,还是使用之前的方式吧。

    体验

    我在我的开源项目 Wanandroid 上体验了一把,大概就长这样。

    4ce437eb69d918226442f2036415cf45.png

    恩,真香。

    我还是使用真机吧。逃~

    题外话

    不知道你有没有运行过我之前版本的 Wanandroid,丑的我自己都不忍直视。在最新一次提交中,我升级到了 MDC 1.1.0,就是这个东西:

    implementation ‘com.google.android.material:material:1.1.0’

    复制代码

    MDC 1.1.0 带来了 Material Theming,新的组件,暗黑模式支持等等。我将原本应用中的 AppCompat 系主题替换成了 MaterialComponents 系,并替换了一部分组件,不得不说,的确美观了很多。大家也可以尝试一下。

    具体修改可查看我的最近一次提交:

    https://github.com/lulululbj/wanandroid/commit/fc900ab20b07c2bf4b266fae4ab931f1c6aef01e

    官方也有一篇文章专门介绍了 MDC ,地址如下:

    https://medium.com/androiddevelopers/migrating-to-material-components-for-android-ec6757795351

    今天的文章就到这里了,我是一直坚持原创的秉心说,更多最新 Android 动态,扫码关注我的公众号吧 !

    本文使用 mdnice 排版

    展开全文
  • Android虚拟机Monitor一个设备并且显示在你的开发计算机上。它可以允许你在不适用硬件设备的情况下开发、测试你的Android应用。虚拟机支持Android手机,Android Wear和平板和Android TV设备。因为它有一些预定义的...

    Android虚拟机Monitor一个设备并且显示在你的开发计算机上。它可以允许你在不适用硬件设备的情况下开发、测试你的Android应用。虚拟机支持Android手机,Android Wear和平板和Android TV设备。因为它有一些预定义的设备类型,所以你可以迅速的启动,同样你可以创建你自己的设备。

    虚拟机是一个快速、强大和多功能。它比一个连接的物理设备更快的传递信息,提升开发进程。

    326480c031927acec4cb4108b6d7848c.png

    关于Android虚拟机

    当你运行你的项目的时候可以在虚拟机中运行你的项目,或者直接拖动一个APK到虚拟机中安装。就像在一个物理设备中一样,你在虚拟设备中安装了一个app之后,它会保留直到卸载或者替换。

    Android虚拟机特性预览

    Android虚拟机配置

    虚拟机用Android Virtual Device(AVD)来决定外观、功能和虚拟设备的系统镜像。AVD允许你定义多个虚拟设备。

    每个AVD可以视为单独的设备,有它用户数据、SD卡等等。当你通过AVD配置运行虚拟机,它会自动从AVD目录自动载入用户数据和SD卡数据。默认情况下,虚拟机将用户数据,SD卡数据和缓存保存在AVD目录下。

    系统镜像

    Android虚拟机运行了一个完整的Android系统栈,从最底层的内核,到一些预装的应用。在你创建AVD的时候,你可以选择你需要的Android镜像版本。

    依赖和先决条件

    Android虚拟机需要以下先决条件:

    1、 Android Studio 2.0或更高

    2、 SDK Tools 25.0.10 或更高

    不支持

    Android虚拟机支持一个设备的大部分特性,但是不包括以下这些:

    1、 WiFi

    2、 Bluetooth

    3、 NFC

    4、 SD卡

    5、 设备连接耳机

    6、 USB

    在Android虚拟机中运行APP

    在可以在一个Android Studio项目中运行一个app。或者,你可以直接运行安装在虚拟机中的app。以下方式打开虚拟机:

    1、 打开Android Studio ,选择Run

    然后出现Select Deployment Target对话框

    80e584e0cbed179b0cabe066a0819edf.png

    2、 在Select Deployment Target对话框,选择一个已经存在的虚拟机,点击OK

    3、 在你的虚拟机中测试你的app。

    本文作者:宋志辉

    个人微博:点击进入

    展开全文
  • Android 虚拟机与类加载机制 虚拟机 JVM虚拟机 是Java中的虚拟机它的指令集是基于堆栈的,运行的是每一个.class Dalvik虚拟机Android中的虚拟机它的指令集是基于寄存器,运行的是所有java字节码通过dx打包...
  • Android里的虚拟机

    2021-01-14 23:45:08
    二、jvm和Android虚拟机 总结 1.1.1Jvm,Dalvik与Art三者之间的区别 1.2.1那dex和class到底在结构上的区别 1.4.1 Android虚拟机中寄存器起什么作用,与栈的区别在哪里(又或者基于栈与基于寄存器的架构,谁更快?) ...
  • JVM与Android虚拟机解析

    2021-04-20 21:11:52
    于是我在膜拜之余也四方打探,决定从java字节码指令集和dalvik虚拟机的arm指令集入手,虽然后来由于非安全领域专业人员,就放弃了,不过对于技术来说,研究的价值不可遗失,遂成此博客。 当然本篇博客只会分析Java...
  • Android虚拟机

    2021-09-29 14:21:39
    Android应用程序运行在Dalvik/ART虚拟机,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。Dalvik虚拟机实则也算是一个Java虚拟机,只不过它执行的不是class文件,而是dex文件。Dalvik虚拟机的指令集是基于...
  • 1. 新建或者2. 按图中的步骤,选择一款设备,建议选择分辨率小的,不占内存3. 按图4. 按图5. 点击finish后,选择之前下载的虚拟机,点next6....错误1新建一个Android项目,选择一个虚拟机运行Android项目...
  • 我测试了这一点,它抛出内存溢出(VM不能让为这个应用程序分配超过5 MB)设备(例如烧火)最大= 64 MB,总= 5MB免费2.3 MB和,如果我使用更多然后5 MB(总存储器)VM力接近上 。 是否有可能增加VM堆大小MaxMemory...
  • 在CentOS64位系统中,建立android虚拟机时是不会报错的,但是当你Launch这个虚拟机就会出现以下错误:Starting emulator for AVD 'android'Failed to start emulator: Cannot run program "/home/Kevin/Android/adt-...
  • 为什么Android虚拟机比iOS和WP7的虚拟机要慢很多呢?原因如下:1. Android 模拟器的目标体系结构是ARM (arm-eabi),而 iOS 和 WP7 的模拟器的目标体系结构都是 x86 的,另外 iOS 的模拟器中运行的 App 也是编译为 ...
  • 深入解析Android虚拟机

    2021-06-07 13:14:12
    深入解析Android虚拟机编辑锁定讨论上传视频《深入解析Android虚拟机》是2014年由清华大学出版社出版的图书,作者是张子言。书名深入解析Android虚拟机作者张子言ISBN9787302344087定价49.50元出版社清华大学出版社...
  • Android虚拟机参数说明

    2021-06-03 04:52:03
    ART的比较复杂,这里分析dalvik虚拟的的参数,和art参数的概念是一致的-xms: 虚拟机堆的起始大小,启动时申请的堆内存大小 prop:dalvik.vm.heapstartsize指定-xmx: 虚拟机堆使用的虚拟内存最大大小 ...
  • 可以使用 adb push 命令从本机复制文件到设备中,使用adb pull 命令从设备复制文件到本机中首先要通过命令行进入 android sdk目录下的platform-tools目录例如我的是在这里: 使用命令行切换到adb所在目录切换到这个...
  • ART的比较复杂,这里分析dalvik虚拟的的参数,和art参数的概念是一致的-xms: 虚拟机堆的起始大小,启动时申请的堆内存大小 prop:dalvik.vm.heapstartsize指定-xmx: 虚拟机堆使用的虚拟内存最大大小 ...
  • 源自:9-2 使用ToggleButton按钮实现开关效果为什么我的在虚拟机运行后出现应用程序停止运行package com.example.sss;import com.example.android4_0.R;import android.app.Activity;import android.os.Bundle;...
  • 突然间发现C盘 空间占用量增加了很多,经过找寻原因之后发现是因为安装了虚拟机的原因:在Android Studio中安装运行虚拟机时,默认的安装路径一般都在C盘,对于我这种不喜欢C盘存储太满的人来说是一种折磨,所以将其...
  • 本文「Android 路线」| 导读 —— 从零到无穷大 已收录。这里有 Android 进阶成长路线笔记 & 博客,欢迎跟着彭丑丑一起成长。(联系方式在 GitHub)目录前置知识1. Java 类加载的委派模型Java 类加载是一种委托...
  • 很多用户喜欢通过虚拟机在Windows上运行Android系统,其中著名的虚拟机Android-X86已经更新至4.4稳定版,感兴趣的用户可以访问其网站下载虽然现在新推出的英特尔平板芯片,很多都可以支持Android/Windows 8.1双系统...
  • 本文将介绍在 VirtualBox 虚拟机下以图解教程的方式来安装 Android-x86系统,Android 是基于 Linux 内核的操作系统,因此,很多操作方面和安装 Linux 相类似。下面对安装过程一一解说。背景如果你正在开发 Android ...
  • 我们知道的虚拟机有很多,运行Java的JVM虚拟机,运行Android程序的Davlik和Art虚拟机,运行C#的CLR虚拟机,那么什么是虚拟机呢,虚拟机的作用又是什么呢?运行JavaScript的v8引擎或者运行Python的引擎是否也是虚拟机...
  • 1、把Android sdk platform-tools目录下的adb程序加入到path环境变量,默认情况下是其路径是: C:/Users/ [User]/AppData/Local/Android/SDK/platform-tools 2、把VirtualBox虚拟机的网络相关的一些东西配置好,...
  • Android虚拟机(面试)

    2021-11-26 15:38:42
    java平台的虚拟机我们称为JVM,而Android虚拟机有两个版本,一个是Dalvik,一个是Art;那么JVM和Dalvik,Art有什么区别呢?我们来看一副图 显而易见,两种虚拟机都要把java文件编译成.class文件,不同的是,JVM会...
  • 架构原因安卓并不能很方便的在普通电脑上运行,于是有个国外团队专门移植也就是Androidx86项目。这里提到的Androidx86项目指的是谷歌...另外对于用户来说直接电脑上Androidx86也不太现实,所以想体验的话使用虚拟机...
  • Android虚拟机Monitor一个设备并且显示在你的开发计算机上。它可以允许你在不适用硬件设备的情况下开发、测试你的Android应用。虚拟机支持Android手机,Android Wear和平板和Android TV设备。因为它有一些预定义的...
  • 早前android给人的印象是卡,慢,无;但是从6.0依赖的手机似乎人们不再提android的这些诟病了,无非来一句“不高端”。知道什么原因吗?有同学说,android一个劲的提升内存,和CPU的升级,但这只是其中的表象,为...
  • Eclipse下的Android虚拟机,运行应用,正常的控制台信息Console一般如下01.[2012-02-17 15:01:28 - tmall] ------------------------------02.[2012-02-17 15:01:28 - tmall] Android Launch!03.[2012-02-17 15:01:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 87,165
精华内容 34,866
关键字:

安卓虚拟机应用