
Signal Protocol をはじめ、Signal を可能にするその他の暗号プリミティブの本拠地です。
libsignal には、公式の Signal クライアントおよびサーバーで使用されるプラットフォーム非依存の API が含まれており、Java、Swift、または TypeScript ライブラリとして公開されています。基盤となる実装は Rust で書かれています:
このリポジトリは、Signal クライアントアプリ(Android、iOS、Desktop)およびサーバー側で使用されています。Signal 以外での使用はサポートされていません。特に、このリポジトリの成果物は、基盤となる Rust 実装をラップする Java、Swift、および TypeScript ライブラリです。すべての API および実装は、JNI、C、および Node アドオンの「ブリッジ」レイヤーと同様に、予告なく変更される可能性があります。ただし、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
...
上記の基本ツールで、ほとんどの libsignal Rust 開発のセットアップが完了します。
最終的には、コードフォーマット用の taplo など、追加の Rust ツールが必要になる場合があります。
ビルドに影響を与える可能性のある Rust ツールは、システムのパッケージマネージャー(例: apt や brew)からではなく、常に cargo からインストールする必要があります。パッケージマネージャーには、これらのツールの古いバージョンが含まれていることがあり、非互換性の問題でビルドが壊れる可能性があります。
使用しているバージョンに一致する主要な 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 などの追加パッケージをいくつかインストールし、RustコンパイラにAndroidターゲットを追加する必要があります。次のコマンドを使用します
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.
The Signal-Android gradle.properties file has a commented-out line to include libsignal as part of the build. Uncomment that and adjust the path; optionally, you can restrict the architectures you want to build for by adding androidArchs=aarch64 to libsignal's gradle.properties. (The set of recognized architectures is in java/build_jni.sh.) If you're using an IDE, you'll need to re-import the Gradle structure at this point. When you're done, revert the changes to the Android app's gradle.properties and re-import once more.
Note that this does not import the Rust parts of the project into the IDE. Doing that in a multi-language IDE like IDEA is possible, but finicky; as of 2025 the most reliable way to do it is to open the Android project first, add the libsignal repo root directory as a Rust project second (only including the top-level directory), and only then make the changes to gradle.properties.
To learn about the Swift build process see swift/README.md
You'll need Node installed to build. If you have nvm, you can run nvm use to select an
appropriate version automatically.
We use npm as our package manager, and a Python script to control building the Rust library, accessible as npm run build.
$ cd node
$ nvm use
$ npm install
$ npm run build
$ npm run tsc
$ npm run test
When testing changes locally, you can use npm run build to do an incremental rebuild of the Rust library. Alternately, npm run build-with-debug-level-logs will rebuild without filtering out debug- and verbose-level logs.
When exposing new APIs to Node, you will need to run just generate-node in
addition to rebuilding.