在Android运用开发中,功用优化是一个至关重要的方面。其中,布局烘托的功用直接影响用户体会,特别是在一些杂乱页面中,布局烘托的耗时可能会导致界面卡顿,影响用户体会。因此,为了更好地监测布局烘托的耗时,咱们需求一种可靠的完结计划。本文将介绍三种针对Android布局耗时监测的完结计划,协助开发者及时发现并处理布局功用问题。

介绍

布局烘托的耗时是指从布局文件加载到界面显示完结所花费的时刻。一般,咱们运用开发者选项中的布局边界线来检查布局烘托的功用情况,可是这种办法并不能准确地反映布局烘托的耗时。因此,咱们需求一种更准确的监测计划来定位布局功用问题。

原理

布局耗时监测的原理便是在布局过程中的关键节点刺进计时代码,记录每个阶段的耗时,然后剖析出布局耗时的瓶颈地点。

手动埋点

最简略的布局耗时监测计划便是在布局过程中的关键节点手动刺进计时代码,例如:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    long startTime = System.currentTimeMillis();
    // 解析 XML 布局文件
    setContentView(R.layout.activity_main);
    long endTime = System.currentTimeMillis();
    long cost = endTime - startTime;
    Log.d("TAG", "布局耗时:" + cost + "ms");    
}

这种计划的缺点是需求手动刺进代码,比较繁琐,并且不行灵敏。

AOP切面编程

运用AOP切面编程能够愈加高雅地完结布局耗时监测。例如,运用AspectJ框架能够界说一个切面,在setContentView()办法执行前后别离刺进计时代码:

@Aspect
public class LayoutTimeAspect {
    @Around("call(* android.app.Activity.setContentView(..))")
    public void aroundSetContentView(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        joinPoint.proceed();
        long endTime = System.currentTimeMillis();
        long cost = endTime - startTime;
        Log.d("TAG", "布局耗时:" + cost + "ms");
    }
}

这种计划的优点是代码愈加简练高雅,并且能够扩展到其他需求监测耗时的操作。

相似的还有经过ASM的办法进行插桩,实质都是一样,在特定的办法机遇中刺进对应的监测代码。

Factory

假如咱们要知道特定的某个view的耗时,这个时候就能够运用LayoutInflaterCompat.Factory2

该办法用于设置一个LayoutInflater.Factory2对象,用于替换LayoutInflater在解析XML布局文件时创立View的行为。经过自界说 LayoutInflater.Factory2,咱们能够拦截和修正布局的加载过程,包括创立View和设置特点等。

简略的了解,便是它能拦截view的创立过程,所以咱们能够经过这个特性来监听布局中每一个view的具体耗时。

下面是一个简略的示例:

class MyFactory2 : LayoutInflater.Factory2 {
    override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? {
        val startTime = System.nanoTime()
        val view = LayoutInflater.from(context).createView(name, attrs)
        val endTime = System.nanoTime()
        val costTime = endTime - startTime
        Log.d("TAG", "View $name layout cost time: $costTime")
        return view
    }
    ...
}

这种计划的有点是能够愈加具体化,能够协助监测到具体的view。

开发东西

除了线上的监测功用,线下的剖析也至关重要。Android供给了一些相关剖析东西,能够很好的协助开发者剖析各种功用。

例如,Systrace是Android开发者东西中的一部分,它能够用来剖析运用程序在Android系统上的功用问题,包括布局、制作、CPU、内存等方面的功用问题。

所以针对布局耗时,咱们也能够运用Systrace来进行线下剖析。

TraceCompat.beginSection("start");
TraceCompat.endSection();

在需求检测的当地做标记,然后再进行搜集数据

$ python systrace.py --time=10 -o my_trace.html sched gfx view

这条指令会在10秒内搜集与调度、图形烘托、视图布局相关的功用数据,并将数据保存到名为 my_trace.html 的文件中。

生成完之后,咱们只需求翻开得到的html,能够直接在浏览器中翻开。报告文件中包含了各种功用指标的图表和剖析,能够经过检查相关的部分来了解布局的耗时情况。

Android布局耗时监测的三种方法,你的选择将决议你的高度
除此之外还有,TraceViewLayoutInspector等东西都能有效的辅佐剖析布局的耗时。

优化技巧

在监测并发现到布局问题的时候,剩余的便是处理布局耗时问题。下面供给一些优化布局耗时的计划。

  • 留意防止在布局烘托过程中进行耗时操作,以免影响功用。
  • 运用合适的布局管理器和布局优化技巧,削减布局层次和杂乱度,提高布局烘托功率。
  • 对于一些杂乱布局,能够考虑运用异步加载布局来削减布局加载时刻。

结语

经过以上完结计划,咱们能够准确监测Android运用中布局烘托的耗时,及时发现并处理布局功用问题,然后提升用户体会。希望本文能协助到Android开发者更好地优化运用功用。

引荐

android_startup: 供给一种在运用启动时能够愈加简略、高效的方法来初始化组件,优化启动速度。不仅支撑Jetpack App Startup的全部功用,还供给额定的同步与异步等待、线程操控与多进程支撑等功用。

AwesomeGithub: 根据Github的客户端,纯练习项目,支撑组件化开发,支撑账户密码与认证登陆。运用Kotlin言语进行开发,项目架构是根据JetPack&DataBinding的MVVM;项目中运用了Arouter、Retrofit、Coroutine、Glide、Dagger与Hilt等盛行开源技能。

flutter_github: 根据Flutter的跨平台版别Github客户端,与AwesomeGithub相对应。

android-api-analysis: 结合详细的Demo来全面解析Android相关的知识点, 协助读者能够更快的把握与了解所论述的要点。

daily_algorithm: 每日一算法,由浅入深,欢迎加入一起共勉。