练习Sample跑起来 | 唯鹿同学的练习手记 第2辑
下载APP
关闭
渠道合作
推荐作者
练习Sample跑起来 | 唯鹿同学的练习手记 第2辑
2019-03-05 唯鹿 来自北京
《Android开发高手课》
课程介绍
讲述:冯永吉
时长00:33大小512.08K
你好,我是唯鹿。
该项目展示了使用 PLT Hook 技术来获取 Atrace 的日志,可以学习到 systrace 的一些底层机制。
没有什么问题,项目直接可以运行起来。运行项目后点击开启 Atrace 日志,然后就可以在 Logcat 日志中查看到捕获的日志,如下:
通过 B|事件和 E|事件是成对出现的,这样就可以计算出应用执行每个事件使用的时间。那么上面的 Log 中 View 的 draw() 方法显示使用了 9ms。
这里实现方法是使用了Profilo的 PLT Hook 来 hook libc.so 的write与__write_chk方法。libc 是 C 的基础库函数,为什么要 hook 这些方法,需要我们补充 C、Linux 相关知识。
这个 Sample 是学习如何给代码加入 Trace Tag,大家可以将这个代码运用到自己的项目中,然后利用 systrace 查看结果。这就是所谓的 systrace + 函数插桩。
操作步骤:
使用 Android Studio 打开工程 Chapter07。
运行 Gradle Task :systrace-gradle-plugin:buildAndPublishToLocalMaven编译 plugin 插件。
使用 Android Studio 单独打开工程 systrace-sample-android。
编译运行 App(插桩后的 class 文件在目录Chapter07/systrace-sample-android/app/build/systrace_output/classes中查看)。
对比一下插桩效果,插桩前:
插桩后:
可以看到在方法执行前后插入了 TraceTag,这样的话beginSection方法和endSection方法之间的代码就会被追踪。
然后运行项目,打开 systrace:
最后打开生成的 test.log.html 文件就可以查看 systrace 记录:
当然,这一步我们也可以使用 SDK 中的 Monitor,效果是一样的。
使用 systrace + 函数插桩的方式,我们就可以很方便地观察每个方法的耗时,从而针对耗时的方法进行优化,尤其是 Application 的启动优化。
该项目展示了关闭掉虚拟机的 class verify 后对性能的影响。
在加载类的过程有一个 verify class 的步骤,它需要校验方法的每一个指令,是一个比较耗时的操作。这个例子就是通过 Hook 去掉 verify 这个步骤。该例子尽量在 Dalvik 下执行,在 ART 下的效果并不明显。
具体运行效果这里我就不展示了,直接运行体验就可以了。
通过复写 Application 的getSharedPreferences替换系统SharedPreferences的实现,核心的优化在于修改了 Apply 的实现,将多个 Apply 方法在内存中合并,而不是多次提交。
修改SharedPreferencesImpl的 Apply 部分如下:
这个是全面解析 SQLite 的资料,有兴趣的可以下载看看。
该项目展示了如何使用 PLT Hook 技术来获取网络请求相关信息。
通过 PLT Hook,代理 Socket 相关的几个重要函数:
可以看到我们获取到了网络请求的相关信息。
最后,我们可以通过 Connect 函数的 hook,实现很多需求,例如:
禁用应用网络访问
过滤广告 IP
禁用定位功能
使用 Java Hook 实现 Alarm、WakeLock 与 GPS 的耗电监控。
实现原理
根据老师提供的提示信息,动态代理对应的PowerManager、AlarmManager、LocationManager的mService实现,要拦截的方法在PowerManagerService、AlarmManagerService、LocationManagerService中。
实现核心代码:
写了几个调用方法去触发,通过判断对应的方法名来做堆栈信息的输出。
输出的堆栈信息如下:
当然,强大的 Studio 在 3.2 后也有了强大的耗电量分析器,同样可以监测到这些信息,如下图所示(我使用的 Studio 版本为 3.3)。
实现不足之处:
可能兼容性上不是特别完善(期待老师的标准答案)。
没有按照耗电监控的规则去做一些业务处理。
心得体会:
本身并不复杂,只是为了找到 Hook 点,看了对应的 Service 源码耗费了一些时间,对于它们的工作流程有了更深的认识。
平时也很少使用动态代理,这回查漏补缺,一次用了个爽。
这个作业前前后后用了一天时间,之前作业还有一些同学提供 PR,所以相对轻松些,但这次没有参考,走了点弯路,不过收获也是巨大的。我就不细说了,感兴趣的话可以参考我的实现。完整代码参见GitHub,仅供参考。
参考
分享给需要的人,Ta购买本课程,你将得18元
生成海报并分享
赞 1
提建议
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
上一篇
练习Sample跑起来 | 唯鹿同学的练习手记 第1辑
下一篇
练习Sample跑起来 | 唯鹿同学的练习手记 第3辑
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。