
Дом 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). Менеджеры пакетов иногда содержат устаревшие версии этих инструментов, что может сломать
сборку из-за проблем с несовместимостью.
Чтобы установить основные дополнительные зависимости 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
Our officially supported JDK version for Android builds is JDK 21, so be sure to install e.g. OpenJDK 21, and then point JAVA_HOME to it.
You can easily do this on macOS via:
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
On Linux, the way you do this varies by distribution. For Debian based distributions like Ubuntu, you can use:
sudo update-alternatives --config java
We also check-in a .tools_version file for use with runtime version managers.
To build the Java/Android jar and aar, and run the tests:
$ cd java
$ ./gradlew test
$ ./gradlew build # если вам нужны выходные файлы AAR
You can pass -P debugLevelLogs to Gradle to build without filtering out debug- and verbose-level
logs from Rust, and -P jniTypeTagging to enable additional checks in the Rust JNI bridging code.
Alternately, a build system using Docker is available:
$ cd java
$ make
When exposing new APIs to Java, you will need to run cargo run -p libsignal-jni-native_kt (or
just generate-jni) in addition to rebuilding.
Signal publishes Java packages for its own use, under the names org.signal:libsignal-server,
org.signal:libsignal-client, and org.signal:libsignal-android. libsignal-client and libsignal-server
contain native libraries for Debian-flavored x86_64 Linux as well as Windows (x86_64) and macOS
(x86_64 and arm64). libsignal-android contains native libraries for armeabi-v7a, arm64-v8a, x86, and
x86_64 Android. These are located in a Maven repository at
https://build-artifacts.signal.org/libraries/maven/; for use from Gradle, add the following to your
repositories block:
maven {
name = "SignalBuildArtifacts"
// Часть "uri()" нужна только для Kotlin Gradle; Groovy Gradle принимает здесь простую строку.
url = uri("https://build-artifacts.signal.org/libraries/maven/")
}
Older builds were published to Maven Central instead.
When building for Android you need both libsignal-android and libsignal-client, but the Windows
and macOS libraries in libsignal-client won't automatically be excluded from your final app. You can
explicitly exclude them using packaging:
android {
// ...
packaging {
resources {
excludes += setOf("libsignal_jni*.dylib", "signal_jni*.dll")
}
}
// ...
}
You can additionally exclude libsignal_jni_testing.so if you do not plan to use any of the APIs
intended for client testing.