1.2.3 准备模拟器和自制系统镜像

阅读源码是学习虚拟机的主要方法。但在某些关键地方,有时候很难确定代码逻辑的走向,这时就需要在源码中加一些日志来辅助我们观察虚拟机的行为。在此,笔者推荐使用模拟器和自制系统镜像来帮助我们达到这个目标。

自制系统镜像是由上文下载的Android源码文件编译而来。我们可以随心所欲地通过修改源码文件来定制Android系统。当然,这个由我们自己编译而来的系统只能跑在模拟器中。即便如此,这对我们学习ART虚拟机来说也是莫大的帮助。

1.2.3.1 准备好模拟器

读者需首先安装Android Studio。然后随便打开一个Android应用工程。单击菜单栏右边的avd manager图标,启动AVD界面,如图1-5所示。

图1-5 AVD界面

图1-5中,笔者创建了两个虚拟设备,一个是运行Android 7.0系统的innost-7.0设备,一个是运行Android 9.0系统的innost-9.0设备。

单击图1-6中左下角的“Create Virtual Device”,出现图1-6所示的设备硬件配置界面。

图1-6 设备硬件配置界面

读者可自定义硬件配置或者从谷歌相关手机产品中选一个手机型号。比如Pixel XL。然后单击图1-6右下角的Next。出现图1-7所示的系统镜像选择界面。

图1-7 系统镜像选择界面

建议读者选择Nougat x86系统镜像。也就是说,我们后面要分析的ART虚拟机将以x86 CPU为平台。

为什么选择x86平台?

工作用的台式机或笔记本主要是x86平台。所以,模拟器运行x86系统镜像的速度非常快。笔者之前尝试过使用arm平台,但模拟器运行的速度较慢。另外,根据上一节笔者统计的代码量可知,6个CPU平台总汇编代码的有效代码行数/总有效代码行数大概为6.02%,平均每个CPU平台的汇编代码行数才占总代码行数的1%左右。从这一点可以看出,汇编代码虽然重要,但它不会影响虚拟机学习。值得注意的是,Android SDK从8.0开始就不再提供ARM平台的模拟器镜像文件。

虚拟设备准备就绪后,读者可以启动它。这时,这个虚拟设备运行的是官方提供的镜像。

1.2.3.2 自制系统镜像

现在,我们有了Android源码、虚拟设备和官方下载的镜像文件。接下来需要编译Android源码以生成一个系统镜像文件,然后用这个系统镜像文件来启动虚拟设备。如此,就达到了让虚拟设备运行我们定制的系统镜像的目标。

编译系统的步骤如下。

[自制系统镜像]

cd android-7.0  #进入源码目录

. build/envsetup.sh #初始化AOSP编译环境

lunch  #选择编译目标,执行后的结果如图1-8所示

执行lunch命令后,会显示如图1-8所示的内容,里边是各种不同的目标设备。请读者选择第8项(下面将介绍第8项的来历)。它表示要编译设备类型为"innost"的设备,该设备使用的CPU为x86,编译类型为userdebug。接着看下一步。

[自制系统镜像]

#执行下面的命令

make systemimage #编译系统镜像

#最终生成的系统镜像文件路径为

#out/target/product/innost_x86/system.img  #这就是我们编译得到的系统镜像

最后,让模拟器使用我们编译得到的系统镜像文件,方法如下。

#当前在android-7.0目录下。假设android sdk位于

#~/workspace/android/android-aosp-sdk中,下面的命令将启动emulator,其中:

#-avd参数用于指明虚拟设备名,参考图1-4,我们选择的是innost-7.0这个虚拟设备

#-system参数指明系统镜像的路径,我们使用自己编译得到的系统镜像文件

~/workspace/android/android-aosp-sdk/tools/emulator \

-avd innost-7.0 -nojni -writable-system \

-system `pwd`/out/target/product/innost_x86/system.img

由于本书的目标是研究ART虚拟机,所以,我们自己编译的系统镜像并不需要包含太多的应用程序,只要保证系统启动必需的几个核心应用程序即可。为此,笔者在源码根目录/device下新增了一个名为innost的设备类型。图1-9展示了该目录下的文件。

图1-9展示了innost设备类型下包含的文件。当把这些准备好后,我们执行如下命令时才能出现图1-8中的第7和第8项。

. build/envsetup.sh

lunch  #将出现图1-7中的innost设备

读者可从笔者分享的链接中下载如图1-9所示的innost设备目录文件。本书所有资源的下载说明见1.4节的内容。

如果读者下载了笔者分享的Android 7.0源码的话,device目录下已经包含了innost设备目录的文件。

