Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

[Epic] Reduce CI test cost by pruning and consolidating low-value tests

Open
#13,012 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
Over a week
Newbie friendliness
45/100
Issue type
Refactor
Clarity
Clearly specified
Activity status
Active
Tech stack
android, azure, csharp, yaml
Domain
ci-cd, testing

Research direction

Pick a workstream from the epic. For build-test consolidation, start with the test families BuildTest2, BuildTest3, CodeBehindTests, and IncrementalBuildTest under src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/ and the YAML template build-tools/automation/yaml-templates/stage-package-tests.yaml. For device-test changes, review tests/MSBuildDeviceIntegration/Tests/. 'Done' is a focused follow-up PR that removes or combines specific low-value tests, records the retained detector or accepted gap, and includes before/after CI timing for the affected lane.

Written by the indexing model from the issue text.

Description

needs-triage
Android framework version

net11.0-android (Preview). The audit also covers stable-framework host test assemblies and supported older package/classfile/metadata formats.

Affected platform version

Current dotnet/android development sources and public/official CI on Windows, macOS and Linux. Public Azure DevOps dotnet-android pipeline: dnceng-public/public, definition 333.

Source-audit baseline: 2a20d9989a79d50e3390ebd1eb4f90e311fa1ec6.

Description
Goal and decision rule

Incrementally reduce test execution, maintenance and reliability costs through small, reviewable PRs. Prioritize repeated fresh app builds, heavyweight fixture setup and device runs, rather than deleting cheap unit coverage just because it has many cases. Combining several independent assertions around one expensive build is explicitly in scope.

A test is low-value when its unique protection against meaningful regressions is too small relative to its cost. The key question is: If this breaks, which retained tests detect it reliably, promptly and clearly enough? Downstream detection and useful diagnostic localization are separate benefits. A small, explicitly accepted coverage gap can justify deletion, consolidation or a lower-frequency lane; exact equivalence is desirable but not mandatory.

There is no deletion quota. A test that has never failed is an investigation signal, not sufficient justification for removal. This audit does not establish lifetime failure histories. Weak assertions often need repair before their tests can be shrunk.

Twenty-two CI-run test projects received read-only source audits: complete fixture/family and parameter inventories, with deeper assertion/production/retained-detector analysis for ranked candidates. The large build-suite audit does not claim exhaustive mutation proof for every assertion in all 784 methods. No source/test deletions were performed during those audits. The first implementation is the separate lane-removal PR below.

Use this issue as the umbrella: open focused follow-up issues/PRs as work is selected, record the retained detector or accepted gap, and measure actual results. Existing component-retirement issues remain the owners of their work.

Already started
  • Open #13011 to remove the explicit CoreCLRTrimmable invocation, now redundant with ordinary CoreCLR's default typemap.
  • Land #13011 and record the resulting CI matrix. PR is open, not merged, at b0bcd38c0e89fd309c6af1f7fda23592efaa334c when this epic was created.

#13011 changes only build-tools/automation/yaml-templates/stage-package-tests.yaml: ten lines removed. Ordinary Debug/Release APK/AAB, NativeAOT, isolated JNI leaks and JCW runs remain. Product typemap support and the existing TestsFlavor=CoreCLRTrimmable naming default are preserved. Local validation parsed 49 automation YAML files and checked exact one-invocation removal, retained arguments/callers/defaults and git diff --check. Azure server-side expansion and device execution were not performed locally; no numerical speedup is claimed.

Evidence: prioritize burden, not invented savings

Principal historical sample: build 1624447, PR merge SHA 6f2b9b39e2943853ec4cabc21e9e2a58c7523987. That revision differs from the source-audit baseline. It published 85 runs; all twelve original device-integration slice result files yielded 249 published records.

