登录

去注册 忘记密码?

登录

注册

去登录

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

注册

解锁回答区域

  • 扫码关注公众号
  • 发送“我爱安卓

若你登陆,将永久解锁;
若未登录,仅本机解锁。

解锁回答区域

获取注册验证码

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

Android 开发高手课 文章更新学习笔记

鸿洋   2018-11-26 15:33   收藏 我也要投递项目>>

很荣幸,大家有个机会和绍文过招了~

张绍文,tinker开源库作者,是前微信高级工程师,曾负责微信APM质量平台和DevOps的建设。也是微信官方的Android热补丁解决方案Tinker 负责人,这个项目保障了微信的数亿用户的使用,可见技术有多牛。绝对是Android开发领域里一等一的高手。

他在极客时间的《Android开发高手课》专栏已经上线,他在专栏中将自己在移动开发领域多年的经验心得,毫无保留的分享给你。

相信这个专栏一定可以帮你打破焦虑,掌握跨平台的移动开发技术能力,我已经订阅了,建议你了解一下。

订阅方式

微信扫一扫了解详情~

官方答疑群

购买后可以加入答疑群,作者也在里面,会回答大家一些问题。

WechatIMG1.jpeg

购买后发现的一些东西:

  1. 记得下载一个app,体验会好一些,当然小程序也可以,不要买了入口在哪都不清楚。
  2. 购买完成后,你可以分享给别人,别人通过你的分享购买会有奖励金。
  3. 按照每周大概是更新3期的,所以买了一定要记得坚持学。

其他人的学习笔记

课程中涉及到的demo,一定要记得学习呀!

https://github.com/AndroidAdvanceWithGeektime

张绍文,是前微信高级工程师,曾负责微信APM质量平台和DevOps的建设。也是微信官方的Android热补丁解决方案Tinker 负责人,这个项目保障了微信的数亿用户的使用,可见技术有多牛。绝对是Android开发领域里一等一的高手。

他在极客时间的《Android开发高手课》专栏已经上线,他在专栏中将自己在移动开发领域多年的经验心得,毫无保留的分享给你。

目前优惠活动已经结束,本文主要用来分享一些笔记,帮助已购买同学学习。

学习过程

更新后,发现难度比较大,很多同学反馈不适应,这里会更新一些笔记,尽量辅助大家学习。

笔记可能为内容梳理,也可以为课后题分析。

笔记作者:鸿洋和他的一些小伙伴。

第一讲

https://github.com/AndroidAdvanceWithGeektime/Chapter01


第二讲

https://github.com/AndroidAdvanceWithGeektime/Chapter02

笔记

针对课后问题Daemons finalize timed out after 10 seconds

产生原因,ReferenceQueueDaemon中对象的finalize执行时间超过10s。

一定要查看java.lang.Daemons.java类。

sdk的platform下的source里面一般有这个类,也可以远程查看

GC 流程

1. Finalizer obj gc (override finalize)
2. put ref to ReferenceQueueDaemon
3. FinalizerDaemon get ref from ReferenceQueueDaemon.poll
4. FinalizerWatchdogDaemon waitForFinalization then check 如果没有执行完成则抛出 .finalize() timed out after 10s.
  1. ReferenceQueueDaemon
  2. FinalizerDaemon 从ref queue中取对象,执行finalize();
  3. FinalizerWatchdogDaemon check对象10s内完成finalize()方法。

trick 方案1

https://github.com/AndroidAdvanceWithGeektime/Chapter02

通过反射,停掉FinalizerWatchdogDaemon!

android P无法执行。

trick 方案2

https://github.com/iamzhangweixiong/Z_Utils/blob/8546dcc7ecd69103aaad98e3dc33ca710ab77b24/app/src/main/java/com/zhangwx/z_utils/Z_Pub/FinalizerHelper.java

对使用finalize()方法的对象手动移除,反射FinalizerReference手动移除对象。

以上方案其实都不是解决问题的方案,都是规避问题,不建议使用,了解即可。

推荐读物:

  1. 提升Android下内存的使用意识和排查能力
  2. 再谈Finalizer对象--大型App中内存与性能的隐性杀手
  3. 从Daemons到finalize timed out after 10 seconds

第三讲 内存优化[上]

VSS RSS PSS USS

提到了USS,PSS,RSS,VSS 可参考:
* Android内存分析命令

一般情况VSS>=RSS>=PSS>=USS ,所以记忆起来,你可以根据与首字母谐音“vip you”!

adb shell dumpsys meminfo --package 应用包名 

内存使用不当会造成:

  1. OutOfMemoryError
  2. ANR gc频率

内存优化

  1. 需要根据当前可用内存去做优化,保证在内存有压力可回收即可,eg:软引用。
  2. 将到bitmap的像素存储

    不过这里提到bitmap的像素存储,Android是个否定到否定的过程,2.3.3(native) ,2.3-7.1(堆),8.0-(native)
    这里有更详细的解释:Android Bitmap变迁与原理解析(4.x-8.x)

不得不说给出的Object Alloc Tracker Samples是非常有价值的,不过难度较大,感兴趣的可以学习下。


第四讲 内存优化(下):内存优化这件事,应该从哪里着手?

内容上可以考虑尝试下对收敛图片库,监听 createBitmap,BitmapFactory 这里做一些监控工作,监控大尺寸图,通过弱引用,查看计算已分配但未回收图片内存等。

最值得学习的还是最后给出的 Sample,可以学习一波如何通过代码解析hprof 文件:

https://github.com/AndroidAdvanceWithGeektime/Chapter04

分析hprofile 检测相同图片。

  1. 预备一个已经存在重复bitmap的hprof文件
  2. 利用HAHA库上的MemoryMappedFileBuffer读取hrpof文件 [关键代码 new MemoryMappedFileBuffer(heapDumpFile) ]
  3. 解析生成snapshot,获取heap,这里我只获取了app heap [关键代码 snapshot.getHeaps(); heap.getName().equals("app") ]
  4. 从snapshot中根据指定class查找出所有的Classes [关键代码snapshot.findClasses(Bitmap.class.getName()) ]
  5. 从heap中获得所有的Bitmap实例instance [关键代码 clazz.getHeapInstances(heap.getId()) ]
  6. 根据instance中获取所有的属性信息Field[]
  7. 从Field[]查找出我们需要的"mWidth" "mHeight" "mBuffer"信息
  8. 通过"mBuffer"属性即可获取他们的hashcode来判断相同
  9. 最后通过instance中mNextInstanceToGcRoot获取整个引用链信息并打印

来源这个PR

非常值得尝试下。