自制java虚拟机_《深入理解Android:Java虚拟机ART》 —1.2.3 准备模拟器和自制系统镜像...相关推荐

  1. 深入理解Android Java虚拟机ART相关及勘误

    公众号: 神农和朋友们的杂文集 目录 本书的简单介绍 本书各章的难度评估 深入学习有什么好处? 本书勘误表 P14 P21 本书的简单介绍 <深入理解Android Java虚拟机ART> ...

  2. vilatile 深入理解java虚拟机_深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)...

    本套课程从虚拟机的发展历史,虚拟机的内存结构,对象的分配与回收以及字节码,类加载等多个方面深入地对Java虚拟机进行了剖析.内容详实,语言通俗易懂.理论结合实践,让学习本套视频的朋友可以更快的理解虚拟 ...

  3. 鸿蒙用java虚拟机_鸿蒙运行Android应用的时候还会有JVM虚拟机?

    楼上全部都在一本正经的胡说八道.类java语法不是java这个都不懂吗?包含google在内,只是长得像java结构类似,而不是java也没有所谓的java虚拟机,而是完全自己的 dalvik和jvm ...

  4. java中view是什么_深入理解Android中View

    文章目录 [隐藏] 这回我们是深入到View内部,去研究View,去了解View的工作,抛弃其他因素,以便为以后能灵活的使用自定义空间打下一定的基础.希望有志同道合的朋友一起来探讨,深入Android ...

  5. Java继承_深入理解Java继承、封装、多态的实现原理

    点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 作者:黄小斜 文章来源:微信公众号[Java技术江湖] 目录 从JVM结构开始谈多 ...

  6. 常用的java虚拟机_带你了解 JAVA虚拟机 面试必备

    Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途.创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有 些区域则是依赖 ...

  7. java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!

    点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! ​ 在介绍本书单之前,我想先问一下各位读者,你们之前对于Java并发编程的了解有多少呢.经过了1 ...

  8. java 汇编_大话+图说:Java 汇编指令——只为让你懂

    原标题:大话+图说:Java 汇编指令--只为让你懂 前言 随着Android开发技术不断被推到新的高度,对于Android程序员来讲越来越需要具备一些对深入的基础性的技术的理解,比如说Java汇编指 ...

  9. 一个上帝视角的java游戏_从上帝视角看Java如何运行

    JVM内存结构 可以看出JVM从宏观上可以分为 '内部' 及 '外部'  两个部分(便于记忆理解): '内部'包含:线程共享(公有)数据区 和 线程隔离(私有)数据区 '外部'包含:类加载子系统.垃圾 ...

  10. 阿里java面_我的后端Java面经、八面阿里,已拿offer!

    阿里巴巴面试自我介绍 讲一个项目,我说的区块链,然后围绕着区块链说了一堆,比如说我没回答上来的,有没有做性能测试,还有orderer节点都有什么服务 最大堆概念 排序算法比较排序时间复杂度,如何查找最 ...

最新文章

  1. spring + Quartz定时任务配置
  2. WCF第一个Demo
  3. 在LINUX下架设防火墙
  4. UI设计实用素材|寻找一种新的方法来设计网站,单页网站
  5. Qt学习笔记常用容器
  6. JavaScript基础知识。
  7. 【SpringBoot_ANNOTATIONS】组件注册 05 @Lazy 懒加载
  8. android studio for android learning (十三) 一个简单的图片查看器示例
  9. kali linux怎么装软件,linux安装软件的几种方式(kali平台)和一些实用的软件(持续更新)...
  10. tf卡加卡套的区别_tf卡,详细教您TF卡与SD卡有什么区别
  11. 【华人学者风采】周明 微软亚洲研究院
  12. 2021高考倒计时HTML源码,2021高考倒计时
  13. html鼠标放大镜效果,CSS3实现鼠标放大镜和放小镜的效果
  14. 【哔哩哔哩笔试】顺时针打印数字矩阵
  15. 做服务号还是订阅号?
  16. 每日一题:由棋盘放麦子引出Java的BigInteger
  17. FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)
  18. 魔兽怀旧服服务器怎么修改,《魔兽世界怀旧服》转服功能怎么用 转服功能使用方法教程...
  19. windows下git bash 添加zip命令功能
  20. 支持谷歌Android Market,Nexus 7第二代支持谷歌Android Market吗

热门文章

  1. [ 2204听力 ] 一
  2. eclipse如何配置工作环境
  3. 如何改typecho主题头像_细节决定成败,抖音昵称、头像、简介、视频封面的重要性...
  4. 深度学习(Python)-- 神经网络的数学构建块
  5. 3d效果技术java,java3D技术展示
  6. 推荐系统学习之评测指标
  7. 车载DSP音频项目研究开发技术的深化
  8. 微信营销与博客营销的区别
  9. Postman 都有女朋友了,我特么竟然还单身
  10. C语言练习---杨辉三角