Article / 2026/05/31
性能优化 (三十八) 如何实现界面秒开
性能优化 (三十八) 如何实现界面秒开 的技术笔记。
如何实现界面秒开
- 界面秒开就是一个小的启动优化
- sysTrace,优雅异步+优雅延迟初始化
- 异步Inflate、X2C、绘制优化
- 提前获取页面数据
- 界面秒开率统计
- onCreate到onWindowFocusChanged
- 特定接口
Lancet
-
轻量级Android AOP框架
-
编译速度快,支持增量编译
-
API简单,没有任何多余代码插入apk
-
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。