telegram-crawler/data/web/core.telegram.org/reproducible-builds.html
2024-08-02 00:44:36 +00:00

352 lines
26 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html class="">
<head>
<meta charset="utf-8">
<title>Reproducible Builds for iOS and Android</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta property="description" content="This page contains instructions for verifying that Telegram&#39;s open source code is exactly the same as the code that is used…">
<meta property="og:title" content="Reproducible Builds for iOS and Android">
<meta property="og:image" content="https://core.telegram.org/file/464001785/3/GqL9jQg6ChI.76277/1377819b17eaa4dcce">
<meta property="og:description" content="This page contains instructions for verifying that Telegram&#39;s open source code is exactly the same as the code that is used…">
<link rel="icon" type="image/svg+xml" href="/img/website_icon.svg?4">
<link rel="apple-touch-icon" sizes="180x180" href="/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicon-16x16.png">
<link rel="alternate icon" href="/img/favicon.ico" type="image/x-icon" />
<link href="/css/bootstrap.min.css?3" rel="stylesheet">
<link href="/css/telegram.css?240" rel="stylesheet" media="screen">
<style>
</style>
</head>
<body class="preload">
<div class="dev_page_wrap">
<div class="dev_page_head navbar navbar-static-top navbar-tg">
<div class="navbar-inner">
<div class="container clearfix">
<ul class="nav navbar-nav navbar-right hidden-xs"><li class="navbar-twitter"><a href="https://twitter.com/telegram" target="_blank" data-track="Follow/Twitter" onclick="trackDlClick(this, event)"><i class="icon icon-twitter"></i><span> Twitter</span></a></li></ul>
<ul class="nav navbar-nav">
<li><a href="//telegram.org/">Home</a></li>
<li class="hidden-xs"><a href="//telegram.org/faq">FAQ</a></li>
<li class="hidden-xs"><a href="//telegram.org/apps">Apps</a></li>
<li class=""><a href="/api">API</a></li>
<li class=""><a href="/mtproto">Protocol</a></li>
<li class=""><a href="/schema">Schema</a></li>
</ul>
</div>
</div>
</div>
<div class="container clearfix">
<div class="dev_page">
<div id="dev_page_content_wrap" class=" ">
<div class="dev_page_bread_crumbs"></div>
<h1 id="dev_page_title">Reproducible Builds for iOS and Android</h1>
<div id="dev_page_content"><p>This page contains instructions for verifying that Telegram&#39;s <a href="https://telegram.org/apps#source-code">open source code</a> is exactly the same as the code that is used to build the apps that are available in the <a href="https://telegram.org/dl/ios">App Store</a>, <a href="https://telegram.org/dl/android">Google Play</a> and <a href="https://telegram.org/android">directly</a> on the Telegram website.</p>
<p><strong>Warning:</strong> Telegram supports reproducible builds as of <a href="https://telegram.org/blog/verifiable-apps-and-more"><strong>version 5.13</strong></a>. Bear in mind that, at this stage, the verification process should be considered <strong>experimental</strong>. We will be updating our apps and these instructions to make this process as straightforward as possible.</p>
<ul>
<li><a href="#reproducible-builds-for-android">Telegram for Android</a></li>
<li><a href="#reproducible-builds-for-ios">Telegram for iOS</a></li>
</ul>
<blockquote>
<p>Please read the relevant <strong>notes</strong> and <a href="#troubleshooting">troubleshooting</a> section carefully.</p>
</blockquote>
<hr>
<div class="blog_wide_image">
<a href="/file/464001695/1/nxVa_f-qKS8.216020/9da7686ded6f1e7bef" target="_blank"><img src="/file/464001785/3/GqL9jQg6ChI.76277/1377819b17eaa4dcce" srcset="/file/464001695/1/nxVa_f-qKS8.216020/9da7686ded6f1e7bef, 1200w" title="Builds Telegram verifiable are." alt="Dude in a jacket inspecting the hologram of a mechanical dog to verify it's built according to the blueprints provided."/></a>
</div>
<h2><a class="anchor" name="reproducible-builds-for-android" href="#reproducible-builds-for-android"><i class="anchor-icon"></i></a>Reproducible Builds for Android</h2>
<h3><a class="anchor" name="step-1-install-docker" href="#step-1-install-docker"><i class="anchor-icon"></i></a>Step 1. Install Docker</h3>
<p>Docker can be obtained <a href="https://www.docker.com/">here</a>. Once the installation is complete, log into your Docker account &gt; Settings &gt; Resources &gt; Advanced and configure the amount of resources Docker may use:</p>
<div class="blog_image_wrap">
<a href="/file/464001096/115ed/SDQR5AepsL8.117492/5b793978a9f866dc1e" target="_blank"><img src="/file/464001096/115ed/SDQR5AepsL8.117492/5b793978a9f866dc1e" title="Docker Performance" /></a>
<p>Docker Performance</p>
</div>
<p>We recommend using the maximum amount allowed by your system&#39;s hardware, in order to speed up the build time.</p>
<h3><a class="anchor" name="step-2-confirm-which-version-you-have-installed-on-your-android" href="#step-2-confirm-which-version-you-have-installed-on-your-android"><i class="anchor-icon"></i></a>Step 2. Confirm which version you have installed on your Android device</h3>
<p>You can find the <strong>version/build</strong> number and the source (website, Play Store, Huawei Store) at the bottom of the Settings page. Note that Telegram supports reproducible builds starting with version <strong>5.13</strong>.</p>
<div class="blog_image_wrap">
<a href="/file/464001729/10c74/J5yxQsyIhu8.18423/0676180d6ab192b6ea" target="_blank"><img src="/file/464001729/10c74/J5yxQsyIhu8.18423/0676180d6ab192b6ea" title="App Version" /></a>
<p>App Version</p>
</div>
<!--
<div>
<a href="" target="_blank"><img src="/file/464001812/12119/us-sZeolClE.95982/62ccd4cbf110c2c9a0" title="Telegram Version" class="dev_page_image" width=40%/></a>
</div>
-->
<p>The commit tag to checkout source code for the example above will be <code>release-9.3.3_3026</code>.</p>
<blockquote>
<p>Please make sure that you&#39;re using the correct <strong>version</strong> and <strong>build number</strong> of the version you want to check (and not the one from this example <img class="emoji" src="//telegram.org/img/emoji/40/F09F9888.png" width="20" height="20" alt="😈" />). </p>
</blockquote>
<!--
The part after the version number will help you know in which folder to look for the correct APK when you've finished [building the app (Step 4)](#step-4-build-the-app):
* “Direct” after version number means that the APK will be inside the “afat/standalone” folder.
* "Universal" after version number means that the APK will be inside the “afat/release” folder.
* If you have Android Version 6.0 or greater, your APK folder will have the “_SDK23” suffix.
* “arm64-v8a” - folder name will start with “arm64”.
* “armeabi-v7” - folder name will start with “armv7”.
* “x86” - folder name will start with “x86”.
* “x86_64” - folder name will start with “x64”.
-->
<!--
<div class="blog_image_wrap">
<a href="/file/464001368/2/fgnFkr2Id3Q.55259/d03599849440e62b52" target="_blank"><img src="/file/464001368/2/fgnFkr2Id3Q.55259/d03599849440e62b52" title="Relevant folder" /></a>
<p>APK Folders</p>
</div>
-->
<h3><a class="anchor" name="step-3-obtain-the-source-code" href="#step-3-obtain-the-source-code"><i class="anchor-icon"></i></a>Step 3. Obtain the source code</h3>
<p>Open Terminal, run the commands:<br><code>git clone https://github.com/DrKLO/Telegram.git $HOME/telegram-android</code><br><code>cd $HOME/telegram-android</code><br><code>git checkout release-{VERSION AND BUILD NUMBER FROM STEP 2}</code></p>
<p>For our <a href="#step-2-confirm-which-version-you-have-installed-on-your-android">example</a>, the command would be:<br><code>git checkout release-5.13.0_1821</code></p>
<div class="blog_wide_image">
<a href="/file/464001840/1/5DrefLlg3vw.116770/8901e43605c30939d4" target="_blank"><img src="/file/464001840/1/5DrefLlg3vw.116770/8901e43605c30939d4" title="Obtaining the source code" /></a>
</div>
<h3><a class="anchor" name="step-4-build-the-app" href="#step-4-build-the-app"><i class="anchor-icon"></i></a>Step 4. Build the app</h3>
<p>Open Terminal, run the commands:<br><code>cd $HOME/telegram-android</code><br><code>docker build -t telegram-build .</code></p>
<div class="blog_wide_image">
<a href="/file/464001202/1/UyO3_tLDRPg.35170/31865250522be6db86" target="_blank"><img src="/file/464001202/1/UyO3_tLDRPg.35170/31865250522be6db86" title="Building the app" /></a>
</div>
<p><code>docker run --rm -v &quot;$PWD&quot;:/home/source telegram-build</code></p>
<div class="blog_wide_image">
<a href="/file/464001691/2/SFreJq5OZ4U.34208/f69b83468ac2a07276" target="_blank"><img src="/file/464001691/2/SFreJq5OZ4U.34208/f69b83468ac2a07276" title="Building the app" /></a>
</div>
<div class="blog_wide_image">
<a href="/file/464001014/116e8/0BQSMuzynOI.10222/1293c6fc237ab85f7e" target="_blank"><img src="/file/464001014/116e8/0BQSMuzynOI.10222/1293c6fc237ab85f7e" title="Building the app" /></a>
</div>
<p>These commands will produce 3 different APKs and 2 bundles:</p>
<p><code>/apk/afat/standalone/app.apk</code> used for direct downloads from telegram.org/android<br><code>/apk/afat/elease/app.apk</code> the playstore version<br><code>/apk/afat/release/app-huawei.apk</code> used exclusively for the Huawei store</p>
<p><code>bundle/bundleAfat_SDK23Release/TMessagesProj_App-bundleAfat_SDK23-release.aab</code><br><code>bundle/bundleAfatRelease/TMessagesProj_App-bundleAfat-release.aab</code></p>
<p>These APKs can be found in:<br><code>$HOME/telegram-android/TMessagesProj/build/outputs/apk/afat/</code></p>
<p>Use the folder name from <a href="#step-4-build-the-app">Step 4</a> to find the correct folder that holds the same APK as installed on your device. For example, for the Play Store version, the path to your APK will be:</p>
<p><code>$HOME/telegram-android/TMessagesProj/build/outputs/apk/afat/release/app.apk</code><br>Copy this APK to the root source directory by running this command in Terminal:<br><code>cp $HOME/telegram-android/TMessagesProj/build/outputs/apk/afat/release/app.apk $HOME/telegram-android/telegram_built.apk</code></p>
<div class="blog_wide_image">
<a href="/file/464001970/1/9nwL42h9lAU.32529/9b39cebcdb8c6daff7" target="_blank"><img src="/file/464001970/1/9nwL42h9lAU.32529/9b39cebcdb8c6daff7" title="Copy the APK" /></a>
</div>
<h3><a class="anchor" name="step-5-the-telegram-apk-installed-on-your-device" href="#step-5-the-telegram-apk-installed-on-your-device"><i class="anchor-icon"></i></a>Step 5. The Telegram APK installed on your device</h3>
<p>You will need <a href="https://developer.android.com/studio/releases/platform-tools.html#downloads">adb</a> for this step. </p>
<div class="blog_image_wrap">
<a href="/file/464001167/1/ekMuxStZVes.485894/eb0a512392500d53b3" target="_blank"><img src="/file/464001167/1/ekMuxStZVes.485894/eb0a512392500d53b3" title="ADB" /></a>
<p>ADB</p>
</div>
<blockquote>
<p>If you downloaded your APK <a href="https://telegram.org/android"><strong>directly from Telegram&#39;s website</strong></a>, use the package name <code>org.telegram.messenger.web</code> in this step. To verify the <strong>Google Play APK</strong>, use <code>org.telegram.messenger</code>.</p>
</blockquote>
<p>Connect your device to the computer, open Terminal, run the commands:<br><code>adb shell pm path org.telegram.messenger</code></p>
<div class="blog_wide_image">
<a href="/file/464001688/1/CJrBoBPxoKU.31587/670238fac9bc5f869d" target="_blank"><img src="/file/464001688/1/CJrBoBPxoKU.31587/670238fac9bc5f869d" title="ADB" /></a>
</div>
<p>The output will look something like this:<br><code>package:/data/app/org.telegram.messenger-_zOSURFEx2GpHM8UDF_PVg==/base.apk</code><br>By using this information, pull the APK from your device to $HOME/telegram-android using command:<br><code>adb pull /data/app/org.telegram.messenger-_zOSURFEx2GpHM8UDF_PVg==/base.apk $HOME/telegram-android/telegram_store.apk</code></p>
<h3><a class="anchor" name="step-6-compare-the-apks" href="#step-6-compare-the-apks"><i class="anchor-icon"></i></a>Step 6. Compare the APKs</h3>
<p>To compare Direct and Huawei Store versions, open Terminal, run the commands:<br><code>cd $HOME/telegram-android</code><br><code>python apkdiff.py telegram_store.apk telegram_built.apk</code><br>If the APKs are the same, you will see<br><code>APKs are the same!</code></p>
<div class="blog_wide_image">
<a href="/file/464001327/1/Qcnkce3q-J4.35468/9791eeabf384c7830d" target="_blank"><img src="/file/464001327/1/Qcnkce3q-J4.35468/9791eeabf384c7830d" title="Match" /></a>
</div>
<p>Play Store versions built from a bundle will be marked as &#39;store bundled&#39;. To verify such builds, use:</p>
<p><code>python apkfrombundle.py telegram_bundle.aab telegram_store.apk</code></p>
<p>If anything goes wrong, you will see this:</p>
<div class="blog_wide_image">
<a href="/file/464001245/1/0wuFZh4wBYM.38635/bf90b5a321b44360fb" target="_blank"><img src="/file/464001245/1/0wuFZh4wBYM.38635/bf90b5a321b44360fb" title="Mismatch" /></a>
</div>
<p>If your APKs don&#39;t match, please make sure that you chose <a href="#step-2-confirm-which-version-you-have-installed-on-your-android">the correct code version</a> and <a href="#step-4-build-the-app">the right SDK</a>.</p>
<p>Check out the <a href="#troubleshooting">Troubleshooting</a> section first in case you run into trouble.</p>
<hr>
<h2><a class="anchor" name="reproducible-builds-for-ios" href="#reproducible-builds-for-ios"><i class="anchor-icon"></i></a>Reproducible Builds for iOS</h2>
<p>The verification process for iOS builds is, unfortunately, a lot more complex than for Android. The two main issues with Apple&#39;s current policies and infrastructure are as follows:</p>
<ol>
<li><p>Apple insists on using <strong>FairPlay</strong> encryption to “protect” even <strong>free</strong> and <strong>open source</strong> apps from “app pirates” which makes obtaining the executable code of apps impossible without a jailbroken device. To solve this issue, Apple would simply need to allow submitting unencryptable binaries to the App Store. This would not affect security since the code would still be signed and would enable anyone to check the integrity of apps supporting reproducible builds without endangering the integrity and security of their devices.</p>
</li>
<li><p>Building your own reproducible binaries is difficult because macOS doesn&#39;t support containers like Docker. If Apple followed in the footsteps of Linux (and even Microsoft!) and added container support, it would eliminate the need for steps 1-3 in the guide below.</p>
</li>
</ol>
<blockquote>
<p>As things stand now, you&#39;ll need a <strong>jailbroken device</strong>, at least <strong>1,5 hours</strong> and approximately <strong>90GB</strong> of free space to properly set up a virtual machine for the verification process.</p>
</blockquote>
<p>To provide a stable and easily reproducible environment, Telegram iOS builds are compiled on a virtual machine.</p>
<h3><a class="anchor" name="step-1-running-darwin-containers" href="#step-1-running-darwin-containers"><i class="anchor-icon"></i></a>Step 1. Running Darwin-Containers</h3>
<ol>
<li>Checkout the latest DarwinContainers code: <code>git clone https://github.com/ali-fareed/darwin-containers.git</code></li>
<li>Open darwin-containers/DarwinContainers.xcodeproj</li>
<li>Select DarwinContainersDaemon target</li>
<li>In Signing &amp; Capabilities select your team and set a unique bundle id</li>
<li>Run</li>
</ol>
<h3><a class="anchor" name="step-2-creating-an-os-image" href="#step-2-creating-an-os-image"><i class="anchor-icon"></i></a>Step 2. Creating an OS image</h3>
<blockquote>
<p>Check <a href="https://github.com/TelegramMessenger/Telegram-iOS/blob/master/versions.json">versions.json</a> for information on the relevant macOS and Xcode versions.</p>
</blockquote>
<p><code>./darwin-containers fetch</code></p>
<p>Download the appropriate macOS restore image (e.g. 13.6):</p>
<p><code>./darwin-containers fetch &quot;macOS 13.6&quot;</code></p>
<p>Create a new OS image:</p>
<p><code>./darwin-containers create --source &quot;macOS 13.6&quot; --tag &quot;macos-13.0-xcode-{XCODE_VERSION}&quot; --manual</code></p>
<p>Follow the installation instructions. Set username to <code>containerhost</code> and password to <code>containerhost</code>.</p>
<p>Enable Remote Login and allow full disk access for remote users.</p>
<p>Connect to the guest VM using SSH with username <code>containerhost</code> and password <code>containerhost</code>.</p>
<p>Create the directory <code>~/.ssh</code> and set up the <code>authorized_keys</code> using the public key string printed by the <code>darwin-containers create</code> command earlier.</p>
<p>Upload the appropriate version of Xcode via <code>scp</code> and install to /Applications. Run it at least once to complete installation. Don&#39;t forget to download the <strong>iOS SDK</strong>.</p>
<div class="blog_image_wrap">
<a href="/file/400780400133/4/0E7KiaHo64A.103279/45c9eb5b6181a1bbd4" target="_blank"><img src="/file/400780400133/4/0E7KiaHo64A.103279/45c9eb5b6181a1bbd4" title="" class="dev_page_image" /></a>
</div>
<p>Shut down the guest OS.</p>
<h3><a class="anchor" name="step-3-obtaining-verification-ipa" href="#step-3-obtaining-verification-ipa"><i class="anchor-icon"></i></a>Step 3. Obtaining verification IPA</h3>
<pre><code>python3 -u build-system/Make/Make.py remote-build --darwinContainers=&quot;path-to-darwin-containers-script&quot; --darwinContainersHost=&quot;unix://$HOME/.darwin-containers.sock&quot; --configurationPath=&quot;build-system/appstore-configuration.json&quot; --codesigningInformationPath=build-system/fake-codesigning --configuration=release_arm64</code></pre>
<p>For more information see:</p>
<p><code>build-system/Make/RemoteBuild.py</code><br><code>.gitlab-ci.yml</code> lane <code>verify_beta_testflight</code></p>
<h3><a class="anchor" name="step-4-obtaining-the-source-code" href="#step-4-obtaining-the-source-code"><i class="anchor-icon"></i></a>Step 4. Obtaining the source code</h3>
<p><code>git clone --recursive https://github.com/TelegramMessenger/telegram-ios.git $HOME/telegram-ios</code><br><code>cd $HOME/telegram-ios</code><br><code>git checkout release-${VERSION_NUMBER}</code></p>
<p>E.g., <code>git checkout release-7.3</code>. Please note that you need to check out the whole git history as the build version depends on the number of commits in the repository.</p>
<div class="blog_wide_image">
<a href="/file/464001402/3/U43d2T5SSGY.181052/c86e9e2a72b766e704" target="_blank"><img src="/file/464001402/3/U43d2T5SSGY.181052/c86e9e2a72b766e704" title="git clone" /></a>
</div>
<h3><a class="anchor" name="step-5-downloading-a-decrypted-version-of-the-app-from-the-app-s" href="#step-5-downloading-a-decrypted-version-of-the-app-from-the-app-s"><i class="anchor-icon"></i></a>Step 5. Downloading a decrypted version of the app from the App Store</h3>
<p>This step requires a jailbroken device equipped with tools for decrypting apps. Wed love to make this process more simple but thats what you get for using Apple tech.</p>
<h3><a class="anchor" name="step-6-comparing-the-appstore-build-and-the-version-built-in-the" href="#step-6-comparing-the-appstore-build-and-the-version-built-in-the"><i class="anchor-icon"></i></a>Step 6. Comparing the AppStore build and the version built in the virtual machine</h3>
<p><strong>Run</strong><br><code>python3 tools/ipadiff.py build/artifacts/Telegram.ipa PATH-TO-THE-IPA-FILE-FROM-STEP-9</code></p>
<ol>
<li>cd telegram-ios &gt; Enter</li>
<li>python3 tools/ipadiff.py build/artifacts/Telegram.ipa /path/ &gt; Enter</li>
</ol>
<div class="blog_wide_image">
<a href="/file/464001464/2/3skIXy_2ghc.41339/a62e0ea589b713438d" target="_blank"><img src="/file/464001464/2/3skIXy_2ghc.41339/a62e0ea589b713438d" title="Сomparing builds" /></a>
</div>
<p>In case of a successful comparison, you will get a text along these lines:</p>
<pre><code>IPAs are equal, except for the files that can&#39;t currently be checked:
Excluded files that couldn&#39;t be checked due to being encrypted:
PlugIns/SiriIntents.appex/SiriIntents
PlugIns/Widget.appex/Widget
PlugIns/NotificationContent.appex/NotificationContent
PlugIns/NotificationService.appex/NotificationService
PlugIns/Share.appex/Share
IPAs contain Watch directory with a Watch app which can&#39;t be checked currently.
IPAs contain .car (Asset Catalog) files that are compiled by the App Store and can&#39;t currently be checked:
Frameworks/TelegramUI.framework/Assets.car
Assets.car
IPAs contain .nib (compiled Interface Builder) files that are compiled by the App Store and can&#39;t currently be checked:
Base.lproj/LaunchScreen.nib</code></pre>
<div class="blog_wide_image">
<a href="/file/464001561/2/8mgy93NZXIg.138258/a0a0dca779416fba8a" target="_blank"><img src="/file/464001561/2/8mgy93NZXIg.138258/a0a0dca779416fba8a" title="The result > equal IPAs" /></a>
</div>
<p>In case of any mismatches, you&#39;ll get a detailed report.</p>
<div class="blog_wide_image">
<a href="/file/464001384/3/iSp-75NOtIU.58868/7b08b99752cdf7dd22" target="_blank"><img src="/file/464001384/3/iSp-75NOtIU.58868/7b08b99752cdf7dd22" title="Mismatching IPAs" /></a>
</div>
<hr>
<h3><a class="anchor" name="ios-notes" href="#ios-notes"><i class="anchor-icon"></i></a>iOS: Notes</h3>
<ol>
<li><p>You will get a warning if the archive created in <a href="#step-5-downloading-a-decrypted-version-of-the-app-from-the-app-s">Step 5</a> contains encrypted files. If all these files are in the <code>PlugIns</code> subfolder, they represent various system extensions (e.g. external sharing, Siri). Decrypting such files using existing ways of receiving app archives via Jailbreak is non-trivial (but we&#39;re working on resolving this issue). If you do manage to decrypt them, e.g. on iOS 8, they will be matched.</p>
</li>
<li><p>Files with the <code>.car</code> extension are app resource archives (images, sounds) which were compiled and processed specifically for the target device. The App Store processes them in non-trivial ways, we&#39;re planning on getting rid of them in future versions.</p>
</li>
<li><p>The <code>LaunchScreen.nib</code> file is an empty file containing a description of the interface which is displayed by the system before the app is launched. It is processed by the App Store in a non-trivial way but doesn&#39;t contain any code and therefore may be ignored.</p>
</li>
</ol>
<hr>
<h2><a class="anchor" name="troubleshooting" href="#troubleshooting"><i class="anchor-icon"></i></a>Troubleshooting</h2>
<p>If you encounter any issues with obtaining the code, building and comparing the apps, please contact us at <a href="https://t.me/botsupport">@BotSupport</a> and include the hashtag <code>#reproducibleBuilds</code> with your message describing the problem.</p>
<h3><a class="anchor" name="troubleshooting-android" href="#troubleshooting-android"><i class="anchor-icon"></i></a>Troubleshooting: Android</h3>
<ol>
<li><p>Make sure that you checkout <a href="#step-2-confirm-which-version-you-have-installed-on-your-android">the correct version</a> of the code.</p>
</li>
<li><p>Make sure that you build the app using <a href="#step-4-build-the-app">the right SDK</a>.</p>
</li>
<li><p>If the gradle version used in the Dockerfile is not available anymore and building of the Docker image fails, wait for a Dockerfile update or update manually to lastest available version.</p>
</li>
</ol>
</div>
</div>
</div>
</div>
<div class="footer_wrap">
<div class="footer_columns_wrap footer_desktop">
<div class="footer_column footer_column_telegram">
<h5>Telegram</h5>
<div class="footer_telegram_description"></div>
Telegram is a cloud-based mobile and desktop messaging app with a focus on security and speed.
</div>
<div class="footer_column">
<h5><a href="//telegram.org/faq">About</a></h5>
<ul>
<li><a href="//telegram.org/faq">FAQ</a></li>
<li><a href="//telegram.org/privacy">Privacy</a></li>
<li><a href="//telegram.org/press">Press</a></li>
</ul>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/apps#mobile-apps">Mobile Apps</a></h5>
<ul>
<li><a href="//telegram.org/dl/ios">iPhone/iPad</a></li>
<li><a href="//telegram.org/android">Android</a></li>
<li><a href="//telegram.org/dl/web">Mobile Web</a></li>
</ul>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/apps#desktop-apps">Desktop Apps</a></h5>
<ul>
<li><a href="//desktop.telegram.org/">PC/Mac/Linux</a></li>
<li><a href="//macos.telegram.org/">macOS</a></li>
<li><a href="//telegram.org/dl/web">Web-browser</a></li>
</ul>
</div>
<div class="footer_column footer_column_platform">
<h5><a href="/">Platform</a></h5>
<ul>
<li><a href="/api">API</a></li>
<li><a href="//translations.telegram.org/">Translations</a></li>
<li><a href="//instantview.telegram.org/">Instant View</a></li>
</ul>
</div>
</div>
<div class="footer_columns_wrap footer_mobile">
<div class="footer_column">
<h5><a href="//telegram.org/faq">About</a></h5>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/blog">Blog</a></h5>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/apps">Apps</a></h5>
</div>
<div class="footer_column">
<h5><a href="/">Platform</a></h5>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/press">Press</a></h5>
</div>
</div>
</div>
</div>
<script src="/js/main.js?47"></script>
<script>backToTopInit("Go up");
removePreloadInit();
</script>
</body>
</html>