在Android Studio上编译自己的Telegram

在国内的人可能对Telegram了解的不多,因为用的多的还是微信QQ。所以,在开始这篇文章之前,我先引用维基百科上的内容介绍一下telegram。
历史
它在2013年由杜洛夫兄弟正式激活,也就是尼古拉·杜洛夫与保罗·杜洛夫,俄罗斯最大的社交网络服务VKontakte的创始者。
Telegram Messenger LLP是独立的非营利公司,设立在柏林,而且与VKontakte毫无关系。尼古拉·杜洛夫为它设计新的网络传输协议称为MTProto,同时保罗·杜洛夫自数字堡垒公司提供资金与基础设备。在2013年10月的统计,每日有10万名用户在在线活动。在2016年2月,官方宣称突破一亿月活跃用户,而且每日有 150 亿消息在传递。活跃人数
2013年10月,Telegram每天有10万活跃用户数。2014年3月24日,Telegram公布其服务分别已达到每月3500万活跃用户数和每日1500万活跃用户数。2015年9月,发表声明,表示该应用程序有6000万活跃用户数和日常消息传递有120亿。2016年2月Telegram公布他们每月有1亿活跃用户数,每天有35万新用户注册数,每日传递150亿则消息。
—— —— 维基百科Telegram
以上是维基百科上对Telegram的介绍,而在我看来Telegram和微信QQ最大区别在于,它是完全免费和开源的。是的,没有任何的广告。并且拥有自己独立的加密算法,重视用户安全和隐私,所以在国外用的人还是挺多,可惜在国内被墙了。
那么说回正题,作为每天传递150亿消息的一款IM,它的源代码就放在github上,任何人都可以遵循它的规则,从github上获取telegram app的源代码

那么接下来,我将以Android为例,在Android studio中编译自己的telegram。在写这篇文章之前,我搜了一下国内的blog,虽然有讲到telegram编译的,但似乎一笔带过了,讲的不够详细,不知道意义何在。。。国外倒是有一篇比较详细的文章,讲如何编译的,如果你没有耐心读完,可以移步这里:Building Telegram-Android 。但不管怎样,请确保你的手机和电脑都能科学上网,因为后面要申请telegram的apiid,申请google service,并且telegram本身也是基于gcm的
首先打开telegram的android项目 的github:

telegram欢迎开发者用他们的源码和api在他们的平台上开发自己的app,但要注意以下几点:
- 申请apiid
- 不要使用telegram这个名字
- 不要使用telegram的icon
- 请确保学习了他们的security guidelines并且注意用户隐私
- 代码应当开源以符合开源协议
所有的一切,当然是从拉去github上的代码开始,但注意,你不能单纯的使用git clone,因为telegram本身还依赖了另一个git仓库,你需要使用 git clone --recursive git@github.com:DrKLO/Telegram.git 命令,把telegram以及它所依赖的子模块克隆到本地。这里有个注意事项,telegram最好放在根目录,比如d盘根目录,否则路径太长可能会导致fatal error: opus.h: No such file or directory,详情参见Run telegram application - build error。
clone完成之后,把TMessagesProj下的build.gradle中的signingConfigs 和buildTypes全删了,因为我们缺少它打包所需要的东西,以及applicationIdSuffix “.beta”会在接下来我们在google service中配置的包名后面加上.beta,导致配置文件错误,所以干脆全删了。之后把sourceSets.foss 也删了,因为在buildTypes中已经把foss的配置删掉了。前期准备工作基本上大致是这样,之后再build,你会发现和之前一样,会提示你缺少google-service.json

这是因为telegram使用了gcm,而它github上的项目中并没有把gcm的配置文件,也就是google-service.json给我们,所以需要我们自己申请。因为原有的gcm服务,现在已经被迁移到firebase上,所以你可以去https://firebase.google.com/申请你的google配置文件。大致流程如下,
登录firebase新建一个项目:

之后选择将firebase添加到android

新建android项目的时候,这里我把包名设定为com.mytelegram.cn,之后继续往下走,点击下载google-service.json文件就行了

之后把下载下来的google-service.json放在TMssagesProj的根目录下,之后因为我们在申请firebase服务的时候填入的packagename是com.mytelegram.cn,所以在build.gradle中也同样需要把defaultConfig.applicationId改为com.mytelegram.cn,最后就是这样的:

到这里,编译可能就能通过了。为什么说是可能呢?因为jni编译的时候根据ndk版本不同,可能会报各种各样的错,也可能不会报错,假如你和我一样,使用17.0左后的ndk,那么你还需要改动jni目录下的application.mk文件中的APP_ABI,把APP_ABI的armeabi 删除,这是因为在17.0左右,armeabi 已经太老了,不支持了。假如你的jni编译还有其他的错误,建议多google一下,总会找到答案的:)。
编译通过之后,就只差最后一步了,你需要去https://my.telegram.org/申请你的apiid,申请apiid需要你先用手机号注册一下telegram,因为没什么难的,就不详细讲了。最后到达这个界面,途中箭头所示的两个字段就是我们要的。

把apiid和api_hash填入org.telegram.messenger下的BuildVars.java文件中,同时底下还有HOCKEY_APP_HASH和HOCKEY_APP_HASH_DEBUG两个字段,这两个字段需要一个32位的字符串,我这里用了32个0,也通过了。
到这里,基本上就完成了所有要做的事,你接下来可以在自己的电脑上对telegram进行调试了,我这里改了一下telegram的名字,我把名字改成了我的博客名,icon改成了android初始icon,成功运行起来了自己的telegram

那么最后做一下总结
1.clone项目,记得同时clone依赖的子模块
2.注册google 的firebase,拿到google-service.json
3.修改build.gradle
4.申请api_id并在配置文件里修改
5.排查jni编译时候的错误
6.通过编译并运行
自己编译的telegram和googleplay上下的没什么不同,一样能收到消息,但是注意不能使用语音电话功能。
Tips:当我开始阅读telegram的源码时,映入眼帘的就是一个三千多行的LoginActivityε=(´ο`*)))