Compare commits

...

2 Commits

Author SHA1 Message Date
Tony 6e9aab2ce7 Point updater docs at GitHub Flutter fork
ci / ✅ Semantic Pull Request (push) Has been cancelled
ci / 🔤 Check Spelling (push) Has been cancelled
ci / 👀 Detect Changes (push) Has been cancelled
Shorebird CI / changes (push) Has been cancelled
Shorebird CI / CSpell (push) Has been cancelled
ci / 🦀 Build ${{ matrix.crate }} (${{ matrix.os }}) (push) Has been cancelled
ci / 🎯 Build ${{ matrix.package }} (push) Has been cancelled
ci / ci (push) Has been cancelled
Shorebird CI / shorebird_code_push (push) Has been cancelled
Shorebird CI / shorebird_code_push_example (push) Has been cancelled
Shorebird CI / required (push) Has been cancelled
2026-06-26 01:40:25 +08:00
Tony 5d4e9c3396 refactor: improve comments for clarity and update privacy references
ci / ✅ Semantic Pull Request (push) Has been cancelled
ci / 🔤 Check Spelling (push) Has been cancelled
ci / 👀 Detect Changes (push) Has been cancelled
Shorebird CI / changes (push) Has been cancelled
Shorebird CI / CSpell (push) Has been cancelled
ci / 🦀 Build ${{ matrix.crate }} (${{ matrix.os }}) (push) Has been cancelled
ci / 🎯 Build ${{ matrix.package }} (push) Has been cancelled
ci / ci (push) Has been cancelled
Shorebird CI / shorebird_code_push (push) Has been cancelled
Shorebird CI / shorebird_code_push_example (push) Has been cancelled
Shorebird CI / required (push) Has been cancelled
Signed-off-by: Tony <tonylu@tony-cloud.com>
2026-06-25 15:50:24 +08:00
9 changed files with 38 additions and 22 deletions
+1 -2
View File
@@ -89,8 +89,7 @@ bool shorebird_check_for_downloadable_update(const char *c_channel);
* to their own stable account/device identifier. The updater persists this
* value in state.json after a successful call.
*/
SHOREBIRD_EXPORT
bool shorebird_set_device_id_override(const char *c_device_id);
SHOREBIRD_EXPORT bool shorebird_set_device_id_override(const char *c_device_id);
/**
* Synchronously download an update on the first non-null channel of:
+3 -2
View File
@@ -169,7 +169,8 @@ pub(crate) fn open_base_lib(apks_dir: &Path, lib_name: &str) -> anyhow::Result<B
// https://chromium.googlesource.com/chromium/src/base/+/a5ca5def0453df367b9c42e9817a33d2a21e75fe/android/java/src/org/chromium/base/library_loader/Linker.java
// Previously I tried reading libapp.so from from the AssetManager, but
// it does show the lib/ directory in the list of assets.
// https://github.com/shorebirdtech/updater/pull/6
// Historical updater context: this avoids reading libapp.so via
// AssetManager.
// Ideally we would do this apk reading from the C++ side and keep the rust
// portable, but we have a zip library here, and don't on the C++ side.
@@ -245,7 +246,7 @@ pub fn libapp_path_from_settings(original_libapp_paths: &[String]) -> Result<Pat
// path to the libapp.so file. This is true for the current engine, but
// may not be true in the future. Better would be for the engine to
// pass us the path to the base.apk.
// https://github.com/shorebirdtech/shorebird/issues/283
// This is fragile because Flutter passes multiple libapp paths here.
// This is where the paths are set today:
// First path is "libapp.so" (for dlopen), second is a full path:
// https://github.com/flutter/engine/blob/a7c9cc58a71c5850be0215ab1997db92cc5e8d3e/shell/platform/android/io/flutter/embedding/engine/loader/FlutterLoader.java#L264
+1 -1
View File
@@ -15,7 +15,7 @@
// buckets. They are not `extern "C"`, so cbindgen never emits them.
//
// Engine-side usage lives at `engine/src/flutter/shell/common/shorebird/updater.cc`
// in the Shorebird Flutter monorepo: <https://github.com/shorebirdtech/flutter>.
// in the open Flutter fork: <https://github.com/tony-cloud/flutter>.
use std::ffi::{CStr, CString};
use std::os::raw::c_char;
+1 -1
View File
@@ -72,7 +72,7 @@ pub struct UpdaterState {
struct SerializedState {
/// Stable per-install ID. Survives release-version changes; only
/// reset when the app is uninstalled. Used for analytics.
/// <https://shorebird.dev/privacy/>
/// Treat this as privacy-sensitive update-server metadata.
client_id: String,
/// The release version this cache corresponds to. Mismatch with the
/// app's reported release version triggers a wipe of all per-release
+24 -6
View File
@@ -13,12 +13,7 @@ use std::sync::Mutex;
// cbindgen looks for const, ignore these so it doesn't warn about them.
/// cbindgen:ignore
#[cfg(test)]
const DEFAULT_BASE_URL: &str = "DEFAULT_BASE_URL should be mocked using mockito::Server";
/// cbindgen:ignore
#[cfg(not(test))]
const DEFAULT_BASE_URL: &str = "https://api.shorebird.dev";
const DEFAULT_BASE_URL: &str = "http://localhost:8080";
/// cbindgen:ignore
const DEFAULT_CHANNEL: &str = "stable";
@@ -279,6 +274,29 @@ mod tests {
Ok(())
}
// These tests are serial because they modify global state.
#[serial]
#[test]
fn set_config_defaults_to_open_self_hosted_server() -> Result<()> {
testing_reset_config();
let mut yaml = fake_yaml();
yaml.base_url = None;
set_config(
fake_app_config(),
Box::new(FakeExternalFileProvider {}),
"first_path".into(),
&yaml,
NetworkHooks::default(),
)?;
let config = super::with_config(|config| Ok(config.clone())).unwrap();
assert_eq!(config.base_url, super::DEFAULT_BASE_URL);
Ok(())
}
// These tests are serial because they modify global state.
#[serial]
#[test]
+2 -3
View File
@@ -46,9 +46,8 @@ impl<'de> Deserialize<'de> for EventType {
}
}
}
/// Any edits to this struct should be made carefully and in accordance
/// with our privacy policy:
/// <https://docs.shorebird.dev/privacy>
/// Any edits to this struct should be made carefully and in accordance with
/// the configured update server's privacy policy.
/// An event that is sent to the server when a patch is successfully installed.
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct PatchEvent {
+3 -5
View File
@@ -219,17 +219,15 @@ pub struct Patch {
pub hash_signature: Option<String>,
}
/// Any edits to this struct should be made carefully and in accordance
/// with our privacy policy:
/// <https://docs.shorebird.dev/privacy>
/// Any edits to this struct should be made carefully and in accordance with
/// the configured update server's privacy policy.
/// The request body for the patch check endpoint.
#[derive(Debug, Serialize)]
pub struct PatchCheckRequest {
/// The Shorebird app_id built into the shorebird.yaml in the app.
/// app_ids are unique to each app and are used to identify the app
/// within Shorebird's system (similar to a bundle identifier). They
/// within the update server (similar to a bundle identifier). They
/// are not secret and are safe to share publicly.
/// <https://docs.shorebird.dev/concepts>
pub app_id: String,
/// The Shorebird channel built into the shorebird.yaml in the app.
/// This is not currently used, but intended for future use to allow
+2 -1
View File
@@ -338,7 +338,8 @@ fn check_hash(path: &Path, expected_string: &str) -> anyhow::Result<()> {
// This is a common error for developers. We could avoid it entirely
// by sending the hash of `libapp.so` to the server and having the
// server only send updates when the hash matches.
// https://github.com/shorebirdtech/updater/issues/56
// A hash mismatch usually means the same version number was reused with a
// different app binary.
if !hash_matches {
bail!(
"Update rejected: hash mismatch. Update was downloaded but \
+1 -1
View File
@@ -23,4 +23,4 @@ For an Updater function to be visible to the Dart code, it must:
`dart run ffigen`. ffigen reads only `updater_dart.h`, so engine-only
symbols are not bound.
1. Android specific: be listed in
https://github.com/shorebirdtech/flutter/blob/shorebird/dev/engine/src/flutter/shell/platform/android/android_exports.lst
https://github.com/tony-cloud/flutter/blob/tonycloud/dev/engine/src/flutter/shell/platform/android/android_exports.lst