mobile libraries
play

mobile libraries Rusty Days 2020 - Jan-Erik / @badboy_ About me - PowerPoint PPT Presentation

Leveraging Rust to build cross-platform mobile libraries Rusty Days 2020 - Jan-Erik / @badboy_ About me Firefox Telemetry engineer at Mozilla Rust Community Team member Scuba diver Twitter: @badboy_ Blog: fnordi g.de Slides:


  1. Leveraging Rust to build cross-platform mobile libraries Rusty Days 2020 - Jan-Erik / @badboy_

  2. About me • Firefox Telemetry engineer at Mozilla • Rust Community Team member • Scuba diver Twitter: @badboy_ Blog: fnordi g.de Slides: fnordig.de/talks/2020/rustydays/slides.pdf

  3. - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 4

  4. - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 5

  5. Firefox Telemetry - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 6

  6. Firefox Telemetry A quick overview 1. Performance metrics for our products 2. Packaged in pings sent at controlled schedules 3. Following our Lean Data Practices - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 7

  7. Metric: Time spent running the JS GC 1 1 Measurement Dashboard at https://telemetry.mozilla.org/new-pipeline/dist.html - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8

  8. Lean Data Practices - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 9

  9. Collecting Data Responsibly and at Scale 2 2 StarCon 2019 Talk by chutten. - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 10

  10. - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 11

  11. - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 12

  12. Firefox for Android The Glean SDK is a modern approach for a Telemetry library and is part of the Glean project. Introducing Glean — Telemetry for humans by Georg Fritzsche. - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 13

  13. Telemetry API in Firefox Desktop Services.telemetry.scalarAdd( "browser_engagement.max_concurrent_tab_count", 1 ); - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 14

  14. Scalars.yaml browser.engagement: max_concurrent_tab_count: bug_numbers: - 1271304 description: > The count of maximum number of tabs open during a subsession, across all windows, including tabs in private windows and restored at startup. expires: "81" kind: uint notification_emails: - someone@mozilla.com release_channel_collection: opt-out products: - 'firefox' record_in_processes: - 'main' - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 15

  15. Telemetry API in Firefox Desktop Services.telemetry.scalarAdd( "browser_engagement.max_concurrent_tab_count", 1 ); - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 16

  16. BrowserEngagement.max_concurrent_tab_count.add(1) - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 17

  17. BrowserEngagement.max_concurrent_tab_count.add(1) |---------------| |--| Category object integer |------------------------| Counter metric |---| increment function - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 18

  18. New Telemetry requirements • Declarative definitions of metrics • Share core implementation cross-platform • Ergonomic API per target language - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 19

  19. https://github.com/mozilla/glean - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 20

  20. Glean SDK stack - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 21

  21. Glean Core A Rust crate - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 22

  22. Glean Core - a Rust crate #[derive(Debug)] struct Glean { data_path: PathBuf, upload_enabled: bool, data_store: Database, event_data_store: EventDatabase, core_metrics: CoreMetrics, // ... } - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 23

  23. Metrics implemented as Rust types struct CounterMetric { meta: CommonMetricData, } impl CounterMetric { fn add(&self, glean: &Glean, amount: i32) { glean .storage() .record_with(&self.meta, |old_value| old_value.add(amount)) } } - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 24

  24. Glean FFI the connection - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 25

  25. F oreign F unction I nterface - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 26

  26. Calling C functions extern { fn c_rusty_days(days: c_int); } // .. unsafe { c_rusty_days(30); } - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 27

  27. Getting called from C #[no_mangle] pub extern "C" fn hello_rusty_days(data: c_int) -> *const u8 { "Rusty Days!\0".as_ptr() } - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 28

  28. "Rusty Days!\0" - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 29

  29. CString to the rescue let s = CString::new("Rusty days!").unwrap(); assert!(s.into_bytes_with_nul() == b"Rusty days!\0"); - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 30

  30. cbindgen cbindgen creates C headers for Rust libraries which expose a public C API. #include <stdint.h> #[no_mangle] pub extern "C" fn hello_rusty_days(data: c_int) #include <stdlib.h> -> *const u8 { "Rusty Days!\0".as_ptr() const uint8_t *hello_rusty_days(int data); } - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 31

  31. ffi-support Support library to simplify implementing FFI libraries*. * as done by application-services 3 & Glean 3 https://github.com/mozilla/application-services - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 32

  32. ffi-support: IntoFFI Convert Rust types into FFI-compatible types unsafe trait IntoFfi: Sized { type Value; fn ffi_default() -> Self::Value; fn into_ffi_value(self) -> Self::Value; } unsafe impl IntoFfi for String { type Value = *mut c_char; // ... } - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 33

  33. ffi-support: FfiStr A safe wrapper around a null-terminated string. pub struct FfiStr<'a> { /* fields omitted */ } #[no_mangle] extern "C" fn hello_rusty_days(data: FfiStr) { // Use of `data` after this function returns is impossible } - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 34

  34. ffi-support: ConcurrentHandleMap A locked map with handles to use across the FFI. static COUNTER: Lazy<ConcurrentHandleMap<CounterMetric>> = Lazy::new(ConcurrentHandleMap::new); extern "C" fn glean_new_counter_metric(name: ffi_support::FfiStr) -> u64 { COUNTER.insert_with_log(|| { Ok(glean_core::metrics::CounterMetric::new(name.as_str())) }) } - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 35

  35. Compile Targets - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 36

  36. $ rustup target list aarch64-apple-ios (installed) aarch64-fuchsia aarch64-linux-android (installed) aarch64-pc-windows-msvc aarch64-unknown-linux-gnu aarch64-unknown-linux-musl aarch64-unknown-none [...] x86_64-apple-darwin (installed) x86_64-apple-ios (installed) [...] x86_64-unknown-redox - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 37

  37. <arch><sub>-<vendor>-<sys>-<abi> - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 38

  38. Glean targets rustup target add armv7-linux-androideabi # for arm rustup target add i686-linux-android # for x86 rustup target add aarch64-linux-android # for arm64 rustup target add x86_64-linux-android # for x86_64 (& simulator) rustup target add x86_64-unknown-linux-gnu # for linux-x86-64 rustup target add x86_64-apple-darwin # for macOS rustup target add x86_64-pc-windows-gnu # for win32-x86-64-gnu rustup target add x86_64-pc-windows-msvc # for win32-x86-64-msvc rustup target add aarch64-apple-ios # iOS (actual devices) rustup target add x86_64-apple-ios # iOS simulator - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 39

  39. Glean Kotlin The Kotlin implementation - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 40

  40. JNI is the Java Native Interface. It defines a way for the bytecode that Android compiles from managed code to interact with native code. — from Android - JNI tips - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 41

  41. Hello World with JNI Rust Java #[no_mangle] class HelloWorld { static native String hello(String input); extern "system" fn Java_HelloWorld_hello( env: JNIEnv, static { _class: JClass, System.loadLibrary("mylib"); input: JString, } ) -> jstring { } // ... } - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 42

  42. Otavio Pace: Interop with Android, IOS and WASM in the same project - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 43

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend