
This is the complete source code and the build instructions for the official alternative Android client for the Telegram messenger, based on the Telegram API and the MTProto secure protocol via TDLib.
git--shallow-submodules --depth=1$ brew install git git-lfs && git lfs install$ brew install openjdk@25# apt install git git-lfs$ git lfs install if you just installed git-lfs# apt install openjdk-25-jdk# update-java-alternatives --list# update-java-alternatives --set java-1.25.0-openjdk-amd64 (or other compatible version)pacman -Syupacman -S --needed git mingw-w64-ucrt-x86_64-git-lfs perl make diffutilsgit lfs installgit config --global core.longpaths truemsys2.dir in local.properties after cloning\\ or / as path separator in properties files$ git clone --recursive https://github.com/TGX-Android/Telegram-X tgx--recursive flag, cd into tgx directory and run: $ git submodule update --init --recursive./gradlew assembleLatestDebuglocal.properties file in the root project folder using any text editor:# Location where you have Android SDK installed sdk.dir=YOUR_ANDROID_SDK_FOLDER # Telegram API credentials obtained at previous step telegram.api_id=YOUR_TELEGRAM_API_ID telegram.api_hash=YOUR_TELEGRAM_API_HASH
google-services.json with the one that's suitable for your app.idscripts/setup.sh
Check that submodules and Git LFS files are fetched:
./gradlew :app:validateGitSetup
Build and install debug build on connected device:
./gradlew :app:installLatestDebug -Pabi=arm64
Build `legacy` flavor for Android 4.x, which requires older NDK:
./gradlew :app:assembleLegacyDebug -PuseLegacyNdk=true -Pabi=arm32
Build libvpx and FFmpeg for all flavors and ABIs, add `-PuseLegacyNdk=true` for `legacy` flavor:
./gradlew :app:buildLibvpx
./gradlew :app:buildFfmpeg
#### Checking
Run unit tests:
./gradlew :app:testLatestDebugUnitTest
Run integration tests and UI tests on emulator:
./gradlew :app:emulatorLatestDebugAndroidTest -Pabi=arm64
./gradlew :tests:ui:emulatorLatestNonMinifiedReleaseAndroidTest -Pabi=arm64
Run one test on device, e.g. on connected one:
./gradlew :tests:ui:connectedLatestNonMinifiedReleaseAndroidTest -Pabi=arm64 -Pandroid.testInstrumentationRunnerArguments.class=tgx.test.UnauthorizedLaunchTest
Find classes added after minSdk of each flavor in declarations and, for Android 4.x, in imports, and calls to them without version checks:
./gradlew checkMinSdk
./gradlew checkMinSdk -PuseLegacyNdk=true
./gradlew :app:lintLegacyDebug -PuseLegacyNdk=true
Describe results of checks before and after a change for pull request, see [tests](https://github.com/TGX-Android/Telegram-X/blob/HEAD/tests/README.md#tests-and-checks):
./gradlew clearCheckResults
# Run checks without the change
./gradlew saveCheckResults
# Run checks with the change
./gradlew describeCheckResults
Check test tools on connected test device after changing them, see [tests](https://github.com/TGX-Android/Telegram-X/blob/HEAD/tests/README.md#running-tests):
scripts/check-test-tools.sh
#### Performance
Run benchmarks on connected device and compare results before and after a change:
./gradlew :tests:benchmark:connectedLatestBenchmarkReleaseAndroidTest -Pabi=arm64
./gradlew :tests:benchmark:saveBenchmarkResults
# Apply the change and run benchmarks again
./gradlew :tests:benchmark:compareBenchmarkResults -Pmetric=frameDurationCpuMsP90
Run microbenchmarks of app code and show implementations side by side:
./gradlew :tests:microbenchmark:connectedLatestNonMinifiedReleaseAndroidTest -Pabi=arm64 -Pandroid.testInstrumentationRunnerArguments.class=tgx.test.TextBenchmarks
./gradlew :tests:microbenchmark:describeBenchmarkResults
Optimize `Text`: save results before a change, then run microbenchmarks after it and compare, see [tests](https://github.com/TGX-Android/Telegram-X/blob/HEAD/tests/README.md#optimizing-code):
./gradlew -q :tests:microbenchmark:connectedLatestNonMinifiedReleaseAndroidTest :tests:microbenchmark:saveBenchmarkResults -Pabi=arm64 -Pandroid.testInstrumentationRunnerArguments.class=tgx.test.TextSuite
# Change Text and run them again
./gradlew -q :tests:microbenchmark:connectedLatestNonMinifiedReleaseAndroidTest :tests:microbenchmark:compareBenchmarkResults -Pabi=arm64 -Pandroid.testInstrumentationRunnerArguments.class=tgx.test.TextSuite -Pimplementation=Text -Pcontrol=BoringOrStaticLayout
List devices and variants for which baseline profiles will be generated, without generating them, as tasks named `AndroidTest`:
./gradlew :app:generateBaselineProfile -Pabi=arm64 -m | grep AndroidTest
Generate baseline profiles for all variants on emulator and connected device, keeping computer awake and saving log. ABIs must suit both devices: on x86_64 computers emulator is `x64`, unlike phones:
# macOS with Apple silicon
caffeinate -i ./gradlew :app:generateBaselineProfile -Pabi=arm64 --continue 2>&1 | tee ~/baseline-profile.log
# Ubuntu
systemd-inhibit --what=idle:sleep ./gradlew :app:generateBaselineProfile -Pabi=arm64,x64 --continue 2>&1 | tee ~/baseline-profile.log
In order to verify that there is no additional source code injected inside official APKs, you must use one of the following versions of Ubuntu:
And update its configuration:
vk with the home directory located at /home/vktgx repository to /home/vk/tgxfetchPr and squashPr taskscd into tgx folder and install dependencies: # apt install $(cat reproducible-builds/dependencies.txt)$ apkanalyzer apk compare --different-only <remote-apk> <reproduced-apk>If you downloaded Telegram X APK from somewhere and would like to simply verify whether it's an original APK without any injected malicious source code, you need to get checksum (SHA-256, SHA-1 or MD5) of the downloaded APK file and find whether it corresponds to any known Telegram X version.
In order to obtain SHA-256 of the APK:
$ sha256sum <path-to-apk> on Ubuntu$ shasum -a 256 <path-to-apk> on macOS$ certutil -hashfile <path-to-apk> SHA256 on WindowsOnce obtained, there are three ways to find out the commit for the specific checksum:
@tgx_bot@tgx_log. You can do so without need in installing any Telegram client by using this URL format: https://t.me/s/tgx_log?q={checksum} (click to see in action). Note: unpublished builds cannot be verified this way.Telegram X is licensed under the terms of the GNU General Public License v3.0.
For more information, see LICENSE file.
License of components and third-party dependencies it relies on might differ, check LICENSE file in the corresponding folder.
List of third-party components used in Telegram X can be found here. Additionally you can check the specific commit of the third-party component used, for example, here and here.
Telegram X welcomes contributions. Check out pull request template, code style and guide for contributors to learn more about Telegram X internals before creating the first pull request.
If you are a regular user and experience a problem with Telegram X, the best place to look for solution is Telegram X chat — a community with over 4 thousand members. Please do not use this repository to ask questions: if you have general issue with Telegram, refer to FAQ or contact Telegram Support.
| 日期 | 榜单 | 排名 | 周期新增 | 总 STAR |
|---|