docs: publish channels: main

This commit is contained in:
github-actions[bot] committed 2026-07-30 12:47:16 +00:00
1 parent 867612bbe2
commit 1004fceb22
9 files changed
+9 -9

No files matched your search

File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
+1 -1
View File
@@ -40391,7 +40391,7 @@
},"5770": {
"doc": "Testing",
"title": "Test Categories",
"content": "KMP Unit Tests (commonTest) . Shared tests that run on all platforms: ./gradlew allTests . | Business logic tests | Data model validation | Search/ranking algorithm tests | Route serialization tests | . Android Host Tests . Android-specific tests that run on JVM: ./gradlew test . | ViewModel tests | Repository tests with Room fakes | Android-specific integration tests | . Compose UI Tests . Compose Multiplatform UI test framework: . @Test fun myScreenTest() = runComposeUiTest { setContent { MyScreen() } onNodeWithText(\"Expected\").assertIsDisplayed() } . Located in commonTest or jvmTest source sets. Screenshot Tests . Uses Android Gradle Plugins native (layoutlib) screenshot testing framework, split across two modules: . | :screenshot-tests — the visual-regression gate. CI runs validateDebugScreenshotTest on it; reframing one of these baselines is a real diff to review. Holds atomic, dual-purpose components. | :docs-screenshots — generate-only, not validated in CI. Holds doc-framed compositions whose framing is tuned for the docs site, so reframing a doc image never churns the regression gate. | ./gradlew :screenshot-tests:updateDebugScreenshotTest # record regression goldens ./gradlew :screenshot-tests:validateDebugScreenshotTest # compare against goldens (CI gate) ./gradlew :docs-screenshots:updateDebugScreenshotTest # record doc-framed composition images ./gradlew :screenshot-tests:copyDocsScreenshots # copy doc images from BOTH modules into docs/assets . Rendering is host-deterministic here (layoutlib): a local update produces references byte-identical to CI, so locally-recorded goldens pass validate. See docs/assets/screenshots/README.md for which module a new screenshot belongs in. Baseline Profile / Startup Performance . The :baselineprofile module (#5735) generates a Baseline Profile for :androidApp, AOT-compiling the hot startup paths so ART doesnt pay the JIT cost on first launch. It targets the google flavor (the variant most users run). The Macrobenchmark generator (BaselineProfileGenerator) and the before/after benchmark (StartupBenchmark) live in baselineprofile/src/main/kotlin/org/meshtastic/baselineprofile/. Both run on a device/emulator: ./gradlew :androidApp:generateGoogleReleaseBaselineProfile # Generate the profile (commit the output) ./gradlew :androidApp:benchmarkGoogleReleaseBaselineProfile # Quantify the cold-start win . The generated profile is merged into androidApp/src/googleRelease/generated/baselineProfiles/ and packaged into release builds via androidx.profileinstaller. ⚠️ Warning: The journey currently covers cold start only (launch → first frame), because CI has no paired radio. Post-connection screens (node list, map, message thread) are not yet AOT-compiled; extend the journey once a fake transport or connected device is wired into the harness. ",
"content": "KMP Unit Tests (commonTest) . Shared tests that run on all platforms: ./gradlew allTests . | Business logic tests | Data model validation | Search/ranking algorithm tests | Route serialization tests | . Android Host Tests . Android-specific tests that run on JVM: ./gradlew test . | ViewModel tests | Repository tests with Room fakes | Android-specific integration tests | . Compose UI Tests . Compose Multiplatform UI test framework: . @Test fun myScreenTest() = runComposeUiTest { setContent { MyScreen() } onNodeWithText(\"Expected\").assertIsDisplayed() } . Located in commonTest or jvmTest source sets. Screenshot Tests . Uses Android Gradle Plugins native (layoutlib) screenshot testing framework, split across two modules: . | :screenshot-tests — the visual-regression gate. CI runs validateDebugScreenshotTest on it; reframing one of these baselines is a real diff to review. Holds atomic, dual-purpose components. | :docs-screenshots — generate-only, not validated in CI. Holds doc-framed compositions whose framing is tuned for the docs site, so reframing a doc image never churns the regression gate. | ./gradlew :screenshot-tests:updateDebugScreenshotTest # record regression goldens ./gradlew :screenshot-tests:validateDebugScreenshotTest # compare against goldens (CI gate) ./gradlew :docs-screenshots:updateDebugScreenshotTest # record doc-framed composition images ./gradlew :screenshot-tests:copyDocsScreenshots # copy doc images from BOTH modules into docs/assets . Rendering is host-deterministic here (layoutlib): a local update produces references byte-identical to CI, so locally-recorded goldens pass validate. See docs/assets/screenshots/README.md for which module a new screenshot belongs in. Baseline Profile / Startup Performance . The :baselineprofile module (#5735) generates a Baseline Profile for :androidApp, AOT-compiling the hot startup paths so ART doesnt pay the JIT cost on first launch. It targets the google flavor (the variant most users run). The Macrobenchmark generator (BaselineProfileGenerator) and the before/after benchmark (StartupBenchmark) live in baselineprofile/src/main/kotlin/org/meshtastic/baselineprofile/. Both run on a device/emulator: ./gradlew :androidApp:generateGoogleReleaseBaselineProfile # Generate the profile (commit the output) ./gradlew :androidApp:benchmarkGoogleReleaseBaselineProfile # Quantify the cold-start win . The generated profile is merged into androidApp/src/google/generated/baselineProfiles/ and packaged into release builds via androidx.profileinstaller. ⚠️ Warning: The journey currently covers cold start only (launch → first frame), because CI has no paired radio. Post-connection screens (node list, map, message thread) are not yet AOT-compiled; extend the journey once a fake transport or connected device is wired into the harness. ",
"url": "/Meshtastic-Android/main/en/developer/testing.html#test-categories",
"relUrl": "/en/developer/testing.html#test-categories"
+1 -1
View File
@@ -79,7 +79,7 @@ The Macrobenchmark generator (`BaselineProfileGenerator`) and the before/after b
./gradlew :androidApp:benchmarkGoogleReleaseBaselineProfile # Quantify the cold-start win
```
The generated profile is merged into `androidApp/src/googleRelease/generated/baselineProfiles/` and packaged into release builds via `androidx.profileinstaller`.
The generated profile is merged into `androidApp/src/google/generated/baselineProfiles/` and packaged into release builds via `androidx.profileinstaller`.
> ⚠️ **Warning:** The journey currently covers cold start only (launch → first frame), because CI has no paired radio. Post-connection screens (node list, map, message thread) are not yet AOT-compiled; extend the journey once a fake transport or connected device is wired into the harness.
+1 -1
View File
@@ -11,7 +11,7 @@
./gradlew :screenshot-tests:copyDocsScreenshots <span class="c"># copy doc images from BOTH modules into docs/assets</span>
</code></pre></div></div> <p>Rendering is host-deterministic here (layoutlib): a local <code class="language-plaintext highlighter-rouge">update</code> produces references byte-identical to CI, so locally-recorded goldens pass <code class="language-plaintext highlighter-rouge">validate</code>. See <code class="language-plaintext highlighter-rouge">docs/assets/screenshots/README.md</code> for which module a new screenshot belongs in.</p> <h3 id="baseline-profile--startup-performance"> <a href="#baseline-profile--startup-performance" class="anchor-heading" aria-labelledby="baseline-profile--startup-performance"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Baseline Profile / Startup Performance </h3> <p>The <code class="language-plaintext highlighter-rouge">:baselineprofile</code> module (#5735) generates a <a href="https://developer.android.com/topic/performance/baselineprofiles/overview">Baseline Profile</a> for <code class="language-plaintext highlighter-rouge">:androidApp</code>, AOT-compiling the hot startup paths so ART doesnt pay the JIT cost on first launch. It targets the <strong>google</strong> flavor (the variant most users run).</p> <p>The Macrobenchmark generator (<code class="language-plaintext highlighter-rouge">BaselineProfileGenerator</code>) and the before/after benchmark (<code class="language-plaintext highlighter-rouge">StartupBenchmark</code>) live in <code class="language-plaintext highlighter-rouge">baselineprofile/src/main/kotlin/org/meshtastic/baselineprofile/</code>. Both run on a device/emulator:</p> <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./gradlew :androidApp:generateGoogleReleaseBaselineProfile <span class="c"># Generate the profile (commit the output)</span>
./gradlew :androidApp:benchmarkGoogleReleaseBaselineProfile <span class="c"># Quantify the cold-start win</span>
</code></pre></div></div> <p>The generated profile is merged into <code class="language-plaintext highlighter-rouge">androidApp/src/googleRelease/generated/baselineProfiles/</code> and packaged into release builds via <code class="language-plaintext highlighter-rouge">androidx.profileinstaller</code>.</p> <blockquote> <p>⚠️ <strong>Warning:</strong> The journey currently covers cold start only (launch → first frame), because CI has no paired radio. Post-connection screens (node list, map, message thread) are not yet AOT-compiled; extend the journey once a fake transport or connected device is wired into the harness.</p> </blockquote> <h2 id="test-organization"> <a href="#test-organization" class="anchor-heading" aria-labelledby="test-organization"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Test Organization </h2> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>feature/my-feature/src/
</code></pre></div></div> <p>The generated profile is merged into <code class="language-plaintext highlighter-rouge">androidApp/src/google/generated/baselineProfiles/</code> and packaged into release builds via <code class="language-plaintext highlighter-rouge">androidx.profileinstaller</code>.</p> <blockquote> <p>⚠️ <strong>Warning:</strong> The journey currently covers cold start only (launch → first frame), because CI has no paired radio. Post-connection screens (node list, map, message thread) are not yet AOT-compiled; extend the journey once a fake transport or connected device is wired into the harness.</p> </blockquote> <h2 id="test-organization"> <a href="#test-organization" class="anchor-heading" aria-labelledby="test-organization"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Test Organization </h2> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>feature/my-feature/src/
├── commonTest/kotlin/org/meshtastic/feature/myfeature/
│ ├── MyBusinessLogicTest.kt
│ └── MyModelTest.kt
+1 -1
View File
@@ -29,7 +29,7 @@
{"id":"navigation-and-deep-links","title":"Navigation & Deep Links","section":"developer","locale":"en","resourcePath":"docs/developer/navigation-and-deep-links.html","navOrder":4,"keywords":["navigation", "deep", "links", "route", "architecture", "hierarchy", "conventions", "link", "router", "uri", "format", "supported", "backstack", "synthesis", "adding", "entry", "registration", "testing"],"aliases":["deeplinks", "navigation-3", "routes"],"charCount":6867},
{"id":"persistence","title":"Persistence","section":"developer","locale":"en","resourcePath":"docs/developer/persistence.html","navOrder":6,"keywords":["persistence", "room", "kmp", "database", "key", "points", "what", "stored", "datastore", "preferences", "core", "prefs", "docs", "intentionally", "skip", "best", "practices"],"aliases":["room", "database", "datastore", "prefs"],"charCount":3274},
{"id":"test-builds","title":"Test Builds & Obtainium","section":"developer","locale":"en","resourcePath":"docs/developer/test-builds.html","navOrder":10,"keywords":["test", "builds", "obtainium", "which", "channels", "can", "reach", "one", "tap", "setup", "how", "many", "entries", "you", "have", "once", "manual", "stable", "open", "beta", "closed", "bleeding", "edge", "newest", "promoted", "build", "any", "channel", "snapshot", "latest"],"aliases":["test-builds", "obtainium", "beta", "snapshot"],"charCount":20567},
{"id":"testing","title":"Testing","section":"developer","locale":"en","resourcePath":"docs/developer/testing.html","navOrder":7,"keywords":["testing", "test", "categories", "kmp", "unit", "tests", "commontest", "android", "host", "compose", "screenshot", "baseline", "profile", "startup", "performance", "organization", "guidelines", "don", "running", "all", "specific", "module", "code", "quality", "full", "verification", "integration"],"aliases":["tests", "unit-tests", "screenshot-tests"],"charCount":4673},
{"id":"testing","title":"Testing","section":"developer","locale":"en","resourcePath":"docs/developer/testing.html","navOrder":7,"keywords":["testing", "test", "categories", "kmp", "unit", "tests", "commontest", "android", "host", "compose", "screenshot", "baseline", "profile", "startup", "performance", "organization", "guidelines", "don", "running", "all", "specific", "module", "code", "quality", "full", "verification", "integration"],"aliases":["tests", "unit-tests", "screenshot-tests"],"charCount":4666},
{"id":"transport","title":"Transport","section":"developer","locale":"en","resourcePath":"docs/developer/transport.html","navOrder":5,"keywords":["transport", "abstraction", "bluetooth", "low", "energy", "ble", "key", "classes", "usb", "serial", "tcp", "factory", "connection", "lifecycle", "adding", "new"],"aliases":["ble", "serial", "tcp", "radio-transport"],"charCount":3210},
{"id":"android-auto","title":"Android Auto","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2937},
{"id":"app-functions","title":"App Functions","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516},