分析webrtc AppRTCMobie 工程中的libjingle_peerconnection_so.so生成流程 -- 第二篇

在第一篇中,我们分析过 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,不会依赖任何第三方静态库.

猜你喜欢

转载自blog.csdn.net/zhangkai19890929/article/details/82013381