热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《深入理解AndroidJVMART》勘误及建立读者交流群的说明

缘起前几天有一位热心的刘同学给我发了个邮件,说阅读《深入理解AndroidJava虚拟机ART》一书过程中发现了多处错误。他整理了一个word文档,有图有真相,非常细心(我待会把错

缘起





前几天有一位热心的刘同学给我发了个邮件,说阅读《深入理解Android Java虚拟机ART》一书过程中发现了多处错误。他整理了一个word文档,有图有真相,非常细心(我待会把错误和修改的地方放到本文中)。错误的地方主要是拼写错误,但其中有几个错误是技术错误,比如有不正确的,有不严谨的。我仔细研读后,和刘同学就其中几个技术问题来回讨论了几次,最终还是我错了。Anyway,这个事情引发了我的一次思考。

自从出版了深入理解Android这几本书后,几乎很少和读者有过这种切磋。虽然我从《深入理解Android:Wi-Fi、NFC和GPS》一书开始邀请审稿专家,审稿专家们和我是有过密切的交流和切磋。但书出版后,就没有和读者有过交流了。

刘同学的反馈让我意识到,书的出版其实只是知识传播的第一步,并不是终结。而且,在学习的旅程,如果有个地方能让大家交流,沟通,切磋的话,效果比自己单干是要强不少的。所以,我打算就咱们深入理解Android系列做一个交流群,搭建一个平台。当然,这个平台上也可以讨论技术发展,管理方面的问题。

其实我早该如此了。我学个开车都加了不少车友学习交流群,更何况是吃高精尖技术饭的码农们呢?抱团一起变老吧smiley_2.png。交流群的二维码在下面和文末,欢迎大家把周围的读者,或者隐藏的高手(比如刘同学这样的)邀请进来。我想,这个交流平台应是一个严肃又活泼,思维自由又自律,可以沉默不语,但别人的话又能给你启发的地方吧。

640?wx_fmt=jpeg

JVM ART一书的勘误(2019/8/29)

来自刘同学的反馈以及我们讨论的结果。

注意,刘同学看的是京东电子版,下面的勘误我以原书的对应页数为标题。请各位忽略截图片中的章节号(感觉有些对不上原书)。另外,有2-3处不确定的问题,我暂时先不发上来了。

573页图10-2

640?wx_fmt=jpeg

573页图10-2这个地方有技术错误。ESP指向的地方应该存储的是ArtMethod*。而不是ArtMethod**。这个错误要搞明白还需要看一下代码。

往这个单元塞数据的地方在quick_entrypoints_x86.S中,如图所示:

640?wx_fmt=jpeg

其中:


  • REG_VAR(temp_reg)相当于得到系统中唯一的那个runtime*对象。runtime就是ART虚拟机的化身。


  • 而RUNTIME_SAVE_ALL_CALLEE_SAVE_FRAME_OFFSET的值为0(定义在asm_support.h中)


也就是说,pushl实际上将runtime[0]的值放到栈中。那么,runtime[0]是什么呢?来看runtime类的声明:

640?wx_fmt=jpeg

可以看到,Runtime对象的头部就是callee_save_methods数组,这个数组里的元素是ArtMethod*。kLastCalleeSaveType属于枚举CalleeSaveType,而我们要取的kSaveAll刚好值为0。也就是说,runtime[0]就是runtime->callee_save_methods[kSaveAll](数组的第一个元素),那么它自然就是ArtMethod*,而不是ArtMethod**了。

之所以会写错,因为我被代码中的OFFSET给迷惑了。OFFSET是偏移量的意思。我习惯性的把偏移量当做地址了,所以会理解成callee_save_methods[kSaveAll]的地址,这样的话,就变成ArtMethod**了。

730页图13-2

640?wx_fmt=jpeg

图13-2 Mainblock的描述有错误。Main block不是绑定给某个线程用的。而是所有没有绑定自己的block的线程都可以使用Main block。

243页最后一段

640?wx_fmt=jpeg

应该是物理寄存器。但我觉得从理论上倒是不必要过分强调到底是物理寄存器还是虚拟寄存器。当然,这个假设的前提条件是虚拟寄存器不能是无限多个。

180页ConnectBasicBlocks代码

640?wx_fmt=jpeg

block==nullptr的条件有两个:


  • dex_pc非基本块的起始地址


  • 还有别的情况。代码注释中叫dead code。但并未展开说明dead code 情况。


以下是有拼写错误的地方:

227页图6-35

640?wx_fmt=jpeg

HUserList写错了,应为HUseList

228页第三个列表项的倒数第一行

640?wx_fmt=jpeg

HUserListNode应为HUseListNode

229页的第二行

640?wx_fmt=jpeg

users_应为user_

243页第二行

640?wx_fmt=jpeg

268页第一段代码

640?wx_fmt=jpeg

注释中的图6-44应为图6-45

267页第二段

640?wx_fmt=jpeg

split应为spill

330页提示部分

640?wx_fmt=jpeg

incline应为inline

495页

640?wx_fmt=jpeg

ScrMapElem应该为SrcMapElem

517页代码部分

640?wx_fmt=jpeg

DeclaringCallsOffset应为DeclaringClassOffset

525页最后一行

640?wx_fmt=jpeg

JniMethodStart应为JniMethodEnd

738页最后两段代码

640?wx_fmt=jpeg

函数所在的类写反了,应为:


  • 第一个Clear是RegionSpace的,位于region_space.cc中。


  • 第二个Clear函数是Region的,位于region_space.h中


786页第二行

640?wx_fmt=jpeg

0x7014000应为0x70140000

789页提示语第二行

640?wx_fmt=jpeg

“分布”应为“分别”

790页第六行

640?wx_fmt=jpeg

由高到低应为由低到高

846页第一个提示

640?wx_fmt=jpeg

mark_sweep_应为mark_stack_。注意,这附近一共有三处同样的错误。代码中并没有mark_sweep_,只有mark_stack_

873页代码下的一段话

640?wx_fmt=jpeg

各创建了一个SpaceBitmap对象,不是三个。原文是想说一共创建了三个对象。

后继安排

文末再发一次群二维,七天有效。失效的话,以后再更新。

640?wx_fmt=jpeg

后面的安排


  • JVM ART涉及基础核心技术,难度较大。我考虑写几篇导读文章,让大家先了解ART大面上的知识,这样能大幅降低阅读的难度。


  • 读者群里大家可以一起交流。有些时候,思想碰撞碰撞一下,会学得更快更好。比如,我从刘同学的反馈里就学到不少。


关于quickjs

上期说了quickjs的事情。这一个月来一直潜心在研究,但它的难度非常大。而且,确实需要深度了解Javascript语言的各种特性。稍微了解JS的同学可能会知道,js的语言特性太多太多了。所以,单纯从quickjs的代码是无法攻破它的。我现在转而学习js语言了,越深越好。到时候有成功的话,我定会分享的——BTW,我感觉难度比ART大得多....

最后的最后


  • 我期望的结果不是朋友们从我的书、文章、博客后学会了什么知识,干成了什么,而应该是说,神农,我可是踩在你的肩膀上的喔。


  • 关于学习方面的问题,我已经讨论完了。后面这个公众号将对一些基础的技术,新技术做一些学习和分享。也欢迎你的投稿。不过,正如我在公众号“联系方式”里说的那样——郑渊洁在童话大王《智齿》里有一句话令我印象深刻,大意是“我有权保持沉默,但你说的每一句话都可能成为我灵感的源泉”。所以,影响不是单向的,很可能我从你那学到的东西更多。


640?wx_fmt=jpeg

神农和朋友们的杂文集

长按识别二维码关注我们



推荐阅读
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • Flutter 2.* 路由管理详解
    本文详细介绍了 Flutter 2.* 中的路由管理机制,包括路由的基本概念、MaterialPageRoute 的使用、Navigator 的操作方法、路由传值、命名路由及其注册、路由钩子等。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 【问题描述】给定一个单向链表,要求使用Java编程语言实现从链表尾部到头部的逆序打印功能。该功能通过利用栈的数据结构来实现,最终将结果存储在一个ArrayList中返回。具体实现步骤如下:1. 遍历链表,将每个节点的值依次压入栈中。2. 从栈中逐个弹出元素,并将其添加到ArrayList中。3. 返回包含逆序链表元素的ArrayList。这种方法充分利用了栈的后进先出特性,确保链表元素能够按照从尾到头的顺序被正确处理。 ... [详细]
  • 在本阶段的Java编程实战中,我们将深入探讨位运算的应用。具体任务是实现逻辑位运算。用户需从键盘输入一个位运算符(如AND、OR、XOR或NOT)及相应的操作数,系统将根据输入的运算符执行相应的位运算并输出结果。此练习旨在加强学员对位运算的理解和实际操作能力。 ... [详细]
  • 深入解析Android GPS机制:第五部分 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
author-avatar
白小貓貓兒是青咔咔-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有