返回顶部
首页 > 资讯 > 精选 >怎么使用Android基准配置文件Baseline Profile方案提升启动速度
  • 499
分享到

怎么使用Android基准配置文件Baseline Profile方案提升启动速度

2023-07-05 02:07:26 499人浏览 独家记忆
摘要

这篇“怎么使用Android基准配置文件Baseline Profile方案提升启动速度”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面

这篇“怎么使用Android基准配置文件Baseline Profile方案提升启动速度”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Android基准配置文件Baseline Profile方案提升启动速度”文章吧。

测量工具

官方建议使用Jetpack Macrobenchmark来测试应用在已启动基准配置文件时的性能,然后将这些结果与已停用基准配置文件时的基准进行比较。接入的方式也很简单,如果你的AS版本满足要求,File/New Module/Benchmark就可以了。

怎么使用Android基准配置文件Baseline Profile方案提升启动速度

会在benchmark Module生成一个ExampleStartupBenchmark测试类,将其修改一下变成如下。

@RunWith(AndroidJUnit4ClassRunner::class)class ColdStartupBenchmark {    @get:Rule    val benchmarkRule = MacrobenchmarkRule()        @Test    fun startupNoCompilation() = startup(CompilationMode.None() )        @Test    fun startupBaselineProfile() = startup(CompilationMode.Partial())     @Test    fun startupFullCompilation() = startup(CompilationMode.Full())    private fun startup(compilationMode: CompilationMode) = benchmarkRule.measureRepeated(        packageName = "com.example.macrobenchmark.target",        metrics = listOf(StartupTimingMetric()),        compilationMode = compilationMode,         iterations = 10,        startupMode = StartupMode.COLD,        setupBlock = {            presshome()        }    ) {        // Waits for the first rendered frame, which represents time to initial display.        startActivityAndWait()        // Waits for content to be visible, which represents time to fully drawn.        //此处可删除,my-content根据自己项目首页的布局决定        device.wait(Until.hasObject(By.res("my-content")), 5_000)    }}

选择带有Benchmark后缀的build variant,测试结果如下所示:

ExampleStartupBenchmark_startUpCompilationModePartial
timeToInitialDisplayMs   min 290.7,   median 310.5,   max 391.2
Traces: Iteration 0 1 2 3 4

ExampleStartupBenchmark_startUpCompilationModeNone
timeToInitialDisplayMs   min 359.4,   median 381.9,   max 420.6
Traces: Iteration 0 1 2 3 4

timeToInitialDisplayMs - 从系统收到启动 intent 到渲染目标 activity 的第一帧的时间

timeToFullDisplayMs - 从系统收到启动 intent 到应用通过 reportFullyDrawn 方法报告已完成绘制的时间。这个需要你手动调用activity.reportFullDrawn()才会有结果展示,表示此时已完全绘制。

Trace: Iteration可以看到每次启动的trace记录,点击数字会跳到Profiler分析界面

运行的时候可能会遇到的问题:

有配置多渠道(Flavor),然后提示Run configuration ExampleStartupBenchmark is not supported in the current project.Cannot obtain the package.解决办法是benchmark里的flavor保持跟app模块一致就可以了

aar依赖找不到

Could not determine the dependencies of null.      Could not resolve all task dependencies for configuration':benchmark:flavorDemoBenchmarkTestedApks'.          Could not find :your_aar_name_in_testModule_libs:.             Required by:                 project :benchmark > project :app > project :testModule

解决方案:在benchmark模块的build.gradle中添加

repositories {    flatDir {        dirs '../testModule/libs', '../app/libs'    }}

Unable to read any metrics during benchmark因为benchmark模块中的benchmark buildtype中debuggable要设为true才行

官方文档

生成基准配置文件

在benchmark模块处新建一个测试类:

@ExperimentalBaselineProfilesapi@RunWith(AndroidJUnit4::class)class BaselineProfileGenerator {    @get:Rule val baselineProfileRule = BaselineProfileRule()    @Test    fun startup() =        baselineProfileRule.collectBaselineProfile(packageName = "com.example.app") {            pressHome()            // This block defines the app's critical user journey. Here we are interested in            // optimizing for app startup. But you can also navigate and scroll            // through your most important UI.            startActivityAndWait()        }}

新建一个Android9以上版本模拟器(真机不行),注意系统选择不包含Google Api的,执行adb root命令,修改ndk filter添加支持,之后就可以跑上面新建的测试了,执行完成之后基准配置文件会生成于benchmark/build/outputs/connected_android_test_additional_output/flavorDemoBenchmark/Pixel 2处,名字类似于BaselineProfileGenerator_generateBaselineProfile-baseline-prof-2023-01-30-07-29-28.txt,将之拷贝到app/src/main/目录下,重命名为baseline-prof.txt。

官方文档

验证优化效果

万事俱备,只欠惊喜,验证一下对启动速度有多大提升。

在app模块添加以下依赖:

dependencies {     implementation("androidx.profileinstaller:profileinstaller:1.3.0-alpha03")}

连接真机再次跑ExampleStartupBenchmark测试,在不同机型分别得到的结果为:

Pixel 1: android 10

ExampleStartupBenchmark_compilationPartial  
timeToInitialDisplayMs   min 1,359.2,   median 1,422.4,   max 2,583.0  

ExampleStartupBenchmark_compilationNone  
timeToInitialDisplayMs   min 1,454.1,   median 1,556.7,   max 2,610.3 

三星S20: android 13

ExampleStartupBenchmark_compilationPartial
timeToInitialDisplayMs   min 597.2,   median 683.9,   max 763.4

ExampleStartupBenchmark_compilationNone
timeToInitialDisplayMs   min 699.5,   median 726.1,   max 753.5

三星S8+: android7

ExampleStartupBenchmark_compilationPartial  
timeToInitialDisplayMs   min 1,089.1,   median 1,121.6,   max 1,249.4 

ExampleStartupBenchmark_compilationNone  
timeToInitialDisplayMs   min 1,147.5,   median 1,166.2,   max 1,338.2

观察数据可以看出,总体来说有一定的提升,特别是在性能低一点的机器会比较明显,但相比于google官方给的文档中的示例结果(提升20%+)还有一点差距,猜测应该跟生成的baseline-prof.txt有关,因为我这里只生成了启动过程到完成第一帧绘制时的热点代码列表,google的例子是生成了到首页并且切换tab的热点代码。

此外,基准配置文件也可以用在提升首次打开操作流畅性上,原理也是一样的,只需要在BaselineProfileGenerator处添加首次进入之后的一些操作,比如像官方的例子一样的切换tab、列表滑动,生成新的文件即可。

以上就是关于“怎么使用Android基准配置文件Baseline Profile方案提升启动速度”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: 怎么使用Android基准配置文件Baseline Profile方案提升启动速度

本文链接: https://lsjlt.com/news/349066.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作