Workload Observed or source-derived burden Interpretation
Two overwritten CoreCLR Release embedded-DEX rows Sampled durations total 552.507 seconds / 9.2 minutes Incoming true/false is overwritten to false; concrete duplicate configurations
Signing matrix 25 passed cases; 1,335.033 seconds / 22.3 minutes accumulated Sample used a device where all rows ran; ten jarsigner APK rows ignore early on API >=30
Performance cases in regular PR CI Ten records, 718.225 seconds / 12.0 minutes, including three NotExecuted records with real elapsed work Source includes 20 uninstall/install cycles and ten clean design-time builds
Serializer peer-activation cases Three passed cases total 851.013 seconds / 14.2 minutes, including build/install; each has a 60-second negative wait Improve the positive completion oracle; only unnecessary waiting is targeted, not all 14.2 minutes
Explicit CoreCLRTrimmable lane Composite task 459.387 seconds; test-run window 57.470 seconds #13011 removes the invocation, not distinct runtime/package coverage
FastDev simple install/uninstall 49.207 seconds Weaker than retained installation/redeployment tests
BaseTasks async override 5,007 ms in an 8.517-second run Explicit artificial delay is a disproportionate target
BaseTasks locked-copy case 2,510 ms Preserve actual lock exhaustion/release behavior while cheapening
SDK package-manager diagnostic timeout 5,026 ms Meaningful timeout/last-diagnostic coverage: controlled replacement, not blind deletion
Host JVM JNI suite 741 cases; test task ~0.87 s Mac / 3.00 s Windows, excluding publication Keep both complete host OS runs; the expensive containing job is not attributable to these cases
SourceWriter Test task ~0.55 s Mac / 1.85 s Windows Maintenance cleanup, not a material latency target
Modern ZIP repetition Three Repeat(100) attributes imply 297 extra bodies Structural baseline count, not measured savings from the modern sample
Generator setup 57 Roslyn compilations per OS Static calls hidden inside cases; investigate shared immutable inputs

These are accumulated test/task durations, configured waits or static counts—not promised pipeline critical-path savings. Do not add unrelated setup costs or sum parallel slices as wall-clock savings. Retaining an assembly usually retains startup/publication overhead. Missing duration fields are unknown, not zero. Device retry machinery can remove first-attempt failures before publication; final passes are not proof of reliability.

Workstream A — aggressively share expensive build invocations
  • Baseline application checks: combine locale, PDB first/repeat and config-item acceptance into three runtime/config profiles: CoreCLR Debug, CoreCLR Release, NativeAOT Release. Current target is 13 fresh projects ->3, preserving one CoreCLR Debug no-op rebuild and applicable PDB/manifest/warning/output assertions. Distribute locale coverage across profiles; explicitly accept loss of the full locale cross product and separate feature-free app. Define the supported config-file contract before inventing packaging assertions.
  • JNI preload: combine eight fresh arm64+x64 projects into three richer CoreCLR Release profiles: defaults/inclusion/dedup/partial item exclusions; all custom names excluded; global IgnoreAll. Keep both ABIs, required defaults, exact retained/excluded names and multiplicities. Accept loss of isolated no-custom state and some diagnostic precision; do not conflate item exclusions with the global property.
  • CodeBehind negatives: investigate 20 builds ->4 by enabling all five conflict constants in each serial/parallel x runtime profile. Assert every original CS0266 location/type. Before claiming equivalence, demonstrate all five independent diagnostics appear and a mutation eliminating one diagnostic fails its specific assertion while the other four remain. A failed build or one remaining error does not prove all five were detected. Keep positive, DTB and AndroidX cases separate.
  • Resource + asset incremental checks: share initial setup, targeting four build calls ->three per runtime with separate resource-only and asset-only mutations, logs and assertions. Record the changed prior-state gap: the asset edit now follows a resource edit rather than pristine baseline.
  • Preserve independently labeled assertion failures; do not let one PDB assertion hide other output failures. Build failure remains fatal before inspecting outputs. Avoid cross-test mutable caches and an indivisible all-features mega-test that worsens slicing.

The first three designs target 31 fewer fresh projects per full host pass (10+5+16). This is conditional, unimplemented and unmeasured. It includes, rather than adds to, the simple duplicate deletions below.

Relevant source families: BuildTest2, BuildTest3, CodeBehindTests, IncrementalBuildTest under src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/.

