安卓启动 性能提升 20-30% ,基准配置 入门教程

1.先从官方下载demohttps://github.com/android/codelab-android-performance/archive/refs/heads/main.zip

2.先用Android studio打开里面的baseline-profiles项目

3.运行一遍app,这里建议用模拟器,(Pixel 6 API 34)设备运行,因为基准配置 需要root权限,如果手机没有root,就用模拟器运行。

4.运行时会报This version (1.4.5) of the Compose Compiler requires Kotlin version 1.8.20 but you appear to be using Kotlin version 1.9.22 which is not known to be compatible.  Please consult the Compose-Kotlin compatibility map located at https://developer.android.com/jetpack/androidx/releases/compose-kotlin to choose a compatible version pair (or `suppressKotlinVersionCompatibilityCheck` but don't say I didn't warn you!).

5.修改libs.versions.toml里的 kotlin = "1.9.22" 改为 kotlin = "1.8.20"

6.再运行一下,private fun NavBackStackEntry.lifecycleIsResumed() = this.getLifecycle().currentState == Lifecycle.State.RESUMED 这里的getLifecycle()会报错,改成lifecycle

7.再运行一次,这一次应该可以启动成功了,图片不显示可以忽悠不管,因为这个图片是从谷歌那边加载过来的,需要飞机,我们重点是基准配置,如果前面步骤碰见其他问题,基本与该项目无关,可以自行百度和AI解决。

8.点击File->new module 选择baseline profile generator ,如图,如果你是java党,可以右边改改配置,因人而异,我这里就选择默认的kotlin,直接点finish

9.如果你碰见 配置文件一片红,就删除,重新创建,放app下面,就不会爆红了,如果你没有遇见以下问题,可以跳过此步

如果删不掉,是因为app在引用,把这段去掉,点击sync now,再重新删一下

10.在baselineprofile的build.gradle.kts文件中修改,添加代码如下,代码解释:useConnectedDevices = false意思是否在真机上运行,由于真机没有root,只能在模拟器上运行,所以选择false就行,然后配置模拟器 ,记得导入

import com.android.build.api.dsl.ManagedVirtualDevice
import com.android.build.api.dsl.ManagedVirtualDeviceandroid {.......................
.......................targetProjectPath = ":app"testOptions.managedDevices.devices {create<ManagedVirtualDevice>("pixel6Api31") {device = "Pixel 6"apiLevel = 31systemImageSource = "aosp"}}
}// This is the configuration block for the Baseline Profile plugin.
// You can specify to run the generators on a managed devices or connected devices.
baselineProfile {managedDevices += "pixel6Api31"useConnectedDevices = false
}

如图下

