[Epic] Reduce CI test cost by pruning and consolidating low-value tests
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 45/100
Hướng nghiên cứu
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.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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
b0bcd38c0e89fd309c6af1f7fda23592efaa334cwhen 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.ApplicationRunsWithoutDebuggerCoreCLR 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
JsonDeserializationCreatesJavaHandleto require existingJSON Person deserialized OKoutput 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.GeneratorProjectsRealKotlinInlineClassesAsStructsand 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
- Inspect the baseline-linked source tree and CI wiring:
stage-package-tests.yaml,stage-java-interop-tests.yaml-> Java.Interopcore-tests.yaml,stage-xamarin-android-tools-tests.yaml,build-windows-steps.yamland sliced NUnit/device templates underbuild-tools/automation/yaml-templates/. - 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.
- 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.
- 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.
- Ngôn ngữ chính
- C#
- Star
- 2.1k
- Fork
- 579
- Merge trung bình
- 2 ngày 5 giờ
- Pull request đã merge (30 ngày)
- 222
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Không có hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của dotnet/android
-
Area: App+Library Build
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 1 ngày
-
EditText.getText() isn't boundĐang mởArea: Mono.Android
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
dotnet/android#9192 · 4 bình luận · 1 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
-
agentic-workflows needs-triage
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Investigate JNI reference ownership leaks and GC-bridge leak-check reliabilityCó thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mởneeds-triage
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 50/100
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement needs-triage
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 35/100
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của dotnet/android
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
stryker-mutator/stryker-net#3892 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
MobiFlight/MobiFlight-Connector#3419 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
documentation
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
-
`Source` with an `avares://` URI and a `#fragment` throws instead of scrolling to the anchorĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
Kryptos-FR/MarkView.Avalonia#105 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[辞書]Đang mở提案 辞書
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
Maintainer thường phản hồi trong vòng 1 ngày