Workstream B — device matrix, setup and frequency
  • Remove the two DebuggingTest.ApplicationRunsWithoutDebugger CoreCLR Release embedded-DEX permutations whose incoming parameter is unconditionally reset. Keep both native-library extraction modes and all distinct Debug configurations.
  • Remove FastDevTest.SimpleInstallAndUninstall, retaining stronger installation/uninstallation, typemap-after-edit and redeployment detectors.
  • Collapse BundleTool's obsolete assembly-store boolean axis after checking effective inputs. Preserve CoreCLR/NativeAOT and multi-ABI packaging. Move its three pure command-string checks from twelve heavyweight fixture cases to three host cases.
  • Avoid costly OneTimeSetUp for the already-ignored NativeAOT no-ABI-split BundleTool fixture.
  • Move signing command/password-source/signature permutations to host checks plus a small real-device APK/AAB acceptance set. Retain ChangeKeystoreRedeploy, ToggleDebugReleaseWithSigning, intentional negative install behavior and older-device policy. Host signatures do not replace Android replacement/install transitions.
  • Move PerformanceTest budgets/stress to a documented benchmark cadence or relevant-change gate. Keep functional correctness on PRs; explicitly accept delayed latency-regression detection.
  • Repair JsonDeserializationCreatesJavaHandle to require existing JSON Person deserialized OK output with bounded failure handling. Retain nonzero Java handle and OnDeserialized behavior; do not just remove the wait and retain absence-only success.
  • Split host-only Skia error builds from device positives; strengthen startup/success assertions. The two slowest sampled positives were ~832 s and675 s, which justify investigation, not deletion.
  • Consolidate export workloads only with preserved JNI/GC/configuration/embed boundaries. Retain genuine Gradle/Facebook integration somewhere if reducing its PR frequency.
  • Remove obsolete locale/timezone Node methods only as maintenance: current inspected nightly wiring selects WithSlicer, so zero current execution saving is established for those methods. Verify scheduled selection before moving any exhaustive domains.

Source: tests/MSBuildDeviceIntegration/Tests/ and shared automation templates.

Workstream C — shrink stress/setup only after fixing detection
  • Library Clean: repair the inverted filename-ignore predicate in BuildApplicationWithLibraryAndClean/BuildApplicationAndClean. Demonstrate failure when an ordinary output file remains. Then shrink the three-configuration corpus of 1,000 assets +1,000 resources to compact library/app/readonly representatives; put large directory fan-out on stress cadence if desired.
  • Many assets: consolidate eleven effective CoreCLR success-only builds and inspect archive count/content. Preserve 512-entry/multiple-flush protection: modern ZipArchiveEx has actual 512-entry and100 MiB buffer limits. Add direct511/512/513 helper boundaries before replacing corresponding build coverage; retain multiple-flush stress. Existing1–200KB single-asset rows do not exercise100 MiB.
  • 128-library app: move high-fan-out stress to scheduled/relevant-change coverage while preserving useful small dependency graphs on PRs. Smaller graphs are not equivalent heap/path/command-length/scheduling threshold detectors.
  • Reduce three modern ZIP Repeat(100) attributes while retaining the underlying existence/timestamp/compression regressions. Do not generalize this to resource Repeat(3), whose historical access/write-time bug needs a deterministic replacement first.
  • Consolidate managed ELF writer32-case and symbol/strip24-case matrices with explicit ABI/ELF-class,4/16KB boundary and strip-state pairing. Preserve real writer/load/packaging/symbol checks; these wrappers are managed ELF construction, not clang compilation.
  • Remove four direct data-only dlopen export smokes only with retained writer, packaging and real device-load coverage.
Workstream D — waits, network probes and repeated tooling
  • Replace BaseTasks' explicit five-second async delay with bounded coordination, preserving background logging/completion. Cheapen locked-copy retry scenarios without losing permanent-lock exhaustion/release; beware static cached retry environment settings and unbounded waits.
  • Replace SDK real no-device timeout and emulator flag timeout probes with controlled fake processes/positive launch markers, preserving true timeout/diagnostic/cleanup behavior. Argument validation alone is not a timeout detector.
  • Make Maven/SDK/JDK feed and task-download semantic tests hermetic through faithful fixtures and controlled transport/clock, while retaining a justified live compatibility lane. Maven's28 remote-on-cache-miss cases are not necessarily28 HTTP requests. Real SDK install already skips CI in the audited tooling suite: do not credit nonexistent savings.
  • Share immutable Kotlin fixture production between Bytecode and generator, or commit real-bytecode inputs plus a compiler-refresh lane. Never share mutable Gradle project/cache directories: prior changes deliberately isolated them after corruption. Keep real generator E2E and bytecode raw descriptor/negative-stamp boundaries.
  • Cache immutable generator support syntax trees/references across57 per-OS Roslyn compilations, isolate mutable Cecil data, and consolidate identical enabled UCO Widget/Registry generations without dropping assertions, owner, flag-off or compile branches.
  • Make passing diagnostics failure-only: generator46 snapshot dumps, JavaSource75 eager DumpMessages calls and JCW tooling21 unasserted writes per invocation. Retain/add an explicit path-output detector when removing disk-output exercise.
  • Retire189 statically unreachable generator snapshot/integration output files, 247,119 bytes, using the exact active consumer whitelist. This changes no active test count; do not remove still-consumed target baselines under this task.
  • Compact AIDL's oversized ITelephony golden (83.48% of a540,203-byte corpus) only after preserving typed/String lists, imported returns, mixed in/out arrays, transaction ordering, import and oneway branches.
