Ответ 1
Хотя это очень "трудный" вопрос для ответа, поскольку время сборки может зависеть от многих разных факторов, я могу провести вас через способы определения того, что в вашей сборке вызывает задержку. В большинстве случаев это обычно из-за неоптимизированного Resources
. Это могут быть ресурсы, такие как сырые изображения/аудио/видео, которые действительно должны быть оптимизированы для мобильных устройств.
Что касается экспериментальной функциональности, о которой вы упомянули, вы можете ознакомиться с примечаниями к выпуску здесь:
Примечание: Это экспериментально, поэтому он не гарантирует, что он будет достаточно стабильным для использования в производстве.
Что касается Build Times, нам нужно знать, где узкое место находится в вашем проекте. Для этого вам нужно включить Diagnostic Build Output
в команде build-agent. Это довольно просто с MSBuild
через:
/v:diag
или /verbosity:diagnostic
(или любую комбинацию, которую вы хотели)
и
/clp:PerformanceSummary
- что скажет использование таймингов производительности каждой задачи
https://msdn.microsoft.com/en-us/library/ms164311.aspx
EX: Создание файла- > Новый проект для Android:
1>Project Performance Summary:
1> 4087 ms c:\users\dougl\documents\visual studio 2015\Projects\App26\App26\App26.csproj 1 calls
1> 4087 ms Rebuild 1 calls
1>
1>Target Performance Summary:
1> 0 ms GetCopyToOutputDirectoryXamlAppDefs 1 calls
1> 0 ms BeforeRebuild 1 calls
1> 0 ms PrepareResources 1 calls
1> 0 ms _DefineBuildTargetAbis 1 calls
1> 0 ms UpdateAndroidAssets 1 calls
1> 0 ms AfterBuild 1 calls
1> 0 ms AfterCompile 1 calls
1> 0 ms BeforeCompile 1 calls
1> 0 ms ExpressionBuildExtension 1 calls
1> 0 ms _GenerateCompileInputs 1 calls
1> 0 ms ResolveCodeAnalysisRuleSet 1 calls
1> 0 ms _LinkAssemblies 1 calls
1> 0 ms GetTargetPath 1 calls
1> 0 ms Build 1 calls
1> 0 ms GenerateCompiledExpressionsTempFile 1 calls
1> 0 ms _CopyConfigFiles 1 calls
1> 0 ms Compile 1 calls
1> 0 ms Rebuild 1 calls
1> 0 ms ModifyUnitTestPlatformVersion 1 calls
1> 0 ms _RegisterMdbFilesWithFileWrites 1 calls
1> 0 ms _CheckForCompileOutputs 1 calls
1> 0 ms _SetupDesignTimeBuildForIntellisense 1 calls
1> 0 ms _SetTargetFrameworkMonikerAttribute 1 calls
1> 0 ms _GenerateAndroidAssetsDir 1 calls
1> 0 ms _AddMultiDexDependencyJars 1 calls
1> 0 ms AfterResolveReferences 1 calls
1> 0 ms UpdateAndroidResources 1 calls
1> 0 ms _CheckInstantRunCondition 1 calls
1> 0 ms CleanPublishFolder 1 calls
1> 0 ms _CheckTargetFramework 1 calls
1> 0 ms _CollectMonoAndroidOutputs 1 calls
1> 0 ms _CopySourceItemsToOutputDirectory 1 calls
1> 0 ms CompileRdlFiles 1 calls
1> 0 ms _CreateAdditionalResourceCache 4 calls
1> 0 ms DesignTimeXamlMarkupCompilation 1 calls
1> 0 ms AfterRebuild 1 calls
1> 0 ms _SeparateAppExtensionReferences 1 calls
1> 0 ms ExpandSDKReferences 1 calls
1> 0 ms _ReadPropertiesCache 1 calls
1> 0 ms AfterResGen 1 calls
1> 0 ms CleanReferencedProjects 1 calls
1> 0 ms _CollectPCLPdbFiles 1 calls
1> 0 ms Clean 1 calls
1> 0 ms SetWin32ManifestProperties 1 calls
1> 0 ms ResolveSDKReferences 1 calls
1> 0 ms CreateSatelliteAssemblies 1 calls
1> 0 ms DeleteBuildInfoResource 1 calls
1> 0 ms _ResolveMonoAndroidFramework 1 calls
1> 0 ms PrepareResourceNames 1 calls
1> 0 ms _SetupInstantRun 1 calls
1> 0 ms _SetupDesignTimeBuildForBuild 1 calls
1> 0 ms CoreBuild 1 calls
1> 0 ms _CheckForDeletedResourceFile 1 calls
1> 0 ms GetFrameworkPaths 1 calls
1> 0 ms _ValidateLinkMode 1 calls
1> 0 ms DeleteBuildInfoFile 1 calls
1> 0 ms _CollectPCLMdbFiles 1 calls
1> 0 ms _CompileDex 1 calls
1> 0 ms GetInstalledSDKLocations 1 calls
1> 0 ms BeforeClean 1 calls
1> 0 ms BuildOnlySettings 1 calls
1> 0 ms _ValidateResourceCache 1 calls
1> 0 ms BeforeResolveReferences 1 calls
1> 0 ms _CheckForContent 1 calls
1> 0 ms BeforeResGen 1 calls
1> 0 ms PrepareRdlFiles 1 calls
1> 0 ms AfterClean 1 calls
1> 0 ms _SetupApplicationJavaClass 1 calls
1> 0 ms ValidationExtension 1 calls
1> 0 ms _IncludeInstanceRunReference 1 calls
1> 0 ms ResolveReferences 1 calls
1> 0 ms CreateCustomManifestResourceNames 1 calls
1> 0 ms ResGen 1 calls
1> 0 ms BeforeBuild 1 calls
1> 1 ms _SplitProjectReferencesByFileExistence 1 calls
1> 1 ms _GenerateSatelliteAssemblyInputs 1 calls
1> 1 ms PrepareForRun 1 calls
1> 1 ms CleanXsdCodeGen 1 calls
1> 1 ms GenerateTargetFrameworkMonikerAttribute 1 calls
1> 1 ms ResolveProjectReferences 1 calls
1> 1 ms AssignTargetPaths 1 calls
1> 1 ms _CreateIntermediateAssembliesDir 1 calls
1> 1 ms GetCopyToOutputDirectoryItems 1 calls
1> 1 ms PreXsdCodeGen 1 calls
1> 1 ms _GetReferenceAssemblyPaths 1 calls
1> 1 ms CoreResGen 1 calls
1> 1 ms _CleanGeneratedDeploymentFiles 1 calls
1> 1 ms SetBuildInfoDefaults 1 calls
1> 1 ms AssignProjectConfiguration 1 calls
1> 1 ms _CreatePackageWorkspace 1 calls
1> 1 ms _GetMonoPlatformJarPath 1 calls
1> 1 ms PrepareForBuild 1 calls
1> 1 ms _CalculateAdditionalResourceCacheDirectories 1 calls
1> 1 ms _ComputeAndroidResourcePaths 1 calls
1> 1 ms _SetEmbeddedWin32ManifestProperties 1 calls
1> 1 ms _GetAddOnPlatformLibraries 1 calls
1> 1 ms _GetLibraryImports 1 calls
1> 1 ms SplitResourcesByCulture 1 calls
1> 1 ms GetReferenceAssemblyPaths 1 calls
1> 1 ms _CheckProjectItems 1 calls
1> 1 ms _AdjustJavacVersionArguments 1 calls
1> 1 ms _CleanGeneratedDebuggingFiles 1 calls
1> 2 ms _PrepareAssemblies 1 calls
1> 2 ms _FindJavaStubFiles 1 calls
1> 2 ms _ExtractLibraryProjectImports 1 calls
1> 2 ms _StripEmbeddedLibraries 1 calls
1> 2 ms _CleanGetCurrentAndPriorFileWrites 1 calls
1> 2 ms _GetAdditionalResourcesFromAssemblies 1 calls
1> 2 ms _FindCompiledJavaFiles 1 calls
1> 2 ms _CheckDuplicateJavaLibraries 1 calls
1> 2 ms _AddLibraryProjectsEmbeddedResourceToProject 1 calls
1> 3 ms _ComputeAndroidAssetsPaths 1 calls
1> 3 ms CopyFilesToOutputDirectory 1 calls
1> 3 ms CoreClean 1 calls
1> 3 ms _CollectPdbFiles 1 calls
1> 3 ms GetBuiltProjectOutputRecursive 1 calls
1> 3 ms _CollectConfigFiles 1 calls
1> 3 ms _ValidateAndroidPackageProperties 1 calls
1> 3 ms _WriteResolvedAssemblies 1 calls
1> 4 ms _CreatePropertiesCache 1 calls
1> 4 ms _ResolveMonoAndroidSdks 1 calls
1> 4 ms _AddDebugStaticResources 1 calls
1> 4 ms _BuildLibraryImportsCache 1 calls
1> 4 ms _CollectMdbFiles 1 calls
1> 5 ms _CheckForInvalidConfigurationAndPlatform 1 calls
1> 7 ms _ResolveSatellitePaths 1 calls
1> 7 ms _GeneratePackageManagerJava 1 calls
1> 8 ms _DetermineJavaLibrariesToCompile 1 calls
1> 9 ms IncrementalClean 1 calls
1> 10 ms _AddStaticResources 1 calls
1> 11 ms _CleanMonoAndroidIntermediateDir 1 calls
1> 11 ms _GenerateAndroidResourceDir 1 calls
1> 12 ms _CleanMsymArchive 1 calls
1> 18 ms _SetLatestTargetFrameworkVersion 1 calls
1> 20 ms ResolveAssemblyReferences 1 calls
1> 27 ms ImplicitlyExpandDesignTimeFacades 1 calls
1> 30 ms _BuildSdkCache 1 calls
1> 35 ms _ConvertPdbFiles 1 calls
1> 45 ms _CheckTargetFrameworks 1 calls
1> 46 ms _ResolveLibraryProjectImports 1 calls
1> 52 ms _CreateBaseApk 1 calls
1> 66 ms _BuildAdditionalResourcesCache 1 calls
1> 72 ms _CopyMdbFiles 1 calls
1> 78 ms _ResolveAssemblies 1 calls
1> 115 ms _UpdateAndroidResgen 1 calls
1> 167 ms _GenerateJavaStubs 1 calls
1> 189 ms _GetPrimaryCpuAbi 1 calls
1> 453 ms _CopyIntermediateAssemblies 1 calls
1> 515 ms _LinkAssembliesNoShrink 1 calls
1> 657 ms _CompileToDalvikWithDx 1 calls
1> 664 ms _CompileJava 1 calls
1> 677 ms CoreCompile 1 calls
1>
1>Task Performance Summary:
1> 0 ms CallTarget 1 calls
1> 0 ms MSBuild 1 calls
1> 0 ms ResolveCodeAnalysisRuleSet 1 calls
1> 0 ms ReadLinesFromFile 2 calls
1> 0 ms GetFrameworkPath 1 calls
1> 0 ms FindAppConfigFile 1 calls
1> 0 ms AssignCulture 1 calls
1> 1 ms GetAppSettingsDirectory 1 calls
1> 1 ms ConvertToAbsolutePath 1 calls
1> 1 ms RemoveDuplicates 3 calls
1> 1 ms AssignTargetPath 6 calls
1> 1 ms CollectLibraryAssets 1 calls
1> 1 ms AssignProjectConfiguration 1 calls
1> 1 ms GetMonoPlatformJar 1 calls
1> 1 ms CalculateAdditionalResourceCacheDirectories 1 calls
1> 1 ms CreateTemporaryDirectory 2 calls
1> 1 ms GetAndroidDefineConstants 1 calls
1> 1 ms GetAddOnPlatformLibraries 1 calls
1> 1 ms ReadImportedLibrariesCache 1 calls
1> 1 ms ReadAdditionalResourcesFromAssemblyCache 1 calls
1> 1 ms CheckProjectItems 1 calls
1> 1 ms GetReferenceAssemblyPaths 2 calls
1> 1 ms AdjustJavacVersionArguments 1 calls
1> 2 ms FindUnderPath 7 calls
1> 2 ms Message 17 calls
1> 2 ms ReadLibraryProjectImportsCache 1 calls
1> 2 ms MakeDir 6 calls
1> 2 ms CreateAndroidResourceStamp 1 calls
1> 2 ms CreateProperty 42 calls
1> 2 ms CopyIfChanged 1 calls
1> 2 ms GetAndroidPackageName 2 calls
1> 2 ms GetJavaPlatformJar 1 calls
1> 2 ms GetExtraPackages 2 calls
1> 2 ms CheckDuplicateJavaLibraries 1 calls
1> 2 ms CreateManagedLibraryResourceArchive 1 calls
1> 3 ms RemoveUnknownFiles 1 calls
1> 3 ms AndroidComputeResPaths 2 calls
1> 3 ms CreateResgenManifest 1 calls
1> 4 ms GetImportedLibraries 1 calls
1> 4 ms GetFilesThatExist 3 calls
1> 6 ms Touch 7 calls
1> 6 ms CopyGeneratedJavaResourceClasses 2 calls
1> 7 ms CreateItem 20 calls
1> 7 ms GeneratePackageManagerJava 1 calls
1> 7 ms DetermineJavaLibrariesToCompile 1 calls
1> 8 ms Delete 28 calls
1> 10 ms CopyResource 4 calls
1> 11 ms RemoveDirFixed 5 calls
1> 12 ms WriteLinesToFile 5 calls
1> 17 ms ReadResolvedSdksCache 1 calls
1> 27 ms ResolveAssemblyReference 2 calls
1> 29 ms GenerateResourceDesigner 1 calls
1> 29 ms ResolveSdks 1 calls
1> 29 ms ConvertResourcesCases 3 calls
1> 35 ms ConvertDebuggingFiles 1 calls
1> 45 ms CheckTargetFrameworks 1 calls
1> 45 ms ResolveLibraryProjectImports 1 calls
1> 52 ms CopyMdbFiles 1 calls
1> 65 ms GetAdditionalResourcesFromAssemblies 1 calls
1> 77 ms ResolveAssemblies 1 calls
1> 92 ms Aapt 2 calls
1> 161 ms GenerateJavaStubs 1 calls
1> 186 ms GetPrimaryCpuAbi 1 calls
1> 479 ms Copy 7 calls
1> 513 ms LinkAssemblies 1 calls
1> 655 ms CompileToDalvik 1 calls
1> 660 ms Csc 1 calls
1> 664 ms Javac 1 calls
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:04.08
Обратите внимание, что мы можем сказать, сколько времени прошло это построение: 4 секунды. Однако это не ответит на ваш случай, но с соответствующим журналом, подобным этому, мы можем затем изучить это Target
или Task
и выяснить, что ваш проект является узким местом. Мое предположение было бы aapt
, но это просто потому, что даже Android Studio будет висеть здесь, поскольку этот инструмент находится внутри Android SDK
и отвечает за упаковку активов Android.
EDIT:
Похоже, эта сборка заняла ~ 2 минуты, чтобы построить 2 проекта. Один из них находится в C:\Development\Apps\trunk\App.Droid\App.Droid.ServiceClient\App.Droid.ServiceClient.csproj
, а другой - в C:\Development\Apps\trunk\App.Droid\App.Droid\App.Droid.csproj
(40/87 секунд соответственно). Это кажется вполне нормальным для проекта с такими многими сторонними зависимостями для поддержки Android/Google Play. Вы можете найти строку Task "GetAdditionalResourcesFromAssemblies
, чтобы показать 6 мест, где это определено. Здесь задействованы 2 Задачи, вызванные двумя проектами Android.
Возможно, стоит сравнить проект Android Studio с множеством внешних зависимостей и сравнить время. Я знаю, что в настоящее время у нас довольно много работы в отношении задачи GetAdditionalResourcesFromAssemblies
. Однако эта работа будет недоступна до цикла 9-10. В настоящее время эта работа отличается от запроса на растяжение:
https://github.com/xamarin/xamarin-android/pull/296
(Вы можете сказать это почти совершенно из-за времени фиксации).
Как вы можете сказать из этой задачи, будут достигнуты следующие улучшения:
Текущая задача всегда загружает данные из Google. Это независимо о том, существуют ли файлы в каталоге Android sdk. Эта фиксация изменяет задачу GetAdditionalResourcesFromAssemblies заглянуть в папку "extras" в sdk android для требуемого .aar. Это будет означать, что если пользователь имеет обновленный sdk, почти не нужно загружать файлы из Интернета.
Там также PR - https://github.com/xamarin/xamarin-android/pull/292 (спасибо @Mikhail)
Какие адреса повторно используют вычисленный хеш, который также может уменьшить время сборки.
TL;DR; GetAdditionalResourcesFromAssemblies
требуется немного больше работы для времени сборки, чтобы быть короче. Это в настоящее время работает.
ИЗМЕНИТЬ 2:
В настоящее время это разрешено в библиотеках поддержки, которые включают зависимость от https://www.nuget.org/packages/Xamarin.Build.Download/