原文地址:core.telegram.org/reproducibl…
原文作者:telegram.org/
发布时间:2020年8月16日
本页包含验证Telegram的开放源代码与用于构建App Store和Google Play中可用版本的代码完全相同的说明。
警告:Telegram从5.13版本开始支持可复制的构建。请记住,在这个阶段,验证过程应该被视为实验性的。我们将更新我们的应用程序和这些说明,以使这个过程尽可能的简单。
请仔细阅读相关注意事项和故障排除部分。
安卓系统的可复制构建
第1步,安装Docker
Docker可以在这里获得。安装完成后,登录到你的Docker账户 > 首选项 > 高级,配置Docker可能使用的资源量
Docker性能
我们建议使用系统硬件允许的最大数量,以加快构建时间。
第二步:确认你的Android设备上安装的版本。确认您的Android设备上安装的版本。
你可以在设置页面的底部找到版本/版本号。请注意,Telegram支持从5.13版本开始的可复制版本。
应用程序版本
上面例子中检查源代码的提交标签将是release-5.13.0_1821
。
请确保你使用的是你要检查的版本的正确版本和构建号(而不是本例中的😈)。
版本号后面的部分将帮助你知道当你完成构建应用程序(步骤4)时,在哪个文件夹中寻找正确的APK。
- 版本号后的 "Universal "表示APK将在 "afat "文件夹内。
- 如果你的安卓版本为6.0或更高,你的APK文件夹会有"_SDK23 "的后缀。
- "arm64-v8a" - 文件夹名将以 "arm64 "开头。
- "armeabi-v7" - 文件夹名将以 "armv7 "开头。
- "x86" - 文件夹名称将以 "x86 "开头。
- "x86_64" - 文件夹名称将以 "x64 "开头。
APK文件夹
第三步:获取源码 获取源代码
打开终端,运行命令。
git clone https://github.com/DrKLO/Telegram.git $HOME/telegram-android
cd $HOME/telegram-android
git checkout release-{VERSION AND BUILD NUMBER FROM STEP 2}
在我们的例子中,命令是git checkout releas-5.13.0_1821
第四步 构建应用程序
打开终端,运行命令。
cd $HOME/telegram-android
docker build -t telegram-build .
docker run --rm -v "$PWD":/home/source telegram-build
这些命令将为不同的目标SDK版本和CPU ABI生成9个不同的APK。
这些APKs可以在以下路径找到:$HOME/telegram-android/TMessagesProj/build/outputs/apk/
使用步骤2中的文件夹名称找到正确的文件夹,该文件夹中的APK与您的设备上安装的APK相同。例如,对于非通用的Android 9.0 arm64-v8a,你的APK的路径将是:$HOME/telegram-android/TMessagesProj/build/outputs/apk/arm64_SDK23/release/app.apk
在终端机中运行此命令,将此APK复制到根源目录:
cp $HOME/telegram-android/TMessagesProj/build/outputs/apk/arm64_SDK23/release/app.apk $HOME/telegram-android/telegram_built.apk
第五步。Telegram的APK的Play Store版本。
这一步你需要ADB。
将设备连接到电脑上,打开终端,运行命令:adb shell pm path org.telegram.messenger
输出结果看起来像这样:package:/data/app/org.telegram.messenger-_zOSURFEx2GpHM8UDF_PVg==/base.apk
通过使用这些信息,使用命令将APK从设备上拉到HOME/telegram-android/telegram_store.apk`
第六步. 比较APKs
打开终端,运行命令。
cd $HOME/telegram-android
python apkdiff.py telegram_store.apk telegram_built.apk
如果APK是一样的,你会发现APKs are the same!
塔达!否则,就会出问题。
如果你的APK不匹配,请确认你选择了正确的代码版本和正确的SDK。
请先查看故障排除部分,以防遇到问题。
iOS的可复制构建
不幸的是,iOS构建的验证过程要比Android复杂得多。苹果目前的政策和基础设施主要有以下两个问题。
-
苹果坚持使用
FairPlay
加密技术来 "保护 "即使是免费
的应用,也不会受到 "应用海盗 "的侵害,这使得在没有越狱设备的情况下,无法获得应用的可执行代码(这也无谓地增加了应用包的大小约50%)。要解决这个问题,苹果只需要允许向App Store提交不可加密的二进制文件即可。这不会影响安全性,因为代码仍然会被签名--并且可以让任何人检查支持可复制构建的应用程序的完整性,而不会危及其设备的完整性和安全性。 -
构建自己的可复制二进制文件很困难,因为macOS不支持Docker这样的容器。如果苹果跟随Linux(甚至是微软!)的脚步,增加容器支持,就不需要下面指南中的1-3步了。
就目前的情况来看,你需要一个越狱的设备, 至少1,5小时和大约90GB的可用空间,以正确设置一个虚拟机的验证过程.
为了提供一个稳定且易于重现的环境,Telegram iOS builds是在虚拟机上编译的。Parallels 被用来验证构建版本。
第1步:安装Parallels虚拟机
Parallels可以在这里获得,它的特点是有一个功能齐全的试用版。
第二步:安装最新版本的macOS Catalina。安装最新版本的macOS Catalina
要下载可以安装在虚拟机上的镜像,请打开App Store,搜索 "Catalina "并点击 "查看"。
在 App Store 上搜索 macOS Catalina > 查看
macOS Catalina > 获取
这将打开一个系统弹出窗口,提供下载操作系统。
macOS Catalina > 下载
选择 "下载 "并等待下载完成。> 如果你没有使用最新版本的操作系统,你的系统可能会开始更新,请完成更新下载macOS Catalina。请完成更新以下载 macOS Catalina。下载完成后,打开 Parallels 并选择 macOS Catalina。
选择 "安装Windows或其他操作系统">继续。
选择一个文件... > 应用程序(所有文件) > 安装macOS Сatalina。
在开始安装之前,配置虚拟机。
选框 "安装前自定义设置
将虚拟机的名称改为macos10_15_Xcode11_2
。
将VM命名为macos10_15_Xcode11_2。
硬件 > 处理器。2-4 内存>4GB可能就够了,但建议使用8GB。
至少2个CPU+4(建议8)GB内存。
你会得到这样的东西。
点击继续
Parallels 可能会要求访问您的麦克风和摄像头,这不是必须的 - 只需按关闭。
安装macOS > 继续
你的Apple ID也不是必须的,你可以选择 "稍后设置"。
使用 "稍后设置 "跳过Apple ID
使用 "telegram "作为账户名和密码。
千万不要用 "telegram "这个密码来做其他事情,这是被诅咒的。
创建一个电脑账户,账户名和密码都设置为'telegram'。
现在从菜单栏安装 Parallels 工具。
使用菜单栏 > Parallels 图标 > 操作 > 安装 (重新安装) Parallels Tools......安装 Parallels Tools。
系统重启后,登录。
打开终端并运行:sudo visudo
输入密码 "电报"。
在文件的最后找到这一行:%admin ALL=(ALL) ALL
按键盘上的 "i",添加 "NOPASSWD:"%admin ALL=(ALL) NOPASSWD: ALL
按 "Escape "键。
输入":wq"
按回车键
按i编辑高亮显示的字符串。
输入 :wq > 按 Enter 键。
在终端中,运行:sudo systemsetup -setcomputersleep Never
sudo systemsetup -setcomputersleep Never > 按 Enter 键。
第3步:在虚拟机上安装SSH密钥 在虚拟机上安装SSH密钥
在虚拟机中,打开系统设置 > 共享并启用远程登录。
在虚拟机中,打开终端并运行:mkdir -p .ssh; nano .ssh/authorized_keys
在你的主操作系统中,打开终端并运行:if [ ! -e ~/.ssh/id_rsa.pub ]; then ssh-keygen -t rsa -b 4096; fi && cat ~/.ssh/id_rsa.pub | pbcopy
如果你看到 "输入保存密钥的文件(/Users/.../.ssh/id_rsa):",按Enter键。
在虚拟机中,按CMD+V。
然后Ctrl+O,Ctrl+X
第四步:安装必要的工具
在虚拟机上安装Homebrew:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装yasm软件包:brew install yasm cmake
安装Java8运行时:brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8
第5步:安装Xcode 11.2.1版本
在虚拟机中,打开Safari并访问developer.apple.com。
登录到您的账户。
developer.apple.com > 账户 > 用你的 Apple ID 登录
前往下载 > 更多
在搜索栏中输入Xcode并找到11.2.1版本
下载 > 更多 > Xcode 11.2.1
安装完成后,打开Xcode 11.2.1.xip文件。系统会将该程序解压缩到同一个文件夹中。使用Finder将其移动到应用程序文件夹中。
解压缩Xcode > 将应用程序拖到应用程序文件夹中
在虚拟机上,从终端运行此命令:sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
关闭虚拟机。
关闭虚拟机
步骤6. 获取源代码
git clone --recursive https://github.com/TelegramMessenger/telegram-ios.git $HOME/telegram-ios
cd $HOME/telegram-ios
git checkout releas--${VERSION_NUMBER}。
例如,git checkout releas-5.13.1
第七步 建设降压
在主机上安装Xcode(见步骤5或从App Store获取)。
在主机上安装Homebrew:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后运行这些命令:brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8
brew install ant
cd $HOME/telegram-ios/tools/buck-build && mkdir -p $HOME/buck_source sh ./prepare_buck_source.sh $HOME/buck_source
步骤8. 构建应用程序
打开终端,运行命令:cd $HOME/telegram-ios BUCK="$HOME/buck_source/buck/buck-out/gen/programs/buck.pex" sh buildbox/build-telegram.sh verify
如果环境设置正确,这将开始构建过程。请注意,这一步很容易耗费30-40分钟。MacBook Pro(i9 6核)的平均构建时间为35分钟。
一旦完成这个过程,产生的IPA文件可以在build/artifacts/Telegram.ipa
中找到。
以下所有步骤都将通过主系统上的终端进行。
步骤9. 从App Store下载解密版的应用。
这一步需要越狱的设备配备解密应用程序的工具. 我们很想让这个过程变得更简单,但这就是你使用苹果技术的结果.
步骤 10. 比较AppStore构建和虚拟机中构建的版本。
安装必要的工具:if ! type brew > /dev/null; then /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"; fi && brew install python3
运转:python3 tools/ipadiff.py build/artifacts/Telegram.ipa PATH-TO-IPA-File-ROM-STEP-9
。
- cd telegram-ios > Enter
- python3 tools/ipadiff.py build/artifacts/Telegram.ipa /path/ > enter
如果比较成功,你会得到这样的文字:
IPAs are equal, except for the files that can't currently be checked:
Excluded files that couldn'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't be checked currently.
IPAs contain .car (Asset Catalog) files that are compiled by the App Store and can'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't currently be checked:
Base.lproj/LaunchScreen.nib
如果出现任何不匹配的情况,你会得到一份详细的报告。
iOS。笔记
-
如果在步骤7中创建的存档包含加密文件,您将收到警告。如果这些文件都在PlugIns子文件夹中,它们代表了各种系统扩展(例如外部共享、Siri、3D touch)。使用现有的通过越狱接收应用存档的方式来解密这些文件是不容易的(但我们正在努力解决这个问题)。如果你确实设法解密了它们,例如在iOS 9上,它们将被匹配。
-
如果存档中包含Apple Watch应用,您将会收到通知。手表应用程序将很快不再包含在存档中。
-
以**.car** 为扩展名的文件是专门为目标设备编译和处理的应用程序资源存档(图像、声音)。App Store会以非平凡的方式处理它们,我们正计划在未来的版本中摆脱它们。
-
LaunchScreen.nib文件是一个空文件,它包含了对界面的描述,在应用启动之前,系统会将其显示出来。它被App Store以一种非平凡的方式处理,但不包含任何代码,因此可能被忽略。
5 代码目前包括二进制库(WebP、PLCrashReporter),这些库将很快与项目一起构建。
疑难解答
如果您在获取代码、构建和比较应用程序时遇到任何问题,请通过@botsupport与我们联系,并在描述问题的消息中加入标签#reproducibleBuilds
。
疑难解答。安卓
-
确保你检查出代码的正确版本。
-
确保你使用正确的SDK构建应用。
-
如果Dockerfile中使用的gradle版本已经不可用,并且构建Docker镜像失败,请等待Dockerfile更新或手动更新到最新的可用版本。
…
我们将在本节中更新有关克服其他常见问题的信息。
通过( www.DeepL.com/Translator )(免费版)翻译