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

to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

  • Upload
    others

  • View
    14

  • Download
    0

Embed Size (px)

Citation preview

Page 1: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Leveraging Rustto build cross-platformmobile libraries

Rusty Days 2020 - Jan-Erik / @badboy_

Page 2: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

About me

• Firefox Telemetry engineer at Mozilla

• Rust Community Team member

• Scuba diver

Twitter: @badboy_Blog: fnordig.de

Slides:

fnordig.de/talks/2020/rustydays/slides.pdf

Page 3: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries
Page 4: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 5: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 6: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Firefox Telemetry

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 6

Page 7: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 8: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Metric: Time spent running the JS GC1

1 Measurement Dashboard at https://telemetry.mozilla.org/new-pipeline/dist.html

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8

Page 9: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Lean Data Practices

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 9

Page 10: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Collecting Data Responsibly and at Scale 2

2 StarCon 2019 Talk by chutten.

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

Page 11: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 12: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 13: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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.

Firefox for Android

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 13

Page 14: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 15: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Scalars.yamlbrowser.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: - [email protected] release_channel_collection: opt-out products: - 'firefox' record_in_processes: - 'main'

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 15

Page 16: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 17: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

BrowserEngagement.max_concurrent_tab_count.add(1)

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 17

Page 18: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 19: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 20: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

https://github.com/mozilla/glean

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 20

Page 21: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Glean SDK stack

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 21

Page 22: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Glean CoreA Rust crate

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 22

Page 23: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 24: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Metrics implemented as Rust typesstruct 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

Page 25: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Glean FFIthe connection

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 25

Page 26: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Foreign Function Interface

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 26

Page 27: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 28: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 29: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

"Rusty Days!\0"

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 29

Page 30: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 31: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

cbindgen

cbindgen creates C headers for Rust libraries which expose a public C API.

#[no_mangle]pub extern "C" fn hello_rusty_days(data: c_int) -> *const u8 { "Rusty Days!\0".as_ptr()}

#include <stdint.h>#include <stdlib.h>

const uint8_t *hello_rusty_days(int data);

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 31

Page 32: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

ffi-supportSupport library to simplify implementing FFI libraries*.

* as done by application-services3 & Glean

3 https://github.com/mozilla/application-services

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 32

Page 33: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

ffi-support: IntoFFIConvert 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

Page 34: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

ffi-support: FfiStrA 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

Page 35: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 36: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Compile Targets

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 36

Page 37: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

$ rustup target listaarch64-apple-ios (installed)aarch64-fuchsiaaarch64-linux-android (installed)aarch64-pc-windows-msvcaarch64-unknown-linux-gnuaarch64-unknown-linux-muslaarch64-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

Page 38: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

<arch><sub>-<vendor>-<sys>-<abi>

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 38

Page 39: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Glean targetsrustup target add armv7-linux-androideabi # for armrustup target add i686-linux-android # for x86rustup target add aarch64-linux-android # for arm64rustup target add x86_64-linux-android # for x86_64 (& simulator)rustup target add x86_64-unknown-linux-gnu # for linux-x86-64rustup target add x86_64-apple-darwin # for macOSrustup target add x86_64-pc-windows-gnu # for win32-x86-64-gnurustup target add x86_64-pc-windows-msvc # for win32-x86-64-msvcrustup 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

Page 40: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Glean KotlinThe Kotlin

implementation

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 40

Page 41: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

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

Page 42: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Hello World with JNIRust

#[no_mangle]extern "system" fn Java_HelloWorld_hello( env: JNIEnv, _class: JClass, input: JString,) -> jstring { // ...}

Java

class HelloWorld { static native String hello(String input);

static { System.loadLibrary("mylib"); }}

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 42

Page 43: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Otavio Pace: Interop with Android, IOS and WASM in the same project

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 43

Page 44: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

JNA provides Java programs easy access to native shared libraries without writing anything but Java

code - no JNI or native code is required.

— from github.com/java-native-access/jna

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 44

Page 45: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Hello World with JNA

#[no_mangle]pub extern "C" fn hello() -> *const c_char { "Rusty Days!\0".as_ptr()}

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 45

Page 46: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

JNA - loading a dynamic libraryinternal interface LibGleanFFI : Library { companion object { internal var INSTANCE: LibGleanFFI = Native.load("glean_ffi", LibGleanFFI::class.java) }

fun glean_initialize(cfg: FfiConfiguration): Byte

fun glean_new_counter_metric(name: String, lifetime: Int): Long}

// ...

LibGleanFFI.INSTANCE.glean_initialize(cfg)

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 46

Page 47: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Building a Cargo project using Gradle4

apply plugin: 'org.mozilla.rust-android-gradle.rust-android'

cargo { module = "../ffi" libname = "glean_ffi" targets = ["arm", "x86"]}

4 github.com/mozilla/rust-android-gradle

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 47

Page 48: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Other Glean implementations

• Swift - it speaks C!

• Python - similar to Swift, using cffi

• C# - similar to Kotlin

• Soon:

• C++

• JavaScript

• Rust

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 48

Page 49: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Challenges of developing cross-

platform Rust

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 49

Page 50: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 50

Page 51: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types: Numbers

Rust Kotlin Swift

u8 Byte UInt8

i32 Int Int32

i64 Long Int64

