<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
偶然在Youtube上看到一名國外安卓開發者分享了一個提升應用效能的視訊,其中使用到了macro benchmark來進行效能測量,包括啟動速度和列表影格率,方法是生成一個baseline-prof.txt檔案放於app/src/main/下。查閱google的官方檔案,其背後原理如下:
通過在應用或庫中分發基準組態檔,Android 執行時 (ART) 可以通過預先 (AOT) 編譯來優化包含的程式碼路徑,從而針對每位新使用者以及每個應用更新提升效能。這種組態檔引導的優化 (PGO) 可讓應用優化啟動、減少互動卡頓,並提高整體的執行時效能,從而讓使用者從首次啟動開始便獲得更好的使用體驗。
baseline-prof.txt檔案中定義了安裝時要預編譯的程式碼路徑,打包時會跟隨aab一起上傳到Google Play,通過Google play安裝時將獲得預編譯的收益。
這個方案看起來很不錯,相比於其它的那些難以上手的啟動優化方案,這個似乎比較好落地,於是乎我開始了接入嘗試,最後艱難成功了。
官方建議使用Jetpack Macrobenchmark來測試應用在已啟動基準組態檔時的效能,然後將這些結果與已停用基準組態檔時的基準進行比較。接入的方式也很簡單,如果你的AS版本滿足要求,File/New Module/Benchmark就可以了。
會在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 4ExampleStartupBenchmark_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.0ExampleStartupBenchmark_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.4ExampleStartupBenchmark_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.4ExampleStartupBenchmark_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方案提升啟動速度的詳細內容,更多關於Android Baseline Profile提升啟動速度的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45