Snips использует Rust для разработки библиотек, работающих на мобильных устройствах. Мы разработали dinghy, инструмент для оптимизации тестирования и тестирования библиотек на самих телефонах. Сейчас мы делимся этим с сообществом Rust в целом, надеясь, что многие разработчики библиотек захотят попробовать сделать свою работу переносимой.

TL;DR

  • Запустите грузовой тест и грузовой стенд на своем телефоне.
  • Шлюпка - это небольшая лодка, которую большой корабль, например грузовой (!) Корабль, возит или
    буксирует вокруг.
  • Https://github.com/snipsco/dinghy

Ржавчина для ножниц

В Snips мы верим в искусственный интеллект и конфиденциальность. И мы
еще сильнее убеждены, что пользователю не нужно выбирать одно перед другим.
Мы убеждены, что ваш собственный мобильный телефон - лучшее место для хранения и
обработки ваших данных, поэтому мы используем искусственный интеллект в вашем телефоне, вместо того, чтобы выносить ваши
личные вещи в огромные центры обработки данных из-под вашего контроля.

Чтобы наилучшим образом использовать относительно ограниченные ресурсы, доступные
на мобильном телефоне, мы разрабатываем часть нашего набора инструментов с использованием Rust. Точно так же, как пользователю не нужно выбирать между лучшим опытом и своей конфиденциальностью, мы отказываемся выбирать между переносимостью, производительностью и безопасностью. Нам нужны все, поэтому мы выбрали Rust.

Инструменты Rust для мобильной разработки

Хотя Rust как экосистема все еще молода, большая часть тяжелой работы по программированию
библиотек для мобильных устройств находится здесь: с помощью фреймворка компилятора LLVM
Rust использует преимущества генерации зрелого кода и оптимизации для процессоров ARM, которые обеспечивают работу большинства смартфонов.

Помимо компилятора, Cargo предоставляет систему управления зависимостями и сборки. Rustup берет на себя управление наборами инструментов Rust и предварительно скомпилированными стандартными библиотеками, делая кросс-компиляцию относительно безболезненной. Наконец, Rust поддерживает условную компиляцию с помощью простого набора атрибутов, что позволяет библиотекам адаптироваться к платформе, на которую они компилируются.

А вот модульное тестирование - это совсем другое дело. Встроенные возможности тестирования Cargo работают хорошо, если вы хотите запускать тесты на компьютере, на котором вы разрабатываете. Большинство ошибок, с которыми мы сталкиваемся ежедневно, достаточно тривиальны, чтобы проявляться на ноутбуке так же, как на телефоне. Но иногда нам нужно подойти ближе к металлу, чтобы выжать максимум возможной производительности. При работе с конкретными функциями процессора и условной компиляцией всегда возможны сюрпризы. И, конечно же, также необходимо использовать реальное оборудование.

Cargo и rustc компилируют тесты (и программы) в простые исполняемые файлы командной строки. В них встроена базовая логика фильтрации тестов, простое средство форматирования результатов и, естественно, их можно вызывать из командной строки.

Когда у вас есть командная строка.

Запуск тестов на телефонах

На Android все относительно просто. Cargo можно уговорить скомпилировать исполняемые файлы для платформы Android. Затем с помощью adb можно протолкнуть двоичный файл на телефон и запустить его.

Другое дело iOS: единственный способ запустить код на устройстве - сделать его приложением. И приложение должно быть подписано. Затем он должен быть правильно установлен и, наконец, может быть запущен с использованием удаленных возможностей LLDB. Чтобы подписать приложение, разработчику необходимы учетная запись и сертификат Apple. Для этого больше не требуется платная учетная запись разработчика, разработчик теперь может получить бесплатный сертификат, действительный для его собственного телефона.

Но нам было скучно проходить эти подверженные ошибкам шаги «вручную». И мы
хотели снизить стоимость, чтобы упростить работу и другим разработчикам.

Шлюпка

Лодка является расширением грузового. Для iOS установка занимает всего несколько минут,
щелкая XCode для получения сертификата. Меньше этого, если вы уже
являетесь разработчиком iOS или пользователем Android. В любом случае, это единовременная плата. После этого он будет использоваться для всех ваших грузовых проектов.

Выполнить набор тестов на подключенном телефоне так же просто, как:

испытание грузовой шлюпки

И, конечно же, то же самое и со скамейками:

скамейка для грузовой лодки

Мы сделали все возможное, чтобы охватить тот же формат командной строки, что и Cargo, поэтому ... просто добавьте «dinghy» между «cargo» и «test ", и вы сделали. Флаги функций работают так же, как и тестовые аргументы (для фильтрации).

Примеры из экосистемы Rust

Мы попытались протестировать несколько популярных проектов на Rust и несколько
из них, которые в последние недели мешали нам. Некоторые проекты работают «из коробки». У других есть внешние зависимости, которые они пытаются (а иногда и не могут) скомпилировать. Некоторые даже не станут пытаться и с треском потерпят неудачу.

  • byteorder работает "из коробки"
  • nom работает (в некоторых тестах используются внешние файлы,
    которые не поставляются на телефон)
  • num-bigint работает "из коробки"
  • мы выполнили работу рампы (ожидается PR)
  • flate2 работает, за исключением двух тестов с внешними файлами.
  • odiumoxyde не работает "из коробки" (скрипт сборки не выполняет кросс-компиляцию)
  • * кольцо * не удается выполнить кросс-компиляцию
  • гипер просто работает (если отключить SSL)
  • backtrace не работает (даже не компилируется, но это известное ограничение)
  • core-foundation работает "из коробки"

Заключение

Многие проблемы с переносимостью относительно легко исправить, но в большинстве случаев об их существовании никто не знает. Мы думаем, что Dinghy позволяет разработчику протестировать телефон, найти проблему, воспроизвести ее, сообщить о ней, обсудить ее и, в конечном итоге, исправить ее. Модульные тесты и тестовые примеры - настоящие краеугольные камни процесса совместной разработки. CI, конечно, был бы идеальным вариантом, но давайте посмотрим правде в глаза, это очень дорого обходится CI на телефонном оборудовании.

Но если вы разработчик библиотеки Rust, установите Dinghy и получите сертификат, подключите телефон, перейдите к проекту, над которым вы сейчас работаете, и попробуйте.

Давайте найдем ржавчину везде.

Если вам понравилась эта статья, будет действительно полезно, если вы нажмете "Рекомендовать" ниже :)

Следите за нами в твиттере @kalizoy и @snips

Если вы хотите работать над AI + Privacy, загляните на нашу страницу вакансий!