
Signal Protocol तथा अन्य क्रिप्टोग्राफ़िक प्रिमिटिव्स का घर, जो Signal को संभव बनाते हैं।
libsignal में आधिकारिक Signal क्लाइंट और सर्वर द्वारा उपयोग किए जाने वाले प्लेटफ़ॉर्म-अज्ञेय APIs शामिल हैं, जो Java, Swift, या TypeScript लाइब्रेरी के रूप में उपलब्ध हैं। अंतर्निहित कार्यान्वयन Rust में लिखे गए हैं:
यह रिपॉज़िटरी Signal क्लाइंट ऐप्स (Android, iOS, और Desktop) के साथ-साथ सर्वर-साइड द्वारा भी उपयोग की जाती है। Signal के बाहर उपयोग असमर्थित है। विशेष रूप से, इस रिपॉज़िटरी के उत्पाद Java, Swift, और TypeScript लाइब्रेरी हैं जो अंतर्निहित Rust कार्यान्वयन को रैप करती हैं। सभी APIs और कार्यान्वयन बिना सूचना के परिवर्तन के अधीन हैं, जैसे कि JNI, C, और Node add-on "bridge" लेयर। हालाँकि, Java, Swift, TypeScript, और non-bridge Rust APIs में पश्चगामी-असंगत परिवर्तन सर्वोत्तम-प्रयास के आधार पर संस्करण संख्या में प्रतिबिंबित होंगे, जिसमें न्यूनतम समर्थित टूल संस्करणों में वृद्धि भी शामिल है।
इस रिपॉज़िटरी में कुछ भी बिल्ड करने के लिए आपके पास 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 विकास के लिए तैयार कर देंगे।
समय के साथ, आप पा सकते हैं कि आपको कुछ अतिरिक्त Rust टूल्स की आवश्यकता है जैसे कोड फ़ॉर्मेटिंग के लिए taplo।
आपको हमेशा अपने सिस्टम पैकेज मैनेजर (जैसे apt या brew) के बजाय cargo से कोई भी Rust टूल इंस्टॉल करना चाहिए जो बिल्ड को प्रभावित कर सकता है। पैकेज मैनेजर में कभी-कभी इन टूल्स के पुराने संस्करण होते हैं जो असंगतता समस्याओं (विशेष रूप से 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 शामिल हैं, और Rust कंपाइलर में Android टार्गेट जोड़ने होंगे, इसका उपयोग करके
rustup target add armv7-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android
Android बिल्ड के लिए हमारा आधिकारिक रूप से समर्थित JDK संस्करण JDK 21 है, इसलिए सुनिश्चित करें कि आप OpenJDK 21 इंस्टॉल करें, और फिर JAVA_HOME को उस पर इंगित करें।
आप macOS पर इसे आसानी से इस प्रकार कर सकते हैं:
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
Linux पर, यह करने का तरीका वितरण के अनुसार भिन्न होता है। Ubuntu जैसे Debian आधारित वितरणों के लिए, आप उपयोग कर सकते हैं:
sudo update-alternatives --config java
हम रनटाइम संस्करण प्रबंधकों के उपयोग के लिए एक .tools_version फ़ाइल भी चेक-इन करते हैं।
Java/Android jar और aar को बिल्ड करने, और टेस्ट चलाने के लिए:
$ cd java
$ ./gradlew test
$ ./gradlew build # if you need AAR outputs
आप Gradle को -P debugLevelLogs पास कर सकते हैं ताकि Rust से debug- और verbose-स्तर के
लॉग फ़िल्टर किए बिना बिल्ड हो, और Rust JNI ब्रिजिंग कोड में अतिरिक्त जाँच सक्षम करने के लिए -P jniTypeTagging।
वैकल्पिक रूप से, Docker का उपयोग करने वाला एक बिल्ड सिस्टम उपलब्ध है:
$ cd java
$ make
Java को नए APIs उजागर करते समय, आपको पुनर्निर्माण के अतिरिक्त rust/bridge/jni/bin/gen_java_decl.py चलाना होगा। इसके लिए cbindgen Rust टूल इंस्टॉल करना आवश्यक है, जैसा कि ऊपर विस्तार से बताया गया है।
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 के लिए नेटिव लाइब्रेरी शामिल हैं। ये
https://build-artifacts.signal.org/libraries/maven/ पर एक 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 दोनों की आवश्यकता होती है, लेकिन libsignal-client में Windows
और macOS लाइब्रेरी आपके अंतिम ऐप से स्वचालित रूप से बाहर नहीं रखी जाएँगी। आप
packaging का उपयोग करके उन्हें स्पष्ट रूप से बाहर कर सकते हैं:
android {
// ...
packaging {
resources {
excludes += setOf("libsignal_jni*.dylib", "signal_jni*.dll")
}
}
// ...
}
यदि आप क्लाइंट परीक्षण के लिए इच्छित कोई भी API उपयोग करने की योजना नहीं बनाते हैं तो आप libsignal_jni_testing.so को भी बाहर कर सकते हैं।