1、下载源码、导入Android studio中调试并运行成功
从在github 上找到源码,到调试成功,Telegram能够被安装到手机上运行,前前后后花了起码四五天!调试过程中遇到了很多问题,特此记录!
正确步骤:
- 通过github克隆源码。地址:Telegram 源码。按照网址上要求下载Android studio 3.4及以上版本、NDK20、SDK8.1,避免出错误。下图是克隆过程,当然也可以通过git 命令行进行操作。
遇到的问题:克隆失败,多克隆几次,用了git 的图形界面版,最终成功。 可能是网络问题。也可以不用git 克隆直接下载压缩包,使用Android studio 打开文件夹。 - 生成release.keystore 放置在项目目录下(Telegram\TMessagesProj\config)。这是因为从github 上克隆时,会少克一些配置文件,所以要自己生成。对于如何生成release.keystore文件,可以看这个。key store path可以直接选择上面的路径。名称写为release.keystore。(key store password、alias、key password记好,等下要填写到gradle.properties中)
注:生成的keystore 文件后缀名为.jks ,需要重命名为release.keystore。调试过程中,如果出现含有release.keystore 关键字的错误,一般都是这步哪里出了问题。尝试查看目录下是否存在该文件,或者重新生成,以及检查gradle.properties 中参数是否正确。 - 在gradle.properties 中填写RELEASE_KEY_PASSWORD,RELEASE_KEY_ALIAS和RELEASE_STORE_PASSWORD,以访问自己的release.keystore。
- 点击这里,创建两个具有应用程序,org.telegram.messenger和org.telegram.messenger.beta的android应用,并下载org.telegram.messenger的google-services.json,复制到TMessagesProj的子目录中。
遇到问题:运行报错,缺少org.telegram.messenger.beta 包,尝试将build.gradle中出现的 applicationIdSuffix “.beta” 这句代码注释掉。 - 在TMessagesProj / java / org / telegram / messenger / BuildVars.java中填写值-每个变量都有一个链接,显示从何处以及从何处获取数据。APP_ID、APP_HASH通过下图方法注册获得,下面四个参数可以和我一样,其中HOCKEY_APP_HASH和HOCKEY_APP_HASH_DEBUG只要是32位即可。
遇到的问题,好几个网页打不开,这些网站有些需要翻墙才能访问,这个自行解决。 - 此时,必备步骤已经完工,开始编译、运行。这个过程可能会遇到各种问题,需要根据实际情况理智分析,上网查阅解决办法。下面粘出我的Gradle 配置,SDK、NDK版本,以及整个导入过程中对项目调试运行有帮助的一些链接。
Telegram错误总结
在Android Studio上编译自己的Telegram
telegrm电报常见问题
Gradle build 报错:Received status code 400 from server: Bad Request
Error:SSL peer shut down incorrectly(完美解决)
No matching client found for package name (Google Analytics) - multiple productFlavors & buildTypes [closed]
注:运行成功后,可以连接自己的手机运行、安装(虚拟机比较卡,我电脑完全带不动),手机需要打开开发者模式和Debug模式。
2、Telegram项目目录结构
Telegram 和一般的android 项目不同的是,它的前端ui 部分并不是用xml 布局文件写的,而是用纯java 写的!所以你会发现layout中基本找不到.xml 文件。
目前,代码看了一部分,由于之前基本没学过android,看起来比较吃力。有些类大概知道是干嘛的。特此记录!
messenger目录下:
ApplicationLoader.java --> 用来加载配置信息,初始化App,监测网络变化等。
SendMessagesHelper --> 发送各类消息的类
ui目录下:
ChatActivityEnterView.java --> 这个类是聊天窗口中发送消息界面部分。里面有发送消失按钮的监听事件、以及相关界面的绘制等。
CacheControlActivity.java --> 清理缓存Activity
ChangeNameActivity.java --> 编辑名称条目Activity
ChatActivity.java --> 聊天窗口,有按钮监听事件、顶部导航条目界面及监听事件等。
DateSettingsActivity.java --> 数据存储设置
LoginActivity.java --> 登录界面,选择国家,填写手机号
DialogActivity.java --> 登陆成功后,跳转的页面,对话界面,显示所有的对话信息。
LogoutActivity.java --> 登出界面
NotificatonsSettingsActivity.java --> 通知和声音Activity
PasscodeActivity.java --> 添加密码锁
PrivacySettingActivity.java --> 隐私、安全设置
ThemeActivity.jav --> 聊天主题类
…
3、知识点
- 动态访问数据权限,放置在Fragment 的构造函数中,出现问题,导致此Fragment 无法打开。
- 字节流、字符流区别:以stream结尾都是字节流,以reader和writer结尾都是字符流,两者的区别就是读写的时候一个是按字节读写,一个是按字符。在实际使用时差不多。在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。只是读写文件,和文件内容无关的,一般选择字节流。所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。Java的字节流:InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。.Java的字符流:Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。InputStream,OutputStream,Reader,writer都是抽象类。所以不能直接new。
来源:CSDN
作者:Ydecube
链接:https://blog.csdn.net/Ydecube/article/details/102874289