Maui Blazor Hybrid Android Performance Profiling (#68628)
authorTanay Parikh <TanayParikh@users.noreply.github.com>
Thu, 28 Apr 2022 13:29:44 +0000 (06:29 -0700)
committerGitHub <noreply@github.com>
Thu, 28 Apr 2022 13:29:44 +0000 (06:29 -0700)
* [MAUI][Blazor][PERF] Add APK file usage for Android Maui Blazor SOD

* Update android_scenarios.proj

* Call ReportFullyDrawn

* Add  --use-fully-drawn-time --fully-drawn-extra-delay

* Add System.Console.WriteLine for non-android platforms

* Add 6 second delay

* Missing `;`

* Add back Directory.Build.{props, targets}

(cherry picked from commit 28d9ef3ab4ac53b947dd435e6494428238b4dea5)

* Fixes based on CI 1729796

https://dev.azure.com/dnceng/internal/_build/results?buildId=1729796&view=logs&j=4d93e3ae-0b8e-5532-bed2-af5c8a7c58d3&t=b13dec14-3eb2-5f1a-4501-8a9fdadb0e3a
(cherry picked from commit d470655576d3abe6a6fec478c221c4d9de698ba9)

* [REVERT THIS] Temporarily skip other jobs

(cherry picked from commit df51582df9e7bb9d1ca82759d664823c76823c29)

* Revert "[REVERT THIS] Temporarily skip other jobs"

This reverts commit 54fa30d876e2be0fef82883033d8fb027de2a150.

eng/pipelines/coreclr/templates/build-perf-maui-apps.yml
eng/pipelines/coreclr/templates/perf-job.yml
eng/testing/performance/android_scenarios.proj
eng/testing/performance/performance-setup.ps1

index 5ffe539..13646cf 100644 (file)
@@ -30,7 +30,7 @@ steps:
   #      IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.ios-!(*.symbols).nupkg
   #      IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.iossimulator-!(*.symbols).nupkg
   #      IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.maccatalyst-!(*.symbols).nupkg
-        
+
   #    # Other artifacts to include once they are being built
   #    # EX. IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.maccatalyst-*.nupkg
 
@@ -42,15 +42,15 @@ steps:
   #    cleanTargetFolder: false
   #    targetFolder: $(Build.SourcesDirectory)/MauiTesting/ArtifactPacks
   #    flattenFolders: true
-  
+
   #- script: |
   #    for file in *.nupkg
-  #      do     
-  #        mv -v "$file" "${file%.nupkg}.zip" 
+  #      do
+  #        mv -v "$file" "${file%.nupkg}.zip"
   #      done
   #  displayName: Change nupkgs to zips
   #  workingDirectory: $(Build.SourcesDirectory)/MauiTesting/ArtifactPacks
-    
+
 
   ##Unzip the nuget packages to make the actual runtimes accessible
   #- task: ExtractFiles@1
@@ -206,6 +206,50 @@ steps:
     displayName: Build MAUI MacCatalyst
     workingDirectory: $(Build.SourcesDirectory)/MauiTesting
 
+  - script: |
+      ./dotnet new maui-blazor -n MauiBlazorTesting
+      cd MauiBlazorTesting
+      cp $(Build.SourcesDirectory)/src/tests/Common/maui/MauiScenario.props ./Directory.Build.props
+      cp $(Build.SourcesDirectory)/src/tests/Common/maui/MauiScenario.targets ./Directory.Build.targets
+      cp $(Build.SourcesDirectory)/NuGet.config ./NuGet.config
+
+      echo -e "using Microsoft.AspNetCore.Components;
+        #if ANDROID
+          using Android.App;
+        #endif
+
+        namespace MauiBlazorTesting.Pages
+        {
+            public partial class Index
+            {
+                protected override void OnAfterRender(bool firstRender)
+                {
+                    if (firstRender)
+                    {
+                        #if ANDROID
+                          var activity = MainActivity.Context as Activity;
+                          activity.ReportFullyDrawn();
+                        #else
+                          System.Console.WriteLine("__MAUI_Blazor_WebView_OnAfterRender__");
+                        #endif
+                    }
+                }
+            }
+        }" > Pages/Index.razor.cs
+
+      sed -i'' -e "s/{/{\npublic static Android.Content.Context Context { get; private set; }\npublic MainActivity() { Context = this; }/g" Platforms/Android/MainActivity.cs
+    displayName: Setup MAUI Blazor Hybrid Project
+    workingDirectory: $(Build.SourcesDirectory)
+
+  - script: |
+      chmod -R a+r .
+      # Restore is split out because of https://github.com/dotnet/sdk/issues/21877, can be removed with --no-restore once fixed
+      ../dotnet restore
+      ../dotnet publish -bl:MauiBlazorAndroid.binlog -f net6.0-android -c Release -r android-arm64 --no-restore --self-contained
+      mv ./bin/Release/net6.0-android/android-arm64/com.companyname.mauiblazortesting-Signed.apk ./MauiBlazorAndroidDefault.apk
+    displayName: Build MAUI Blazor Android
+    workingDirectory: $(Build.SourcesDirectory)/MauiBlazorTesting
+
   - task: PublishBuildArtifacts@1
     displayName: 'Publish MauiAndroid binlog'
     condition: always()
@@ -214,6 +258,13 @@ steps:
       artifactName:  ${{ parameters.artifactName }}
 
   - task: PublishBuildArtifacts@1
+    displayName: 'Publish MauiBlazorAndroid binlog'
+    condition: always()
+    inputs:
+      pathtoPublish: $(Build.SourcesDirectory)/MauiBlazorTesting/MauiBlazorAndroid.binlog
+      artifactName:  ${{ parameters.artifactName }}
+
+  - task: PublishBuildArtifacts@1
     displayName: 'Publish MauiiOS binlog'
     condition: always()
     inputs:
@@ -246,6 +297,16 @@ steps:
 
   - template: /eng/pipelines/common/upload-artifact-step.yml
     parameters:
+        rootFolder: $(Build.SourcesDirectory)/MauiBlazorTesting/MauiBlazorAndroidDefault.apk
+        includeRootFolder: true
+        displayName: Maui Blazor Android App
+        artifactName: MauiBlazorAndroidApp
+        archiveExtension: '.tar.gz'
+        archiveType: tar
+        tarCompression: gz
+
+  - template: /eng/pipelines/common/upload-artifact-step.yml
+    parameters:
         rootFolder: $(Build.SourcesDirectory)/MauiTesting/MauiAndroidPodcast.apk
         includeRootFolder: true
         displayName: Maui Android Podcast
@@ -286,7 +347,12 @@ steps:
 
   - script: rm -r -f ./bin
     workingDirectory: $(Build.SourcesDirectory)/MauiTesting
-    displayName: Clean bin directory
+    displayName: Clean MauiTesting bin directory
+    condition: succeededOrFailed()
+
+  - script: rm -r -f ./bin
+    workingDirectory: $(Build.SourcesDirectory)/MauiBlazorTesting
+    displayName: Clean MauiBlazorTesting bin directory
     condition: succeededOrFailed()
 
   - template: /eng/pipelines/common/upload-artifact-step.yml
index 463c975..5c0ab4c 100644 (file)
@@ -191,6 +191,13 @@ jobs:
           artifactFileName: 'MauiAndroidPodcast.tar.gz'
           artifactName: 'MauiAndroidPodcast'
           displayName: 'Maui Android Podcast'
+      - template: /eng/pipelines/common/download-artifact-step.yml
+        parameters:
+          unpackFolder: $(Build.SourcesDirectory)
+          cleanUnpackFolder: false
+          artifactFileName: 'MauiBlazorAndroidApp.tar.gz'
+          artifactName: 'MauiBlazorAndroidApp'
+          displayName: 'Maui Blazor Android App'
           
 
     # Download iOSMono tests and MauiiOS/MacCatalyst
index c2fc486..f01d7c1 100644 (file)
         <Command>$(Python) test.py sod --scenario-name &quot;%(Identity)&quot;</Command>
         <PostCommands>$(Python) post.py</PostCommands>
     </HelixWorkItem>
+    <HelixWorkItem Include="SOD - Maui Blazor Android APK Size"> 
+        <PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
+        <PreCommands>cd $(ScenarioDirectory)mauiblazorandroid;copy %HELIX_CORRELATION_PAYLOAD%\MauiBlazorAndroidDefault.apk .; $(Python) pre.py --apk-name MauiBlazorAndroidDefault.apk</PreCommands>
+        <Command>$(Python) test.py sod --scenario-name &quot;%(Identity)&quot;</Command>
+        <PostCommands>$(Python) post.py</PostCommands>
+    </HelixWorkItem>
     <HelixWorkItem Include="SOD - Maui Android Podcast APK Size"> 
         <PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
         <PreCommands>cd $(ScenarioDirectory)mauiandroid;copy %HELIX_CORRELATION_PAYLOAD%\MauiAndroidPodcast.apk .; $(Python) pre.py --apk-name MauiAndroidPodcast.apk</PreCommands>
         <Command>$(Python) test.py sod --scenario-name &quot;%(Identity)&quot;</Command>
         <PostCommands>$(Python) post.py</PostCommands>
     </HelixWorkItem>
+    <HelixWorkItem Include="SOD - Maui Blazor Android Extracted Size"> 
+        <PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
+        <PreCommands>cd $(ScenarioDirectory)mauiblazorandroid;copy %HELIX_CORRELATION_PAYLOAD%\MauiBlazorAndroidDefault.apk .; $(Python) pre.py --unzip --apk-name MauiBlazorAndroidDefault.apk</PreCommands>
+        <Command>$(Python) test.py sod --scenario-name &quot;%(Identity)&quot;</Command>
+        <PostCommands>$(Python) post.py</PostCommands>
+    </HelixWorkItem>
     <HelixWorkItem Include="SOD - Maui Android Podcast Extracted Size"> 
         <PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
         <PreCommands>cd $(ScenarioDirectory)mauiandroid;copy %HELIX_CORRELATION_PAYLOAD%\MauiAndroidPodcast.apk .; $(Python) pre.py --unzip --apk-name MauiAndroidPodcast.apk</PreCommands>
       <Command>$(Python) test.py devicestartup --device-type android --package-path pub\MauiAndroidDefault.apk --package-name com.companyname.mauitesting --scenario-name &quot;%(Identity)&quot;</Command>
       <PostCommands>$(Python) post.py</PostCommands>
     </HelixWorkItem>
+    <HelixWorkItem Include="Device Startup - Android Maui Blazor DefaultTesting">
+      <PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
+      <PreCommands>echo on;set XHARNESSPATH=$(XharnessPath);cd $(ScenarioDirectory)mauiblazorandroid;copy %HELIX_CORRELATION_PAYLOAD%\MauiBlazorAndroidDefault.apk .;$(Python) pre.py --apk-name MauiBlazorAndroidDefault.apk</PreCommands>
+      <Command>$(Python) test.py devicestartup --device-type android --package-path pub\MauiBlazorAndroidDefault.apk --package-name com.companyname.mauiblazortesting --scenario-name &quot;%(Identity)&quot; --use-fully-drawn-time --fully-drawn-extra-delay 6</Command>
+      <PostCommands>$(Python) post.py</PostCommands>
+    </HelixWorkItem>
     <HelixWorkItem Include="Device Startup - Android Maui Podcast">
       <PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
       <PreCommands>echo on;set XHARNESSPATH=$(XharnessPath);cd $(ScenarioDirectory)mauiandroid;copy %HELIX_CORRELATION_PAYLOAD%\MauiAndroidPodcast.apk .;$(Python) pre.py --apk-name MauiAndroidPodcast.apk</PreCommands>
       <Command>$(Python) test.py devicestartup --device-type android --package-path pub\MauiAndroidDefault.apk --package-name com.companyname.mauitesting --scenario-name &quot;%(Identity)&quot; --disable-animations</Command>
       <PostCommands>$(Python) post.py</PostCommands>
     </HelixWorkItem>
+    <HelixWorkItem Include="Device Startup - Android Maui Blazor DefaultTesting NoAnimation">
+      <PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
+      <PreCommands>echo on;set XHARNESSPATH=$(XharnessPath);cd $(ScenarioDirectory)mauiblazorandroid;copy %HELIX_CORRELATION_PAYLOAD%\MauiBlazorAndroidDefault.apk .;$(Python) pre.py --apk-name MauiBlazorAndroidDefault.apk</PreCommands>
+      <Command>$(Python) test.py devicestartup --device-type android --package-path pub\MauiBlazorAndroidDefault.apk --package-name com.companyname.mauiblazortesting --scenario-name &quot;%(Identity)&quot; --use-fully-drawn-time --fully-drawn-extra-delay 6 --disable-animations</Command>
+      <PostCommands>$(Python) post.py</PostCommands>
+    </HelixWorkItem>
     <HelixWorkItem Include="Device Startup - Android Maui Podcast NoAnimation">
       <PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
       <PreCommands>echo on;set XHARNESSPATH=$(XharnessPath);cd $(ScenarioDirectory)mauiandroid;copy %HELIX_CORRELATION_PAYLOAD%\MauiAndroidPodcast.apk .;$(Python) pre.py --apk-name MauiAndroidPodcast.apk</PreCommands>
index 689f8d5..db5f64c 100644 (file)
@@ -156,8 +156,9 @@ if ($AndroidMono) {
         mkdir $WorkItemDirectory
     }
 
-    Copy-Item -path "$SourceDirectory\androidHelloWorld\HelloAndroid.apk" $PayloadDirectory -Verbose      
+    Copy-Item -path "$SourceDirectory\androidHelloWorld\HelloAndroid.apk" $PayloadDirectory -Verbose
     Copy-Item -path "$SourceDirectory\MauiAndroidDefault.apk" $PayloadDirectory -Verbose
+    Copy-Item -path "$SourceDirectory\MauiBlazorAndroidDefault.apk" $PayloadDirectory -Verbose
     Copy-Item -path "$SourceDirectory\MauiAndroidPodcast.apk" $PayloadDirectory -Verbose
     $SetupArguments = $SetupArguments -replace $Architecture, 'arm64'
 }