在第一篇中,我们分析过 libjingle_peerconnection_so.so 主要由四个target 组成,这四个target分别是:
libjingle_peerconnection_jni 是一个静态库.
libjingle_peerconnection_metrics_default_jni 也是一个静态库
libjingle_peerconnection 是一个source set
rtc_base 同样是一个静态库
今天我们先来分析: libjingle_peerconnection_jni 这个静态库,gn 语法中每个静态库应该是完全独立的模块.
生成独立的libjingle_peerconnection_jni静态库
ninja -C out/Debug sdk/android:libjingle_peerconnection_jni
src/sdk/android/BUILD.gn
rtc_static_library("libjingle_peerconnection_jni") {
visibility = [ "*" ]
allow_poison = [
"audio_codecs", # TODO(bugs.webrtc.org/8396): Remove.
"software_video_codecs", # TODO(bugs.webrtc.org/7925): Remove.
]
public_deps = [ # no-presubmit-check TODO(webrtc:8603)
":audio_jni",
":base_jni",
":java_audio_device_module_jni",
":media_jni",
":peerconnection_jni",
":video_jni",
"../../pc:create_pc_factory",
]
}
那么这个静态库依赖的target都是些什么呢?
audio_jni 静态库
base_jni rtc_source_set
java_audio_device_module_jni rtc_source_set
media_jni 静态库
peerconnection_jni 静态库
video_jni 静态库
../../pc:create_pc_factory 静态库
那么我们接下来先编译第一个静态库 audio_jni.
ninja -C src/sdk/android:audio_jni
rtc_static_library("audio_jni") {
sources = [
"src/jni/pc/audio.cc",
]
deps = [
":base_jni",
"../../api/audio_codecs:builtin_audio_decoder_factory",
"../../api/audio_codecs:builtin_audio_encoder_factory",
"../../modules/audio_processing:audio_processing",
"../../rtc_base:rtc_base_approved",
]
}
从代码上看,audio_jni主要是用来做音频的编解码和音频的rtcp/rtcp网络处理模块.
/src/api/audio_codecs/BUILD.gn:builtin_audio_decoder_factory
rtc_static_library("builtin_audio_decoder_factory") {
visibility = [ "*" ]
allow_poison = [ "audio_codecs" ]
sources = [
"builtin_audio_decoder_factory.cc",
"builtin_audio_decoder_factory.h",
]
deps = [
":audio_codecs_api",
"../../rtc_base:rtc_base_approved",
"L16:audio_decoder_L16",
"g711:audio_decoder_g711",
"g722:audio_decoder_g722",
"isac:audio_decoder_isac",
]
defines = []
if (rtc_include_ilbc) {
deps += [ "ilbc:audio_decoder_ilbc" ]
defines += [ "WEBRTC_USE_BUILTIN_ILBC=1" ]
} else {
defines += [ "WEBRTC_USE_BUILTIN_ILBC=0" ]
}
if (rtc_include_opus) {
deps += [ "opus:audio_decoder_opus" ]
defines += [ "WEBRTC_USE_BUILTIN_OPUS=1" ]
} else {
defines += [ "WEBRTC_USE_BUILTIN_OPUS=0" ]
}
}
这里很明显是工厂模式,包括了所有的音频解码算法.
这里我要重点描述一下rtc_source_set这个target,这个target也会存在deps,但是它的deps只可能是同样的rtc_source_set,里面只有.h和.cc文件.
audio_codecs_api就是一个rtc_source_set,这个target,不会依赖任何第三方静态库.