feat: android asset hotreloading (#3332)
This commit is contained in:
1 parent
6a10fd8d78
commit
ca70e8660d
4 files changed
+36
-8
No files matched your search
@@ -164,7 +164,7 @@ impl AppHandle {
|
||||
/// This will return the bundled name of the asset such that we can send it to the clients letting
|
||||
/// them know what to reload. It's not super important that this is robust since most clients will
|
||||
/// kick all stylsheets without necessarily checking the name.
|
||||
pub(crate) fn hotreload_bundled_asset(&self, changed_file: &PathBuf) -> Option<PathBuf> {
|
||||
pub(crate) async fn hotreload_bundled_asset(&self, changed_file: &PathBuf) -> Option<PathBuf> {
|
||||
let mut bundled_name = None;
|
||||
|
||||
// Use the build dir if there's no runtime asset dir as the override. For the case of ios apps,
|
||||
@@ -202,6 +202,25 @@ impl AppHandle {
|
||||
}
|
||||
}
|
||||
|
||||
// If the emulator is android, we need to copy the asset to the device with `adb push asset /data/local/tmp/dx/assets/filename.ext`
|
||||
if self.app.build.build.platform() == Platform::Android {
|
||||
if let Some(bundled_name) = bundled_name.as_ref() {
|
||||
let target = format!("/data/local/tmp/dx/{}", bundled_name.display());
|
||||
tracing::debug!("Pushing asset to device: {target}");
|
||||
let res = tokio::process::Command::new("adb")
|
||||
.arg("push")
|
||||
.arg(changed_file)
|
||||
.arg(target)
|
||||
.output()
|
||||
.await
|
||||
.context("Failed to push asset to device");
|
||||
|
||||
if let Err(e) = res {
|
||||
tracing::debug!("Failed to push asset to device: {e}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Now we can return the bundled asset name to send to the hotreload engine
|
||||
bundled_name
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ pub(crate) async fn serve_all(mut args: ServeArgs) -> Result<()> {
|
||||
|
||||
// if change is hotreloadable, hotreload it
|
||||
// and then send that update to all connected clients
|
||||
if let Some(hr) = runner.attempt_hot_reload(files) {
|
||||
if let Some(hr) = runner.attempt_hot_reload(files).await {
|
||||
// Only send a hotreload message for templates and assets - otherwise we'll just get a full rebuild
|
||||
if hr.templates.is_empty()
|
||||
&& hr.assets.is_empty()
|
||||
|
||||
@@ -157,7 +157,7 @@ impl AppRunner {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) fn attempt_hot_reload(
|
||||
pub(crate) async fn attempt_hot_reload(
|
||||
&mut self,
|
||||
modified_files: Vec<PathBuf>,
|
||||
) -> Option<HotReloadMsg> {
|
||||
@@ -183,7 +183,7 @@ impl AppRunner {
|
||||
|
||||
// Otherwise, it might be an asset and we should look for it in all the running apps
|
||||
for runner in self.running.values() {
|
||||
if let Some(bundled_name) = runner.hotreload_bundled_asset(&path) {
|
||||
if let Some(bundled_name) = runner.hotreload_bundled_asset(&path).await {
|
||||
// todo(jon): don't hardcode this here
|
||||
let asset_relative = PathBuf::from("/assets/").join(bundled_name);
|
||||
assets.push(asset_relative);
|
||||
|
||||
Reference in new issue
Block a user