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开发高手课
登录|注册

03 | 内存优化(上):4GB内存时代,再谈内存优化

张绍文 2018-12-06
在写今天这篇文章前,我又翻了翻三年前我在 WeMobileDev 公众号写过的《Android 内存优化杂谈》,今天再看,对里面的一句话更有感触:“我们并不能将内存优化中用到的所有技巧都一一说明,而且随着 Android 版本的更替,可能很多方法都会变的过时”。
三年过去了,4GB 内存的手机都变成了主流。那内存优化是不是变得不重要了?如今有哪些技巧已经淘汰,而我们又要升级什么技能呢?
今天在 4GB 内存时代下,我就再来谈谈“内存优化”这个话题。

移动设备发展

Facebook 有一个叫device-year-class的开源库,它会用年份来区分设备的性能。可以看到,2008 年的手机只有可怜的 140MB 内存,而今年的华为 Mate 20 Pro 手机的内存已经达到了 8GB。
内存看起来好像是我们都非常熟悉的概念,那请问问自己,手机内存和 PC 内存有哪什么差异呢?8GB 内存是不是就一定会比 4GB 内存更好?我想可能很多人都不一定能回答正确。
手机运行内存(RAM)其实相当于我们的 PC 中的内存,是手机中作为 App 运行过程中临时性数据暂时存储的内存介质。不过考虑到体积和功耗,手机不使用 PC 的 DDR 内存,采用的是 LPDDR RAM,全称是“低功耗双倍数据速率内存”,其中 LP 就是“Lower Power”低功耗的意思。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Android开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(69)

  • 孙鹏飞 置顶
    更新了例子,完善了操作方式,支持了x86平台的编译运行,兼容7.1到9.0的手机和模拟器,支持x86和armv7a,已经相对稳定

    作者回复: 鹏飞棒棒的!

    2018-12-07
    28
  • 任雪龙
    厉害,很厉害,但是对于普通公司的应用来说是不是用不到呢,还是说我们这些普通开发者并没有研究到这个层次。
    2018-12-06
    24
  • csdpz
    国民app的开发者知识面真是好宽广
    2018-12-06
    18
  • 奔流河
    感觉自己太菜了,看的一脸懵逼。老师 ,可以循序渐进一些吗?一开始就从底层开始 ,听不太懂啊......
    2018-12-07
    16
  • 旁友💊有伐🤔
    兴致勃勃地去把sample下载下来想要拜读一下,发现是JNI里面看的我一脸懵逼

    作者回复: 可以顺着sample去看一下hook点,为什么这样hook。然后去看看allocate 监控的源码,不一定需要看懂sample的实现

    2018-12-06
    14
  • 周迷奇
    “一张图,毁十优“,之前专门做过一段时间性能优化工作,内存就是优化的重点,除了解决内存泄漏,减少内存的申请,及时回收,减少常驻内存,精简布局外,图片也做了专项整治,依据图片所占内存大小=长×宽/(资源图片文件密度/手机屏幕密度)∧2×每个像素占用字节数的大体相关性,从这几个维度下手,各个击破,还是收获不小。当然如张老师所言,我以后会多考虑怎么提高内存的使用效率上,而不是单纯的想着怎么减小内存使用的绝对值上,涨姿势了,感谢,加油!
    2018-12-06
    9
  • 海贼凯
    做应用层久了,好多东西都没去深入研究,看了这几篇,好多都没用过,深感惭愧,不过从另一方面想,这也是一个提升自己的机会,加油努力!
    2018-12-10
    6
  • 菜而已
    能不能讲点实例,这种纯理论,让人一脸懵逼啊。
    2018-12-24
    5
  • gufan
    正是我需要的教程,感谢张老师
    2018-12-06
    5
  • 李华
    我在电脑前,你也在电脑前,我沉默,你也不说话,但你用这篇专栏嘲笑了我。
    2019-10-31
    4
  • 小鹏
    大佬,越讲越难了

    编辑回复: 高手课,本身知识点就难一些哈,如果觉得哪里吃力,可以评论区提问。

    2018-12-06
    4
  • 王洛民
    学习起来很吃力,文章好多都看不懂,现在在处理内存相关的问题,可以告知下都需要掌握哪些基础的知识吗?系统学习的,多谢多谢

    作者回复: 后面会统一的来讲

    2019-01-19
    2
  • 朱蓝天
    https://www.jianshu.com/p/f6386d33062b,这个同学写的基于线上用户的内存占用分析也很不错,对leakcanery进行了改造,并对hprof进行本地解析,在上传到服务端做聚合。
    2018-12-11
    2
  • HI
    通过查看JNI代码,学到了 JNI中CmakeList的跨模块编译,native 函数名的简写
    #define JNI_METHOD_DECL(ret_type, method_name) \
         extern "C" JNIEXPORT ret_type JNICALL Java_##com_dodola_alloctrack##_##AllocTracker##_##method_name

    以及 Substrate,fbjni ,ndk_dlopen 库的使用,对于源码中的Substrate 库的编译是自己从源码中抽取出来的,貌似没有在github上面看到
    2018-12-10
    2
  • 镜像
    说一下今天作业的遇到的问题和解决,希望可以帮助到大家。
    1.界面中的输出内存DUMP到日志,说的是把日志写入到Logcat的中并不是输入。
    2.java代码中 new File(Environment.getExternalStorageDirectory(), "crashDump"); 是日志输出的文字,我们看Logcat中 saveARTAllocationData write file to XXXX 就能找到对应的日志文件,和git上说的路径可能不一致。
    3.评论中有同学说看不到日志的输出。代码中 【tracker.initForArt(BuildConfig.VERSION_CODE, 5000);//从 start 开始触发到5000的数据就 dump 到文件中】 有说明开始后到达5000的数据才会写入文件。 大家设备内存情况不一样,GC回收的频率也不一致,在你不停生产1000个对象的时候,GC不断的跟随回收,导致无法达到 5000的数据量,所以一直没有日志的写入。 可以尝试修改对象的创建数量改成10000。
       
    2019-05-07
    1
  • android 4.4.2手机 点击开始记录就crash,无法生成dump日志,利用第一课的native crash定位方式,报错位置是NDK14提供的库函数,换成NDK17还是库函数问题。使用android8.0手机成功。
    2018-12-29
    1
  • $$$
    老师好,adb shell kill -S QUIT PID 这个命令,执行了一下,有几点实践记录如下:
    1、其中“-S”文中是大写,实际执行是小写才行“-s”,查看adb shell kill的命令帮助如下:
    usage: kill [-s signame | -signum | -signame] { job | pid | pgrp } ...
            kill -l [exit_status ...]
    2、我用了一台 小米5 Android 7.0 一台 三星S8 Android 8.0 和一台华为荣耀3 Android 4.4.2 没root的三台机器执行这个命令会提示kill: PID : Operation not permitted;
    3、用了一个模拟器执行就可以

    作者回复: 这个其实也可以在代码中给自己发信号,这样就没有权限问题。

    可以看第六篇的补充篇

    2018-12-19
    1
  • 无知
    这是第三个了,没有一个能跑起来的。各种懵呀。

    作者回复: 可以看一下后面的例子答疑

    2018-12-14
    1
  • 的的喀喀湖
    谢谢老师,之前把理论基础过了一遍,一直不知道怎么实操,看完之后有了新的思路实操了
    2018-12-08
    1
  • elephant
    fresco 在5.0上废弃了ashmem是因为考虑了兼容性问题,java bitmap频繁创建造成抖动,以及5.0以上GC的优化,这些方面才废弃掉的么?

    作者回复: 应该是5.0以前那个实现方法已经走不通了,文中提到的方法跟ashmen不一样的

    2018-12-07
    1
收起评论
69
返回
顶部