Workstream E — concrete small deletions/consolidations

Small unit cleanups are mainly maintenance improvements and lower priority than fresh builds. Preserve these named controls:

Candidate Retained detector / explicit limitation
BuildBasicApplicationCheckPdb Initial and repeat assertions in BuildBasicApplicationCheckPdbRepeatBuild
RemoveDirTests.DefaultRetryBehavior NormalDelete; neither successful-first-attempt method proves retry policy
BuildTest3.ExcludeAllCustomLibraries AddSomeCustomLibrariesAndIgnoreAllByName, per-ABI checks
BuildTest3.IgnoreAll_PreservesRequired AddSomeCustomLibrariesAndIgnoreAll, defaults/selective/item controls
FilterAssembliesTests.PackageUrlIsLowercase Calls only a private test helper, not product behavior; keep package classification tests
Runtime JnienvTest.DeleteLrefOnWrongThread Thread never starts, so no wrong-thread coverage currently exists
Runtime HttpClient Ctor_Default, Properties, Properties_Invalid, Send_Invalid Keep actual Android handler transport/cancellation/certificate/marshaling coverage
Two startup-hook guards and weaker typemap/rejection checks Keep actual initialization and stronger owned signature/generic/registration detectors
SourceWriter FieldWriter/MethodWriter Basics Direct ClassWriterTests.Basics; retain interface/property and literal/formatting anchors
Shared JNI GetTypeSignature Retained GetType body assertions
Shared single-method UCO registration duplicate Keep the same selected single case across host/Android plus multi-entry registration
Raw Types_GetJniTypeNameFromInstance Extension wrapper's exact name checks and null/disposed guards
Weaker inherited CollectionContract<T>.CopyTo Exact sequence/exception contracts; explicitly accept small destination-length gap
Host JNI empty VMC methods/copied constructor test Keep meaningful reflection/value-manager contracts; inspect host/Android preprocessor differences
BaseTasks selected file/extraction/scope duplicates Main tranche eight methods/ten cases; retain retry/lock/path/project-isolation boundaries
Maven missing-POM duplicate Keep the raw missing-POM resolver test and distinct public-entrypoint/input/cache behavior
Generator-tooling ordinary namespace parse smoke Generator FixupXmlDocumentTests.ParseNamespaceTransforms
Conditional V1 enum parsing overlaps Keep generator TransientEnumificationTest, AddConstantOnlyTest, RemoveFieldOnlyTest; explicitly record metadata/None-vs-Keep gaps
Nonnull-only JavaTypeSystem/XML resolver smokes Retained meaningful graph/mapping tests; old and modern implementations are not automatically interchangeable
Device JCW EnsureTypesAreBound Remove NUnit runtime no-op but keep Bxc9446 compile witness
  • Select small coherent cleanup batches from this table after checking current source and exact retained controls. Create focused follow-up issues/PRs rather than implementing the whole table at once.

The four shared JNI candidate declarations expand to19 host/18 Android executions. They are four source edits, not independent host and Android deletion lists. The host cleanup union is30 published cases (27 active/3 existing skips), without measured marginal savings. Do not delete a host-only detector because Android skips it.

Workstream F — repair misleading assertions
  • Generator unit NormalizeLineEndings and integration file comparer remove whitespace inside literals, so changed string values can compare equal. Introduce a semantics-preserving comparison policy; compilation is not a literal-value oracle. Preserve direct SourceWriter class/interface/property anchors and account for historical accepted differences.
  • JavaSource Activity corpus discards lazy output: materialize/assert representative output before shrinking historical long-input interactions.
  • Bytecode nullable-field check rereads a method; assert the intended field.
  • Generator obsolete-platform extension check rereads invoker attributes; assert the extension collection.
  • JavaTypeSystem reimport tail uses the original object; inspect the reimported graph.
  • Native JNI missing-length-reset probe starts at zero; seed a nonzero sentinel and assert reset.
  • Remove/wire generator's error scan whose sink receives no writes, preserving actual generation/compile/snapshot checks.
