Android开发高手课
张绍文
前微信高级工程师,Tinker负责人
立即订阅
12609 人已学习
课程目录
已完结 61 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 焦虑的移动开发者该如何破局?
免费
导读 (1讲)
导读 | 如何打造高质量的应用?
模块一 高质量开发 (25讲)
01 | 崩溃优化(上):关于“崩溃”那些事儿
02 | 崩溃优化(下):应用崩溃了,你应该如何去分析?
03 | 内存优化(上):4GB内存时代,再谈内存优化
04 | 内存优化(下):内存优化这件事,应该从哪里着手?
05 | 卡顿优化(上):你要掌握的卡顿分析方法
06 | 卡顿优化(下):如何监控应用卡顿?
06补充篇 | 卡顿优化:卡顿现场与卡顿分析
07 | 启动优化(上):从启动过程看启动速度优化
08 | 启动优化(下):优化启动速度的进阶方法
09 | I/O优化(上):开发工程师必备的I/O优化知识
10 | I/O优化(中):不同I/O方式的使用场景是什么?
11 | I/O优化(下):如何监控线上I/O操作?
12 | 存储优化(上):常见的数据存储方法有哪些?
13 | 存储优化(中):如何优化数据存储?
14 | 存储优化(下):数据库SQLite的使用和优化
15 | 网络优化(上):移动开发工程师必备的网络优化知识
16 | 网络优化(中):复杂多变的移动网络该如何优化?
17 | 网络优化(下):大数据下网络该如何监控?
18 | 耗电优化(上):从电量优化的演进看耗电分析
19 | 耗电优化(下):耗电的优化方法与线上监控
20 | UI 优化(上):UI 渲染的几个关键概念
21 | UI 优化(下):如何优化 UI 渲染?
22 | 包体积优化(上):如何减少安装包大小?
23 | 包体积优化(下):资源优化的进阶实践
24 | 想成为Android高手,你需要先搞定这三个问题
模块二 高效开发 (9讲)
25 | 如何提升组织与个人的研发效能?
26 | 关于编译,你需要了解什么?
27 | 编译插桩的三种方法:AspectJ、ASM、ReDex
28 | 大数据与AI,如何高效地测试?
29 | 从每月到每天,如何给版本发布提速?
30 | 数据评估(上):如何实现高可用的上报组件?
31 | 数据评估(下):什么是大数据平台?
32 | 线上疑难问题该如何排查和跟踪?
33 | 做一名有高度的移动开发工程师
模块三 架构演进 (9讲)
34 | 聊聊重构:优秀的架构都是演进而来的
35 | Native Hook 技术,天使还是魔鬼?
36 | 跨平台开发的现状与应用
37 | 移动开发新大陆:工作三年半,移动开发转型手游开发
38 | 移动开发新大陆:Android音视频开发
39 | 移动开发新大陆: 边缘智能计算的趋势
40 | 动态化实践,如何选择适合自己的方案?
41 | 聊聊Flutter,面对层出不穷的新技术该如何跟进?
42 | Android开发高手课学习心得
练习Sample跑起来 (8讲)
练习Sample跑起来 | 热点问题答疑第1期
练习Sample跑起来 | 热点问题答疑第2期
练习Sample跑起来 | 热点问题答疑第3期
练习Sample跑起来 | 热点问题答疑第4期
练习Sample跑起来 | ASM插桩强化练习
练习Sample跑起来 | 唯鹿同学的练习手记 第1辑
练习Sample跑起来 | 唯鹿同学的练习手记 第2辑
练习Sample跑起来 | 唯鹿同学的练习手记 第3辑
特别放送 (7讲)
Android JVM TI机制详解(内含福利彩蛋)
专栏学得苦?可能是方法没找对
专栏学得苦?可能你还需要一份配套学习书单
Native下如何获取调用栈?
聊聊Framework的学习方法
Android工程师的“面试指南”
程序员修炼之路 | 设计能力的提升途径
结束语 (1讲)
结束语 | 移动开发的今天和明天
Android开发高手课
登录|注册

11 | I/O优化(下):如何监控线上I/O操作?