isize IntegerType Int

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 51

Page 52: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types: Bool in reality

1 # true 0 # false

1 bit

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 52

Page 53: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types: Bool in Rust

0000 0001 # true 0000 0000 # false

8 bit = 1 byte

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 53

Page 54: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types: Bool in Kotlin

0000 0000 0000 0000 0000 0000 0000 0001 # true 0000 0000 0000 0000 0000 0000 0000 0000 # false

32 bit = 4 byte

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 54

Page 55: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types: Strings

fun glean_submit_ping_by_name( ping_name: String, reason: String?): Byte

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 55

Page 56: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types: Strings

// Rustextern "C" fn glean_string_get(metric_id: i64) -> *mut c_char

// Kotlinfun glean_string_get(metric_id: Long): Pointer?

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 56

Page 57: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types: String

fun Pointer.getAndConsumeRustString(): String { try { return this.getRustString() } finally { LibGleanFFI.INSTANCE.glean_str_free(this) }}

fun Pointer.getRustString(): String { return this.getString(0, "utf8")}

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 57

Page 58: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types: Plain ol' Enums

Kotlin

enum class TimeUnit { Microsecond, Millisecond, Second, Minute,}

Rust

enum TimeUnit { Microsecond, Millisecond, Second, Minute,}

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 58

Page 59: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types: Enums with data

Rust

#[repr(u8)]pub enum FfiPingUploadTask { Upload { document_id: *mut c_char, body: ByteBuffer, }, Wait, Done,}

Tagged unions in C (through C bindgen)

enum FfiPingUploadTask_Tag { FfiPingUploadTask_Upload, FfiPingUploadTask_Wait, FfiPingUploadTask_Done,};typedef uint8_t FfiPingUploadTask_Tag;

typedef struct { FfiPingUploadTask_Tag tag; char *document_id; ByteBuffer body;} FfiPingUploadTask_Upload_Body;

typedef union { FfiPingUploadTask_Tag tag; FfiPingUploadTask_Upload_Body upload;} FfiPingUploadTask;

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 59

Page 60: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types: Enums with data

Rust

#[repr(u8)]pub enum FfiPingUploadTask { Upload { document_id: *mut c_char, body: ByteBuffer, }, Wait, Done,}

Tagged unions in Kotlin

enum class UploadTaskTag { Upload, Wait, Done}

@Structure.FieldOrder("tag", "documentId", "body")internal class UploadBody( val tag: Byte, val documentId: Pointer?, var body: RustBuffer,) : Structure() { }

internal open class FfiPingUploadTask( var tag: Byte = UploadTaskTag.Done.ordinal.toByte(), var upload: UploadBody = UploadBody()) : Union() {}

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 60

Page 61: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types: Other rich data - JSON

Rust

extern "C" fn glean_get_json(metric_id: i64) -> *mut c_char { let data = Glean.string_get(metric_id); let json = serde_json::to_string(&data); json.into_ffi_value()}

Kotlin

// Declaration:fun glean_get_json(metric_id: Long): Pointer?

// Usage:val ptr = glean_get_json(handle)!!

jsonRes = JSONArray(ptr.getAndConsumeRustString())return jsonRes.toList()

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 61

Page 62: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Data types: Other rich data - ProtoBuf5

5 Crossing the Rust FFI frontier with Protocol Buffers

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 62

Page 63: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Optimizer: R8

• R8 minifies and optimizes the JVM bytecode

• It's buggy and might "over-optimize" JNA code

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 63

Page 64: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Optimizer: R8

proguard-consumer-rules.pro:

# JNA specific rules-dontwarn java.awt.*-keep class com.sun.jna.* { *; }-keepclassmembers class * extends com.sun.jna.* { public *; }

# Glean specific rules-keep class mozilla.telemetry.** { *; }

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 64

Page 65: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Extra libs

• build.rs exists, but everyone does it differently

• Build and link your C dependencies statically

• Consider precompiling them

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 65

Page 66: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

What about the platform?

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 66

Page 67: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Glean goes on-direction only

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 67

Page 68: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Things that Kotlin does:

• Data storage path

• System & app information

• HTTP/network communication

• Time

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 68

Page 69: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

The Future is Glean

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 69

Page 70: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Future: Component Interface Definition

uniffi: Create boilerplate from IDL files6

interface Counter { constructor(string category, string name); void add(integer amount);}

6 github.com/mozilla/uniffi-rs

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 70

Page 71: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Future: Firefox on Glean

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 71

Page 72: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Who else is using Rust to build cross-platform libraries, targetting

mobile?

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 72

Page 73: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Async Rust, but using the platform?

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 73

Page 74: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Thanks tothe Telemetry team: Alessio, Bea, Chris,

Travis, Mike and Georg.

the application-services team.

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 74

Page 75: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Links

• Slides: fnordig.de/talks/2020/rustydays/slides.pdf

• Glean SDK repository: github.com/mozilla/glean

• Glean SDK docs: mozilla.github.io/glean

• Mozilla Data blog: blog.mozilla.org/data

• me on Twitter: @badboy_

- Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 75

Page 76: to build cross-platform mobile libraries - fnordig.de · - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 8 Lean Data Practices - Cross-platform mobile libraries

Questions? - Cross-platform mobile libraries - Rusty Days 2020 - Jan-Erik / @badboy_ 76