Full audit scope and scale

Counts are baseline static projections unless explicitly marked observed. Do not sum them: shared source, inheritance, repeats, dynamic inputs, category filtering and TFM-qualified cases differ.

Scope Case scale Principal disposition
Xamarin.Android.Build.Tests 1,736 static;1,746 sample identities Build sharing, exact duplicates, corrected Clean/stress
MSBuildDeviceIntegration 253 static +dynamic locale/timezone domains Overwritten axes, fixtures, benchmarks, positive markers
Mono.Android runtime 480 owned Debug sample results No-op/BCL/subset smokes; preserve real Android behavior
Device JCW 45 methods incl.two Explicit isolated cases Compile witness for no-op; preserve DIM/GC/threshold/native paths
AIDL 14 Compact goldens with semantic boundaries
BaseTasks 128 Artificial wait and selected duplicates; preserve retries/scope
Android SDK tooling 409 Selected23-method cleanup, controlled process/network tests
Modern tasks 197 static;494 bodies with Repeat100 Repetition/ELF matrix, protected native and incremental paths
Analyzer 15 incl.one ignored Two redundant/misdirected positives; keep main regression/code fix
Assembly store 14 TFM-qualified No unconditional family deletion; retain legacy/current/size guards
Binding generator 546/OS +57 Roslyn compiles/OS Orphan files, immutable setup, repaired comparison/oracles
JCW tooling 48/OS Identical option rows/writes; preserve constructors/interfaces/exports
API XML Adjuster 13 Setup/non-null cleanup; legacy retirement needs support decision
JavaTypeSystem 17 Compact setup, non-null smoke, reimport oracle
Bytecode 100 Compiler production/dead JDK8 producer; preserve old formats
Generator tooling 18 Cross-suite parser cleanup; keep V2 deprecation parsing
JavaSource 41 Failure-only diagnostics/root smokes; strengthen Activity corpus
SourceWriter 11 Two direct duplicates; retain exact rendering anchors and bothOS
Maven 106 Exact duplicate +offline POM semantics/live compatibility
Host JVM JNI 741 No-op/duplicate cleanup, not whole-host-run removal
Android imported JNI 339 ordinary CoreCLR Small shared cleanup; keep ART/GC/AOT/trim distinctions
Java source utilities 18 JUnit methods Unused compile setup/diagnostics; protect shared corpus/OS output
Cross-project constraints and protected coverage
  • Keep generator namespace/V1 enum detectors if their tooling parser smokes are pruned. V2 CSV deprecation parsing is not replaced by tests that assign DeprecatedSince directly.
  • Keep KotlinInlineClassEndToEndTests.GeneratorProjectsRealKotlinInlineClassesAsStructs and bytecode raw descriptor/Widgets-not-inline/stamp negatives.
  • Keep both linked NativeTool helper test assemblies while net10 and NET11+ compile different Capture implementations, despite identical source.
  • Preserve distinct OS/ABI, CoreCLR/NativeAOT, APK/AAB, trim/R8, ownership/GC, exception, error and incremental-recovery boundaries.
  • Host JVM tests do not replace ART/Android peer/GC/trim behavior; Android skips do not make host reflection/remapping/native-table contracts redundant.
  • Keep the NativeAOT18x18 dictionary shape map: off-diagonal shapes matter;648 internal conversions are one case, not648 redundant NUnit cases.
  • A40-entry blittable registration test protects multi-entry count/buffer behavior but does not exercise the nonblittable overload's >32 stack/heap branch.
  • Dead JDK8 producer cleanup does not retire old classfile/Kotlin metadata readers. A1GiB assembly-store size guard uses a13-byte header, not a huge allocation. Preserve supported legacy/current formats.
  • Keep local dotnet wrapper/template smoke, file-app compile/run checks, unique host NativeAOT/JVM loading smoke and MAUI arm/arm64 default/full-R2R distinctions. Their weak return-value/liveness assertions can improve, but no deletion equivalence was established. Keep the small fork/non-fork Helix environment test.
Evidence caveats and related work

Android TRX identifies inherited tests under generic declaring bases and loses concrete fixture/assembly identity. Main/imported JavaObjectExtensionsTests also collide. Correct reconciliation is 819 Debug results =480 owned +339 imported, with imported335 Passed/4 NotExecuted. Missing per-case Android durations are not zero. Avoid fixture-prefix matching to infer absent coverage.

