
Дом Signal Protocol, а также других криптографических примитивов, благодаря которым возможен Signal.
libsignal содержит платформенно-независимые API, используемые официальными клиентами и серверами Signal, предоставляемые в виде библиотеки для Java, Swift или TypeScript. Базовые реализации написаны на Rust:
Этот репозиторий используется клиентскими приложениями Signal (Android, iOS и Desktop), а также на стороне сервера. Использование вне Signal не поддерживается. В частности, продуктами этого репозитория являются библиотеки для Java, Swift и TypeScript, которые оборачивают базовые реализации на Rust. Все API и реализации могут быть изменены без предварительного уведомления, как и "мостовые" слои JNI, C и Node add-on. Однако обратно несовместимые изменения в API для Java, Swift, TypeScript и не-мостовых Rust API будут по мере возможности отражаться в номере версии, включая повышение минимальных поддерживаемых версий инструментов.
Чтобы собрать что-либо в этом репозитории, у вас должен быть установлен Rust, а также свежие версии Clang, libclang, CMake, Make, protoc, Python (3.9+) и git.
В Debian-подобной системе вы можете получить эти дополнительные зависимости через apt:
$ apt-get install clang libclang-dev cmake make protobuf-compiler libprotobuf-dev python3 git
В macOS у нас есть поддерживаемый по мере возможности скрипт для настройки инструментария Rust, который можно запустить так:
$ bin/mac_setup.sh
Сборка в настоящее время использует определённую версию стабильного компилятора Rust, которая будет автоматически загружена cargo. Чтобы собрать и протестировать базовые протокольные библиотеки:
$ cargo build
...
$ cargo test
...
Базовых инструментов выше должно быть достаточно для большинства задач разработки на Rust в libsignal.
Со временем вы можете обнаружить, что вам нужны дополнительные инструменты Rust, такие как taplo для форматирования кода.
Вам всегда следует устанавливать любые необходимые инструменты Rust, которые могут повлиять на сборку, из cargo, а не из системного
менеджера пакетов (например, apt или brew). Менеджеры пакетов иногда содержат устаревшие версии этих инструментов, которые могут сломать
сборку из-за проблем с совместимостью (особенно cbindgen).
Чтобы установить основные дополнительные зависимости Rust, соответствующие используемым нами версиям, можно выполнить следующие команды:
$ cargo +stable install --version "$(cat acknowledgments/cargo-about-version)" --locked cargo-about
$ cargo +stable install --version "$(cat .taplo-cli-version)" --locked taplo-cli
$ cargo +stable install cargo-fuzz
Чтобы собрать для Android, вы должны установить несколько дополнительных пакетов, включая JDK, Android NDK/SDK, и добавить цели Android в компилятор Rust, используя
rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android
Наша официально поддерживаемая версия JDK для сборок Android — JDK 21, поэтому обязательно установите, например, OpenJDK 21, а затем укажите JAVA_HOME на него.
Вы легко можете сделать это в macOS через:
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
В Linux способ зависит от дистрибутива. Для Debian-подобных дистрибутивов, таких как Ubuntu, можно использовать:
sudo update-alternatives --config java
Мы также добавляем в репозиторий файл .tools_version для использования с менеджерами версий времени выполнения.
Чтобы собрать Java/Android jar и aar, а также запустить тесты:
$ cd java
$ ./gradlew test
$ ./gradlew build # if you need AAR outputs
Вы можете передать -P debugLevelLogs в Gradle, чтобы собрать без фильтрации отладочных и подробных
логов из Rust, и -P jniTypeTagging, чтобы включить дополнительные проверки в коде моста Rust JNI.
В качестве альтернативы доступна система сборки с использованием Docker:
$ cd java
$ make
При предоставлении новых API для Java вам нужно будет запустить rust/bridge/jni/bin/gen_java_decl.py в
дополнение к пересборке. Для этого требуется установить инструмент Rust cbindgen, как описано выше.
Signal публикует Java-пакеты для собственного использования под именами org.signal:libsignal-server,
org.signal:libsignal-client и org.signal:libsignal-android. libsignal-client и libsignal-server
содержат нативные библиотеки для Debian-подобного x86_64 Linux, а также Windows (x86_64) и macOS
(x86_64 и arm64). libsignal-android содержит нативные библиотеки для armeabi-v7a, arm64-v8a, x86 и
x86_64 Android. Они расположены в Maven-репозитории по адресу
https://build-artifacts.signal.org/libraries/maven/; для использования из Gradle добавьте следующее в ваш
блок repositories:
maven {
name = "SignalBuildArtifacts"
// The "uri()" part is only necessary for Kotlin Gradle; Groovy Gradle accepts a bare string here.
url = uri("https://build-artifacts.signal.org/libraries/maven/")
}
Более старые сборки публиковались в Maven Central.
При сборке для Android вам нужны обе библиотеки: libsignal-android и libsignal-client, но библиотеки для Windows
и macOS из libsignal-client не будут автоматически исключены из вашего финального приложения. Вы можете
явно исключить их, используя packaging:
android {
// ...
packaging {
resources {
excludes += setOf("libsignal_jni*.dylib", "signal_jni*.dll")
}
}
// ...
}
Дополнительно вы можете исключить libsignal_jni_testing.so, если не планируете использовать какие-либо API,
предназначенные для клиентского тестирования.