From 969b1f47078b506d84349724d345cb04f3a39617 Mon Sep 17 00:00:00 2001 From: Bearice Ren Date: Tue, 8 Jul 2025 14:39:24 +0900 Subject: [PATCH] Optimize binary size with icon compression and build optimizations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Compress all icons into single chunk using gzip for better compression - Add aggressive compiler optimizations for smaller release binaries - Refactor icon loading to decompress single chunk at runtime - Update app icon and preserve original as backup - Add flate2 dependency for compression support 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- Cargo.lock | 35 ++++++++ Cargo.toml | 9 ++ assets/appIcon-orginal.ico | Bin 0 -> 285478 bytes assets/appIcon.ico | Bin 285478 -> 19454 bytes build.rs | 172 +++++++++++++++++++++++++++++-------- src/icon_manager.rs | 80 +++++++++++------ src/main.rs | 24 ++---- 7 files changed, 239 insertions(+), 81 deletions(-) create mode 100644 assets/appIcon-orginal.ico diff --git a/Cargo.lock b/Cargo.lock index 7f3ded9..f6d4d51 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,46 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "cfg-if" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "flate2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + [[package]] name = "proc-macro2" version = "1.0.95" @@ -30,6 +64,7 @@ dependencies = [ name = "rust_cat" version = "2.0.0" dependencies = [ + "flate2", "trayicon", "windows", "winreg", diff --git a/Cargo.toml b/Cargo.toml index 707d7b1..b62f5d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" [dependencies] trayicon = "0.2.0" winreg = "0.55.0" +flate2 = "1.0" [dependencies.windows] version = "0.61" @@ -19,8 +20,16 @@ features = [ "Win32_System_SystemInformation" ] +[profile.release] +opt-level = "z" # Optimize for size +strip = true # Strip debug symbols +lto = true # Enable Link Time Optimization +codegen-units = 1 # Reduce code generation units +panic = "abort" # Reduce panic code size + [build-dependencies] winres = "0.1" +flate2 = "1.0" [package.metadata.winres] OriginalFilename = "rust_cat.exe" diff --git a/assets/appIcon-orginal.ico b/assets/appIcon-orginal.ico new file mode 100644 index 0000000000000000000000000000000000000000..50235561142db66377ad57c891331809284d6919 GIT binary patch literal 285478 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

Ts;I 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 literal 0 HcmV?d00001 diff --git a/assets/appIcon.ico b/assets/appIcon.ico index 50235561142db66377ad57c891331809284d6919..80246899a03f5d12cd9bbd5ae476f431adb9628e 100644 GIT binary patch literal 19454 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 literal 285478 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