张绍文 2019-01-03
通过前面的学习,相信你对 I/O 相关的基础知识有了一些认识,也了解了测量 I/O 性能的方法。
但是在实际应用中,你知道有哪些 I/O 操作是不合理的吗?我们应该如何发现代码中不合理的 I/O 操作呢?或者更进一步,我们能否在线上持续监控应用程序中 I/O 的使用呢?今天我们就一起来看看这些问题如何解决。

I/O 跟踪

在监控 I/O 操作之前,你需要先知道应用程序中究竟有哪些 I/O 操作。
我在专栏前面讲卡顿优化的中提到过,Facebook 的 Profilo 为了拿到 ftrace 的信息,使用了 PLT Hook 技术监听了“atrace_marker_fd”文件的写入。那么还有哪些方法可以实现 I/O 跟踪,而我们又应该跟踪哪些信息呢?
1. Java Hook
出于兼容性的考虑,你可能第一时间想到的方法就是插桩。但是插桩无法监控到所有的 I/O 操作,因为有大量的系统代码也同样存在 I/O 操作。
出于稳定性的考虑,我们退而求其次还可以尝试使用 Java Hook 方案。以 Android 6.0 的源码为例,FileInputStream 的整个调用流程如下。
java : FileInputStream -> IoBridge.open -> Libcore.os.open
-> BlockGuardOs.open -> Posix.open
Libcore.java中可以找到一个挺不错的 Hook 点,那就是BlockGuardOs这一个静态变量。如何可以快速找到合适的 Hook 点呢?一方面需要靠经验,但是耐心查看和分析源码是必不可少的工作。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Android开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(8)

  • Sharry
    看了 Matrix IO 监控的源码, 被其骚操作震惊了, 通过 .so 库名找到了 mmap 区的库地址, 然后 hook 函数的实现, 有趣极了

    作者回复: 这个是常用操作喔

    2019-06-21
    1
  • HI
    你好,Canary_Io源码中,检测 重复读,有这样代码
        bool RepeatReadInfo::operator==(const RepeatReadInfo &target) const {
            return target.path_ == path_
                && target.java_thread_id_ == java_thread_id_
                && target.java_stack_ == java_stack_
                && target.file_size_ == file_size_
                && target.op_size_ == op_size_;
        }
    为什么这里要检测 op_size,这个貌似代表的是当前总的buff的大小,这个值就可以代表内容是一样的吗

    作者回复: 这里不检查也是可以的,有堆栈跟size应该就ok

    2019-03-06
    1
  • gmm
    想问下 libjavacore.so、libopenjdkjvm.so、libopenjdkjvm.so 是系统的共享库,为什么 hook 修改了这些库,不会影响到其他的 APP 呢
    2019-11-26
  • 放个屁臭到了自己
    2013 年我在做 Multidex 优化的时候,发现代码中...

    老师,可以讲一下这个是如何优化的吗?
    2019-08-31
  • iniesta2014
    对大文件使用 mmap 或者 NIO 方式? 这样的话,大文件 mmap不是需要很大虚拟内存吗?

    作者回复: 相比于物理内存,虚拟内存还是比较大的。而且如果支持64位的话,虚拟内存的空间就不再是问题了

    2019-04-18
  • 木木哈
    给大佬献上膝盖
    2019-03-28
  • 小洁
    请问下,上面说到"采用 Native Hook 的监控方法性能损耗基本可以忽略",请问下在监控前和加入Native Hook 之后是通过什么方式去对比性能损耗的而且保证这个统计的准确性,这个统计本身也会是一个损耗吗

    作者回复: 之前是大家循环执行一万次,看耗时的差异

    2019-03-15
  • 绍文大佬,文章中这句话没理解:“对启动过程需要的文件,我们可以指定在安装包中不压缩”。默认打的apk包中resource、resource.arsc文件不是就是没压缩过的吗?如何指定不压缩类

    作者回复: 默认是没有压缩的,但是事实上大多数的应用为了安装包体积,都把它们压缩了

    2019-02-19
收起评论
8
返回
顶部