Article / 2026/05/31

性能优化 (三十八) 如何实现界面秒开

性能优化 (三十八) 如何实现界面秒开 的技术笔记。

如何实现界面秒开

  • 界面秒开就是一个小的启动优化
  • sysTrace,优雅异步+优雅延迟初始化
  • 异步Inflate、X2C、绘制优化
  • 提前获取页面数据
  • 界面秒开率统计
  • onCreate到onWindowFocusChanged
  • 特定接口

Lancet

  • 轻量级Android AOP框架

  • 编译速度快,支持增量编译

  • API简单,没有任何多余代码插入apk

  • https://github.com/eleme/lancet

  • lancet

  • @Proxy 通常用与对系统API调用的Hook

  • @Insert 常用于操作APP与library的类

public static ActivityRecord sActivityRecord;

static {
   sActivityRecord=new ActivityRecord();
}

//mayCreateSuper 的含义:如果这个类中没有这个方法时则创建一个
@Insert("onCreate",mayCreateSuper = true)
//后面的scope声明这个类的子类或者只有他自己
@TargetClass("android.support.v7.app.AppCompatActivity",scope = Scope.All)
//Activity 的原有的方法
protected void onCreate(Bundle savedInstanceState){
   sActivityRecord.mOnCreateTime = System.currentTimeMillis();
   Origin.callVoid();
}

@Insert("onWindowFocusChanged",mayCreateSuper = true)
//后面的scope声明这个类的子类或者只有他自己
@TargetClass("android.support.v7.app.AppCompatActivity",scope = Scope.All)
//Activity 的原有的方法
protected void onWindowFocusChanged(boolean hasFocus){
     sActivityRecord.mOnWindowsFocusChangedTime = System.currentTimeMillis();
     LogUtils.i("onWindowsFocusChanged cost " + ( sActivityRecord.mOnWindowsFocusChangedTime - sActivityRecord.mOnCreateTime))
   Origin.callVoid();
}

//声明方法的名字
@Proxy("i")
//声明目标类的路径
@TargetClass("android.util.Log")
public static int i(String tag,String msg){
  msg=msg+"ActivityHooker"
   //返回原有方法的返回值
   return (int)Origin.call();
}


public  class  ActivityRecord{

public static  int mOnCreateTime;

public static  int mOnWindowsFocusChangedTime;

}

界面秒开监控纬度

  • 总体耗时
  • 生命周期耗时
  • 生命周期间隔耗时

Giscus 未启用:请在 src/site.config.ts 中配置 repoId 与 categoryId。