11.在baselineprofile找到BaselineProfileGenerator类,自己项目可以根据自己情况更改,但是由于我们是demo,就演示一下,代码如下

  @Testfun generate() {// This example works only with the variant with application id `com.example.baselineprofiles_codelab`."rule.collect(packageName = "com.example.baselineprofiles_codelab",// See: https://d.android.com/topic/performance/baselineprofiles/dex-layout-optimizationsincludeInStartupProfile = true) {// 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.// Start default activity for your apppressHome()startActivityAndWait()// TODO Write more interactions to optimize advanced journeys of your app.// For example:// 1. Wait until the content is asynchronously loaded// 2. Scroll the feed content// 3. Navigate to detail screen// 1. Wait until the content is asynchronously loaded.waitForAsyncContent()// 2. Scroll the feed content.scrollSnackListJourney()// 3. Navigate to detail screen.goToSnackDetailJourney()// Check UiAutomator documentation for more information how to interact with the app.// https://d.android.com/training/testing/other-components/ui-automator}}fun MacrobenchmarkScope.waitForAsyncContent() {device.wait(Until.hasObject(By.res("snack_list")), 5_000)val contentList = device.findObject(By.res("snack_list"))// Wait until a snack collection item within the list is rendered.contentList.wait(Until.hasObject(By.res("snack_collection")), 5_000)}fun MacrobenchmarkScope.scrollSnackListJourney() {val snackList = device.findObject(By.res("snack_list"))// Set gesture margin to avoid triggering gesture navigation.snackList.setGestureMargin(device.displayWidth / 5)snackList.fling(Direction.DOWN)device.waitForIdle()}fun MacrobenchmarkScope.goToSnackDetailJourney() {val snackList = device.findObject(By.res("snack_list"))val snacks = snackList.findObjects(By.res("snack_item"))// Select snack from the list based on running iteration.val index = (iteration ?: 0) % snacks.sizesnacks[index].click()// Wait until the screen is gone = the detail is shown.device.wait(Until.gone(By.res("snack_list")), 5_000)}

12.点击run按钮旁边三颗点,选择Edit Configurations...,然后点击左上角+,添加Gradle,在RUN下面一行添加:app:generateBaselineProfile -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile,点击OK就行,然后运行,如图:

如果出现> 'compileNonMinifiedReleaseJavaWithJavac' task (current target is 1.8) and 'compileNonMinifiedReleaseKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version.
  Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain

把compileOptions里的兼容版本改成对应的版本就行了,由于我是用的java 17,就改成17就行了,然后重新运行

compileOptions {sourceCompatibility = JavaVersion.VERSION_17targetCompatibility = JavaVersion.VERSION_17
}

如果没有出现上面问题,可以忽悠不管

13.运行大概需要等5-6分钟,如果太久了,建议重新运行一下,因设备而异,运行完成的话,在app项目的src->release->generated->baselineProfiles文件下,生成2个txt文件,一个是1.8W行-2.5W行的baseline-prof.txt文件和startup-prof.txt文件,因项目而异,如果基准配置更多,生成的可能更多,由于我们只生成了,异步加载,点击,滚动,差不多2W行

如图:

14. 使用模拟器测试速度,在 baselineprofile 的 build.gradle.kts下的defaultConfig 里添加 testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "EMULATOR",代码解释,这段是用来印制模拟器的错误

defaultConfig {minSdk = 28targetSdk = 34testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "EMULATOR"
}

15.在baselineprofile 项目的StartupBenchmarks类里添加和前面基准配置的 代码一样,模拟和基准操作

代码如下:

  private fun benchmark(compilationMode: CompilationMode) {// This example works only with the variant with application id `com.example.baselineprofiles_codelab`."rule.measureRepeated(packageName = "com.example.baselineprofiles_codelab",metrics = listOf(StartupTimingMetric()),compilationMode = compilationMode,startupMode = StartupMode.COLD,iterations = 10,setupBlock = {pressHome()},measureBlock = {startActivityAndWait()waitForAsyncContent()// 2. Scroll the feed content.scrollSnackListJourney()// 3. Navigate to detail screen.goToSnackDetailJourney()})}fun MacrobenchmarkScope.waitForAsyncContent() {device.wait(Until.hasObject(By.res("snack_list")), 5_000)val contentList = device.findObject(By.res("snack_list"))// Wait until a snack collection item within the list is rendered.contentList.wait(Until.hasObject(By.res("snack_collection")), 5_000)}fun MacrobenchmarkScope.scrollSnackListJourney() {val snackList = device.findObject(By.res("snack_list"))// Set gesture margin to avoid triggering gesture navigation.snackList.setGestureMargin(device.displayWidth / 5)snackList.fling(Direction.DOWN)device.waitForIdle()}fun MacrobenchmarkScope.goToSnackDetailJourney() {val snackList = device.findObject(By.res("snack_list"))val snacks = snackList.findObjects(By.res("snack_item"))// Select snack from the list based on running iteration.val index = (iteration ?: 0) % snacks.sizesnacks[index].click()// Wait until the screen is gone = the detail is shown.device.wait(Until.gone(By.res("snack_list")), 5_000)}

16.然后,直接右键运行,这个测试类,在模拟器(Pixel 6 API 31) 以上运行,我建议在模拟器(Pixel 6 API 34)运行,因为API31,可能会报下面错误,如果出现了,就切到API34

如果出现了java.lang.IllegalStateException: Error: did not detect tracing on after 5000 ms  ,我建议切换到模拟器(Pixel 6 API34),运行就不有问题17.运行效果如下

StartupBenchmarks_startupCompilationBaselineProfiles
timeToFullDisplayMs      min   821.2,   median   908.4,   max 1,114.1
timeToInitialDisplayMs   min   438.9,   median   514.8,   max   678.4
Traces: Iteration 0 1 2 3 4 5 6 7 8 9
Timed out waiting for process (com.example.baselineprofiles_codelab) to appear on Pixel_6_API_34 [emulator-5556].
WARNING: Running on Emulator
Benchmark is running on an emulator, which is not representative of
real user devices. Use a physical device to benchmark. Emulator
benchmark improvements might not carry over to a real user's
experience (or even regress real device performance).

StartupBenchmarks_startupCompilationNone
timeToFullDisplayMs      min   984.5,   median 1,157.2,   max 1,257.2
timeToInitialDisplayMs   min   498.9,   median   606.3,   max   668.4
Traces: Iteration 0 1 2 3 4 5 6 7 8 9

StartupBenchmarks_startupCompilationNone 表示没有基准上运行

StartupBenchmarks_startupCompilationBaselineProfiles 表示在有基准上运行

1,157.2 ->908.4,提升大概200毫秒,差不多百分之20多,到这里教程就结束了,谢谢大家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

思科防火墙 网线连接的端口还是down 已配置 端口还是down

环境&#xff1a; 思科防火墙fpr-2100 isco Firepower 2100 系列防火墙是思科系统&#xff08;Cisco Systems&#xff09;推出的一款中端网络安全和防火墙设备。这一系列的产品主要针对中到大型企业的需求&#xff0c;提供高性能的威胁防护和网络流量管理功能。 问题描述&am…

Java微服务智慧工地可视化SaaS云解决方案源码

智慧工地是指运用信息化手段&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生态圈&#xff0c;并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析&#xff0c;提供过程趋势预测及专家预案&#xff0c;实现工程…

排序算法之直接选择排序【图文详解】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

基于tensorflow和NasNet的皮肤癌分类项目

数据来源 https://challenge.isic-archive.com/data/#2019 数据划分 写了个脚本划分 for line in open(ISIC/labels.csv).readlines()[1:]:split_line line.split(,)img_file split_line[0]benign_malign split_line[1]# 0.8 for train, 0.1 for test, 0.1 for validati…

快蜗牛OZON数据分析,OZON快蜗牛数据

在当今电商行业蓬勃发展的背景下&#xff0c;OZON作为俄罗斯及东欧市场的重要电商平台&#xff0c;其数据背后蕴藏着巨大的商业价值。快蜗牛&#xff0c;作为专注于OZON平台的数据分析工具&#xff0c;为卖家提供了深入的市场洞察和策略指导。接下来看看快蜗牛OZON数据分析&…

线上 | OpenSergo - [规范]

INDEX 1 参考资料2 OpenSergo 与 Sentinel 关系3 规范体系3.1 服务元数据ReportMetadataRequest 信息![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ffba569841ae4668b4cff74e4d41d21f.png)##### ReportMetadataReply 信息![在这里插入图片描述](https://img-blog…

BurpSuite2024.5

1 工具介绍 本版本更新介绍 此版本引入了Burp Scanner对WebSockets的支持、对记录登录编辑器的改进、WebSocket 匹配和替换规则以及许多性能改进。 Burp Scanner 支持 WebSockets 我们已更新内部代理的配置以允许 WebSocket 流量。这使 Burp Scanner 现在可以抓取依赖 WebSo…

基于大模型的智慧零售教育科研平台——技术方案

一、概述 1.1背景 随着数字经济的快速发展和全社会数字化水平的升级&#xff0c;人工智能的积极作用越来越凸显&#xff0c;人工智能与各个行业的深度融合已成为促进传统产业转型升级的重要方式之一。ChatGPT的出现掀起了又一波人工智能发展热潮&#xff0c;人工智能行业发展势…

Linux sudo用户权限管理小实验001

Linux sudo用户权限管理和审计-初步 1、设置历史指令的保存数量 默认history指令可以查看当前用户执行的1000条历史命令的条目 2、使用export指令设置HISTSIZE环境变量的数量为999999条。 3、基于date指令&#xff0c;输出日期和时间 4、设置linux系统history相关变量&…

预编码算法(个人总结)

引言 预编码算法是现代无线通信系统中的关键技术&#xff0c;特别是在多输入多输出&#xff08;MIMO&#xff09;系统中。它们通过在发送端对信号进行处理&#xff0c;减少干扰并提高信道容量。这种技术广泛应用于5G、Wi-Fi和卫星通信系统中。本教程将详细介绍预编码算法的背景…

FV悬浮球,安卓真正小而美的神器,满足你的一切需求。

如果你问安卓最强软件有哪些&#xff0c;不同的人可能会有不同的答案&#xff0c;但如果是问我&#xff0c;那我的答案中一定会有他。 FV悬浮球 他是ES文件浏览器&#xff0c;原作者的新作品&#xff0c;经过几年的开发&#xff0c;拥有了超过400项功能&#xff0c;但大小只有…

如何在 llama.cpp 服务器中实现用户登录功能的优化方案?(语言-c++)

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

HCIP-Datacom-ARST自选题库__BGP/MPLS IP VPN判断【10道题】

1.部署BGP/MPLSIP VPN时,当两个VPN有共同的站点,则该共同站点一定不能与两个VPN其他站点使用重叠的地址空间。 2.如图所示&#xff0c;运营商BGP/MPLSIP VPN骨干网通过LDP构建LSP&#xff0c;若想实现用户X两个站点之间通过BGP/MPLSIP VPN网络互通&#xff0c;则PE1和PE2之间必…

ZL-LGF-2离体心脏灌流系统适用于离体哺乳动物心脏灌流和离体心脏冠脉流量的测定

单介绍&#xff1a; 离体心脏灌流系统适用于离体哺乳动物心脏灌流&#xff08;langendorff氏法&#xff09;和离体心脏冠脉流量的测定&#xff0e;可直接进行恒压灌流&#xff0c;加上蠕动泵可进行恒流灌流&#xff0e; 详情介绍&#xff1a; 1、灌流数量&#xff1a;2个心脏…

10款实用软件工具推荐,从绘图到系统优化一应俱全!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 1.绘图软件——Adobe Fresco Adobe Fresco是由Adobe公司推出的一款绘图软件&#xff0c;适用于Windows平台。Adobe Fresco是一款功能强大的绘…

tinyrenderer-切线空间法线贴图

法线贴图 法线贴图分两种&#xff0c;一种是模型空间中的&#xff0c;一种是切线空间中的 模型空间中的法线贴图的rgb代表着每个渲染像素法线的xyz&#xff0c;与顶点坐标处于一个空间&#xff0c;图片是五颜六色的。 切线空间中的法线贴图的rgb同样对应xyz&#xff0c;是切线…

微信公众号开发(三):自动回复“你好”

上一篇做了服务器校验&#xff0c;但没有处理用户发来的消息&#xff0c;为了完成自动回复的功能&#xff0c;需要增加一些功能&#xff1a; 1、调整服务器校验函数&#xff1a; def verify_wechat(request):tokentokendatarequest.argssignaturedata.get(signature)timestamp…

如何让数据标注

1.用Anacoda创建一个新的虚拟环境 2.进入虚拟环境 conda activate stu_data&#xff08;就是刚才创建的虚拟变量的名称&#xff09; 3.在此环境中安装labelimg pip install labelimg 4.进入labelimg 直接输入 labelimg 快捷键&#xff1a;D&#xff1a;下一个图片 A&#xff1a…

apexcharts数据可视化之圆环柱状图

apexcharts数据可视化之圆环柱状图 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式&#xff1a; 基础圆环柱状图多组数据圆环柱状图图片背景自定义角度渐变半个圆环图虚线圆环图 基础圆环图 import ApexChart from react-apexcharts;export function Cir…