序文
Telegramは、セキュリティと速度に重点を置いた強力なエンドツーエンドの暗号化IMであり、Android / IOS / Windows / macOSなどのプラットフォームをサポートし、機能が豊富で、スムーズに実行でき、無料でオープンソースです。コードは学習と研究。
Telegramは、セキュリティと速度に重点を置いたクラウドベースのモバイルおよびデスクトップメッセージングアプリです。
1 | 2 | 3 |
---|---|---|
ソースコードのコンパイル
コンパイル環境はバージョンAndroid Studio
4.2.1で、組み込みJDK
を使用していますAndroid Studio
OpenJDK 11
- github.com/DrKLO/TelegからTelegramソースコードをダウンロード…
- 自分
release.keystore
のTMessagesProj/config
ディレクトリをコピーします - 次のように、ファイルに、、を
gradle.properties
入力RELEASE_KEY_PASSWORD
します。RELEASE_KEY_ALIAS
RELEASE_STORE_PASSWORD
RELEASE_KEY_PASSWORD=123456
RELEASE_KEY_ALIAS=jack
RELEASE_STORE_PASSWORD=123456
复制代码
- console.firebase.google.comにアクセスし、2つのAndroidアプリケーションを作成します。アプリケーションIDはそれぞれ
org.telegram.messenger
とですorg.telegram.messenger.beta
。次にgoogle-services.jsonをダウンロードして、TMessagesProjディレクトリにコピーします。
- my.telegram.orgにログインし、 api_id と api_hashを申請して、ファイル内のフィールドとフィールドを置き換えます
TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java
APP_ID
APP_HASH
- プログラムをコンパイルして実行します
ソースコード分析
Telegram服务端源码不开源,那研究Telegram客户端代码有何意义呢?个人认为Telegram作为世界级IM,研究其源码还是相当有意义的,如下:
- 学习Telegram优秀的设计&编程思想,如单模块,单Activity架构,动态生成布局等
- 将Telegram中相对独立的功能如rlottie(贴纸),MTProto(通信协议),webrtc(音视频通话)剔除其业务逻辑然后抽出来,集成到自己的项目中
Telegram源码极其庞大和复杂,博大精深(晦涩难懂),有以下特点:
- 项目只有一个模块
TMessagesProj
,没有模块化,没有组件化,没有Kotlin
,没有MVVM
... - 项目极少直接使用第三方类库,没有
okhttp
,没有glide
,包含大量c/c++代码(tgnet,ffmpeg,webrtc,rlottie...) - 项目中极少使用xml文件进行布局,基本都是使用代码动态生成界面,采用单
Activity
+多Fragment
(这里的Fragment
和Android SDK
里的Fragment
没有任何关系) - 一个java类文件常常多达几千至几万行而没有任何注释说明,阅读起来感觉太爽了_^_
目前仅仅研究了一点点其贴纸使用的类库rlottie,如下:
- 贴纸尺寸为512*512像素,时长不超过3s,每秒运行60帧
- 贴纸文件名后缀为.tgs,本地缓存路径为
Android/data/org.telegram.messenger/cache
- tgs文件可以直接拖放到lottiefiles.com/preview上预览效果
1 | 2 | 3 |
---|---|---|
rlottie代码分析
native代码
TMessagesProj/jni/lottie.cpp
rlottie包装类,定义了一些native函数,供java层调用TMessagesProj/rlottie
rlottie核心代码TMessagesProj/lz4
压缩类库代码
java代码
RLottieImageView
继承于ImageView
,内部调用RLottieDrawable
展示播放tgs动画RLottieDrawable
から継承されDrawable
、ネイティブコードを呼び出してレンダリングアニメーションを作成します
//使用文件路径创建动画
public static native long create(String src, String json, int w, int h, int[] params, boolean precache, int[] colorReplacement, boolean limitFps);
//使用json字符串创建动画
protected static native long createWithJson(String json, String name, int[] params, int[] colorReplacement);
//销毁动画
public static native void destroy(long ptr);
//设置指定层次的颜色
private static native void setLayerColor(long ptr, String layer, int color);
//替换颜色
private static native void replaceColors(long ptr, int[] colorReplacement);
//获取一帧动画
public static native int getFrame(long ptr, int frame, Bitmap bitmap, int w, int h, int stride, boolean clear);
//创建缓存
private static native void createCache(long ptr, int w, int h);
复制代码
Telegramからrlottie関連のコードを抽出し、github.com /kongpf8848/にアップロードしました…
その他のオープンソースIM
- プライバシーの主な焦点であるSignal、LaoMaはUseSignal、GitHubを推奨しています
- ワイヤー、暗号化されたチャットIM、GitHub