Ts;I 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 diff --git a/build.rs b/build.rs index b1b9cac..7ddff06 100644 --- a/build.rs +++ b/build.rs @@ -1,5 +1,6 @@ -use std::{io, path::Path}; +use std::{io, path::Path, collections::HashMap}; use winres::WindowsResource; +use flate2::{write::GzEncoder, Compression}; fn main() -> io::Result<()> { // Get Git commit hash @@ -36,45 +37,140 @@ fn main() -> io::Result<()> { fn generate_icon_resources() -> io::Result<()> { let out_dir = std::env::var_os("OUT_DIR").unwrap(); - let dest_path = Path::new(&out_dir).join("icons.rs"); - let themes = ["light", "dark"]; - let names = [("cat", 5), ("parrot", 10usize)]; - let mut code = vec![]; - for theme in themes.iter() { - for (name, count) in names.iter() { - code.push(generate_icon_resources_array(theme, name, *count)); + let dest_path = Path::new(&out_dir).join("icon_data.rs"); + + // Define icon configurations that match the icon manager structure + let icon_configs = [ + ("cat", [("light", 5), ("dark", 5)]), + ("parrot", [("light", 10), ("dark", 10)]), + ]; + + // Concatenate ALL icons into one big chunk for maximum compression + let (compressed_data, icon_metadata) = generate_all_icons_compressed(&icon_configs)?; + + // Generate code with single compressed chunk + let code = generate_single_chunk_module(&compressed_data, &icon_metadata); + + std::fs::write(&dest_path, code.as_bytes()) +} + +// Icon metadata for the single compressed chunk +#[derive(Debug)] +struct IconGroupMetadata { + icon_name: String, + theme: String, + offset: usize, + sizes: Vec, +} + +fn generate_all_icons_compressed(icon_configs: &[(&str, [(&str, usize); 2])]) -> io::Result<(String, Vec)> { + let mut all_icons_data = Vec::new(); + let mut metadata = Vec::new(); + + // Collect all icon data + for (icon_name, themes) in icon_configs.iter() { + for (theme, count) in themes.iter() { + let base = std::fs::canonicalize(Path::new("assets").join(icon_name))?; + let icon_file_names = (0..*count) + .map(|i| format!("{}_{}_{}", theme, icon_name, i)) + .collect::>(); + + let mut group_sizes = Vec::new(); + let group_offset = all_icons_data.len(); + + // Read all icons for this group + for name in &icon_file_names { + let icon_path = base.join(format!("{}.ico", name)); + let icon_data = std::fs::read(&icon_path)?; + group_sizes.push(icon_data.len()); + all_icons_data.extend_from_slice(&icon_data); + } + + metadata.push(IconGroupMetadata { + icon_name: icon_name.to_string(), + theme: theme.to_string(), + offset: group_offset, + sizes: group_sizes, + }); } } - std::fs::write(&dest_path, code.join("\n").as_bytes()) + + // Compress all icons together + let mut gz_encoder = GzEncoder::new(Vec::new(), Compression::best()); + std::io::copy(&mut &all_icons_data[..], &mut gz_encoder)?; + let compressed = gz_encoder.finish()?; + + // Write compressed data to OUT_DIR + let out_dir = std::env::var_os("OUT_DIR").unwrap(); + let compressed_path = Path::new(&out_dir).join("all_icons.gz"); + std::fs::write(&compressed_path, &compressed)?; + + println!("cargo:info=All icons compressed: {} bytes -> {} bytes ({:.1}% reduction)", + all_icons_data.len(), compressed.len(), + 100.0 * (1.0 - compressed.len() as f64 / all_icons_data.len() as f64)); + + Ok((compressed_path.display().to_string(), metadata)) } -fn generate_icon_resources_array(theme: &str, name: &str, cnt: usize) -> String { - let base = std::fs::canonicalize(Path::new("assets").join(name)).unwrap(); - let names = (0..cnt) - .map(|i| format!("{}_{}_{}", theme, name, i)) - .collect::>(); - let res = names - .iter() - .map(|name| { - format!( - r#"pub const {name}: &[u8] = include_bytes!(r"{fname}.ico");"#, - fname = base.join(name).display(), - name = name.to_uppercase(), - ) - }) - .collect::>() - .join("\n"); - - format!( - r#" -{res} -pub const {theme}_{name}: &[&[u8]] = &[ - {names} -]; - "#, - res = res, - theme = theme.to_uppercase(), - name = name.to_uppercase(), - names = names.join(",").to_uppercase(), - ) +fn generate_single_chunk_module(compressed_path: &str, metadata: &[IconGroupMetadata]) -> String { + let mut code = String::new(); + + code.push_str("// All icons compressed into a single chunk for maximum compression\n"); + code.push_str(&format!("pub const ALL_ICONS_COMPRESSED: &[u8] = include_bytes!(r\"{}\");\n\n", compressed_path)); + + code.push_str("use std::collections::HashMap;\n\n"); + + // IconGroupInfo is now defined in main.rs + + // Generate size arrays for each group + for meta in metadata { + let sizes_array = meta.sizes + .iter() + .map(|size| size.to_string()) + .collect::>() + .join(", "); + + code.push_str(&format!( + "const {}_{}_{}_SIZES: &[u32] = &[{}];\n", + meta.theme.to_uppercase(), + meta.icon_name.to_uppercase(), + "INDIVIDUAL", + sizes_array + )); + } + + code.push('\n'); + + // Generate function to get icon metadata + code.push_str("pub fn get_icon_metadata() -> IconData {\n"); + code.push_str(" let mut icons = HashMap::new();\n\n"); + + // Group metadata by icon name + let mut grouped_metadata: HashMap> = HashMap::new(); + for meta in metadata { + grouped_metadata.entry(meta.icon_name.clone()).or_default().push(meta); + } + + for (icon_name, themes) in grouped_metadata { + code.push_str(&format!(" // {} icons\n", icon_name)); + code.push_str(&format!(" let mut {} = HashMap::new();\n", icon_name)); + + for meta in themes { + code.push_str(&format!( + " {}.insert(\"{}\", IconGroupInfo {{ offset: {}, sizes: {}_{}_INDIVIDUAL_SIZES }});\n", + icon_name, + meta.theme, + meta.offset, + meta.theme.to_uppercase(), + meta.icon_name.to_uppercase() + )); + } + + code.push_str(&format!(" icons.insert(\"{}\", {});\n\n", icon_name, icon_name)); + } + + code.push_str(" icons\n"); + code.push_str("}\n"); + + code } diff --git a/src/icon_manager.rs b/src/icon_manager.rs index 8d8d79b..8737a90 100644 --- a/src/icon_manager.rs +++ b/src/icon_manager.rs @@ -1,5 +1,17 @@ use trayicon::Icon; use std::collections::HashMap; +use flate2::read::GzDecoder; +use std::io::Read; + +#[allow(dead_code)] +mod icon_data { + pub struct IconGroupInfo { + pub offset: usize, + pub sizes: &'static [u32], + } + pub type IconData = HashMap<&'static str, HashMap<&'static str, IconGroupInfo>>; + include!(concat!(env!("OUT_DIR"), "/icon_data.rs")); +} #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum Theme { @@ -44,39 +56,53 @@ impl IconManager { pub fn load_icons() -> Result> { let mut manager = Self::new(); - // Define icon configurations: (base_name, supports_themes, [(theme, icon_data)]) - // Adding new icons is as simple as adding a new entry here! - let icon_configs = [ - ("cat", true, vec![ - (Theme::Dark, crate::icon_data::DARK_CAT), - (Theme::Light, crate::icon_data::LIGHT_CAT), - ]), - ("parrot", true, vec![ - (Theme::Dark, crate::icon_data::DARK_PARROT), - (Theme::Light, crate::icon_data::LIGHT_PARROT), - ]), - // Example: to add a new "dog" icon, just add: - // ("dog", true, vec![ - // (Theme::Dark, crate::icon_data::DARK_DOG), - // (Theme::Light, crate::icon_data::LIGHT_DOG), - // ]), - // The menu system will automatically detect it and add it to the menu! - ]; + // Decompress the single big chunk containing all icons + let mut decoder = GzDecoder::new(icon_data::ALL_ICONS_COMPRESSED); + let mut all_decompressed = Vec::new(); + decoder.read_to_end(&mut all_decompressed) + .map_err(|e| format!("Failed to decompress all icons: {}", e))?; + + // Leak the decompressed data to keep it alive for the lifetime of the program + let all_decompressed = Box::leak(all_decompressed.into_boxed_slice()); - for (base_name, supports_themes, theme_data) in icon_configs.iter() { - manager.theme_support.insert(base_name.to_string(), *supports_themes); + // Get icon metadata from build script generated module + let icon_metadata_map = icon_data::get_icon_metadata(); + + for (icon_name, theme_data) in icon_metadata_map { + // All current icons support themes + manager.theme_support.insert(icon_name.to_string(), true); let mut themes_map = HashMap::new(); - for (theme, data) in theme_data.iter() { - let icons: Result, _> = data - .iter() - .map(|icon_bytes| Icon::from_buffer(icon_bytes, None, None)) - .collect(); + for (theme_str, group_info) in theme_data { + let theme = match theme_str { + "dark" => Theme::Dark, + "light" => Theme::Light, + _ => continue, // Skip unknown themes + }; + + // Extract this group's data from the big decompressed chunk + let mut icons = Vec::new(); + let mut current_offset = group_info.offset; + + for &size in group_info.sizes { + let size = size as usize; + if current_offset + size > all_decompressed.len() { + return Err(format!("Invalid icon offset/size data for {} {}", icon_name, theme_str).into()); + } + + let icon_data = &all_decompressed[current_offset..current_offset + size]; + + let icon = Icon::from_buffer(icon_data, None, None) + .map_err(|e| format!("Failed to create icon from buffer for {} {}: {}", icon_name, theme_str, e))?; + + icons.push(icon); + current_offset += size; + } - themes_map.insert(*theme, icons?); + themes_map.insert(theme, icons); } - manager.icon_sets.insert(base_name.to_string(), themes_map); + manager.icon_sets.insert(icon_name.to_string(), themes_map); } Ok(manager) diff --git a/src/main.rs b/src/main.rs index 0d41228..433631d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,34 +2,27 @@ use windows::Win32::UI::WindowsAndMessaging::MB_OK; +mod app; mod cpu_usage; mod events; +mod icon_manager; mod settings; mod windows_api; -mod app; -mod icon_manager; - -#[allow(dead_code)] -mod icon_data { - include!(concat!(env!("OUT_DIR"), "/icons.rs")); -} use crate::{ app::App, icon_manager::IconManager, - settings::{migrate_legacy_settings, get_current_icon, get_current_theme}, + settings::{get_current_icon, get_current_theme, migrate_legacy_settings}, windows_api::safe_message_box, }; - - fn main() { // Migrate legacy settings if needed migrate_legacy_settings(); - + // Load icons let icon_manager = IconManager::load_icons().expect("Failed to load icons"); - + // Get current icon and theme let icon_name = get_current_icon(); let theme = get_current_theme(); @@ -42,11 +35,10 @@ fn main() { })); let app = App::new(icon_manager, &icon_name, Some(theme)).expect("Failed to create app"); - + app.start_animation_thread(); - + app.run_message_loop(); - + app.shutdown(); } -