The build suite's1,736 static vs1,746 sample discrepancy remains unresolved; do not silently assert exact-baseline discovery. Modern197 vs187 sample was traced to ten migrated ZIP/archive tests, not a TFM exclusion. NotExecuted can include setup; final results can conceal removed retry failures. Source/commit counts are not timing, flakiness or lifetime effectiveness.

Observed historical failures include build1623855 GradleFBProj((True, NativeAOT)) on retry (288,670ms), and main build1622982 NativeAOT/CoreCLR DotNetPublish failures (55,236/36,833ms). These do not establish cause or flake rate; preserve meaningful publish/runtime coverage.

Related existing issues—reuse their scope, do not create competing cleanup plans:

  • #11843: Java.Interop component/sample/test retirement; keep product-dependent tools until replacements exist.
  • #11727: JavaInterop1 codegen/runtime/baseline retirement. Support removal must precede deleting still-active target detectors.
  • #12995: interop implementation convergence; coordinate runtime/support assumptions with the two issues above.
  • #12721: on-device NUnit-to-MSTest migration; coordinate identities/filters/rooting and update lane expectations when #13011 lands.
  • #12031: process-wide JNI count assertion reliability; isolation/repair, not blanket leak-test deletion.
  • #12929: wider CI flakiness history, with correlation and retry caveats; follow-up to#12704.
  • #10319 (closed): prior BCL suite pruning preserved useful NetworkChange coverage by moving it.
  • #7777 (closed): prior ignored-category audit restored missing coverage rather than reducing execution cost.
Acceptance criteria / definition of done
  • Each selected task ships in a focused, linked PR, or has an explicit retain/reject/defer decision with rationale. Remaining items can become follow-up issues; do not hold useful early changes for the whole epic.
  • Each deletion names retained detectors and lost diagnostic/coverage behavior; accepted gaps and frequency delays are explicit.
  • Weak-oracle repairs fail on deliberately injected faults before corpus/matrix reductions rely on them. Combined negatives prove every diagnostic independently.
  • Baseline/after discovery, ignores and protected configuration/ABI/category domains are compared at the actual implementation revision.
  • Appropriate local build/test/template validation is recorded before pushing. Scheduled replacements demonstrably run; CI is additional coverage, not the first debugging loop.
  • Measure fresh/warm build counts, fixture/setup cost, targeted elapsed time and enclosing job/slice behavior separately. Report actual results, not sums of parallel task times as speedup.
  • Preserve clear per-scenario logs and useful failure localization. No broad shared mutable fixture/cache or unsliceable mega-test merely to lower NUnit case counts.
Steps to Reproduce
  1. Inspect the baseline-linked source tree and CI wiring: stage-package-tests.yaml, stage-java-interop-tests.yaml -> Java.Interop core-tests.yaml, stage-xamarin-android-tools-tests.yaml, build-windows-steps.yaml and sliced NUnit/device templates under build-tools/automation/yaml-templates/.
  2. Inspect the concrete methods and parameter domains above. Reproduce overwritten Release embedded-DEX inputs, success-only duplicate builds, the Clean predicate's handling of an ordinary leftover file and negative-only serializer wait using focused local tests as each task is implemented.
  3. Compare historical published runs/timeline in build1624447, remembering its merge SHA differs from the source audit. For implementation, collect same-revision before/after discovery and measurements rather than assuming historic counts are current.
  4. Execute individual follow-up tasks using the repository's documented local SDK/host/device test commands and preserve named controls. Start with high-confidence duplicate build/device work, then conditional sharing and oracle repair.

This is an incremental engineering epic, not a single customer repro or one failing test.

Did you find any workaround?

N/A. #13011 is the first focused implementation and is open. Other proposals remain unimplemented; skipping whole test suites or repeatedly retrying CI is not the intended solution.

Relevant log output

No new local test runs were performed for the read-only audit. Historical evidence: sample PR build1624447, contrasting PR build1623855, main build1622982 and #12929. Exact #13011 local validation commands/results are recorded in its PR description. See the evidence/limitations above; no lifetime never-failed claim or guaranteed wall-clock saving is made.

Dominant language
C#
Stars
2.1k
Forks
579
Avg merge
2d 5h
Merged PRs (30d)
222

Getting set up

  • No Dockerfile or Docker Compose file
  • Has a pull request template
  • No contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from dotnet/android

All issues in dotnet/android

Similar issues

More C# issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.