开发编写的 View 控件,是怎么变成屏幕上图像的?

  1. Activity 与 Window
    1. setContentView 原理
    2. Activity 窗口添加过程
  2. UI 刷新机制
    1. 发起 UI 重绘请求
    2. 执行 UI 绘制时机
    3. vsync 信号的生成
    4. vsync 信号的分发
      1. SurfaceFlinger -> DispSync
      2. DispSync -> DispSyncSource
      3. DispSyncSource -> EventThread
      4. Connection -> SurfaceFlinger
      5. Connection -> app
  3. UI 绘制流程
  4. Surface 原理
    1. Surface 创建流程
    2. Surface 的跨进程传递
    3. GraphicBufferProducer

Read More

Android 方法插桩 plugin 开发实践

在做应用启动速度优化时,需先了解启动阶段做了哪些耗时任务,分析 Application 的 attachBaseContext、onCreate 等关键方法,统计它们内部调用到的其他方法耗时。

分析要结合 systrace 工具,因为不仅要知道方法的 wall time,还要知道 cpu time,这样才能知道是否属于 cpu 密集型任务,然后针对任务类型进行调整或线程调度。

需求很清晰,在要统计的方法调用前插桩加入 TraceCompat.beginSection(),调用后加入 TraceCompat.endSection()。需求也很简单,我们可以很快的使用 aspect、javassist 或 asm 实现。

但是,这次是方法插桩 + systrace,需为此开发一个插件;下次是方法插桩 + 耗时统计,就得再开发一个插件。为什么插件一定要与插桩逻辑绑定呢?

为什么没有一款插件,只提供方法插桩能力,不写死插桩逻辑,而是由使用者自由的定制插桩逻辑呢?

基于这个痛点,我们来开发一款可自由定制插桩逻辑的插件。

Read More