Android 断点调试 webrtc、 medieasoup
本文首发地址 https://h89.cn/archives/248.html
最新更新地址 https://gitee.com/chenjim/chenjimblog
本文适用于 mediasoup-demo-android 和 mediasoup-client-android ,也适用于 webrtc AppRTCDemo
调试代码工程准备
mediasoup 代码准备
- 将 mediasoup-demo-androidmediasoup-client-androidgit clone 到一个目录
- 修改 app/build.gradle, 去掉implementation fileTree(dir: 'libs', include: ['*.jar'])
 将implementation 'org.mediasoup.droid:mediasoup-client:3.0.8-beta-3'改为if (client_project_build.toBoolean()) { implementation project(':media_client') } else { implementation 'org.mediasoup.droid:mediasoup-client:3.0.8-beta-3' }
- gradle.properties中添加- client_project_build=true
 控制使用源码编译,还是直接用编译好的 aar
- settings.gradle修改结果如下- include ':app' if (client_project_build.toBoolean()) { include ':media_client' project(":media_client").projectDir = new File(rootDir, "../mediasoup-client-android/mediasoup-client") }
webrtc代码准备
本文安卓使用的代码是 mthli/YaaRTC
需要参考后文编译好需要的 aar 后, 替换其中的 app/libs/libwebrtc.aar
配合服务端 https://appr.tc/ 调试  
编译 Debug 包
修改 ./build/toolchain/android/BUILD.gn如下,编译Release时需要恢复    
  template("android_clang_toolchain") {
    ...
    _prefix = rebase_path("$clang_base_path/bin", root_build_dir)
    cc = "$_prefix/clang"
    cxx = "$_prefix/clang++"
    ar = "$_prefix/llvm-ar"
    ld = cxx
    readelf = _tool_prefix + "readelf"
    nm = _tool_prefix + "nm"
    # 注释掉下面三行配置,即可实现 unstrip
    # strip = rebase_path("//buildtools/third_party/eu-strip/bin/eu-strip",
    #                     root_build_dir)
    # use_unstripped_as_runtime_outputs = android_unstripped_runtime_outputs
    ...
  }添加编译参数
关键参数为 is_debug=true symbol_level=2 android_full_debug=true  
$ ./tools_webrtc/android/build_aar.py \
  --extra-gn-args "is_debug=true symbol_level=2 android_full_debug=true" \
  --arch arm64-v8a我们可以用 Linux 命令 cp 将编译结果复制到我们需要用的地方  
安卓应用中修改 app/build.gradle
如下
  ...
  android {
    buildTypes {
      debug {
        debuggable true     // 必须设置为 true
        jniDebuggable true  // 必须设置为 true
        minifyEnabled false // 必须设置为 false
      }
    }
    packagingOptions {
      ...
      // 如果不设置 doNotStrip,编译出来的安装包还是会丢失调试信息;
      // 因为我们只编译了 arm64-v8a 架构的包,所以只需要配置这一行即可
      doNotStrip "*/arm64-v8a/*.so"
    }
  }
  ...设置DEBUG TYPE

 
   
设置源码映射
  # https://stackoverflow.com/a/53065726/4696820
  # 查看 Native 层 webrtc::PeerConnection::RestartIce 这个方法的调试信息;
  # 这里选用 RestartIce 而不是 CreateOffer 作为示例的原因是其输出单一,易于阅读
  (lldb) image lookup -vrn webrtc::PeerConnection::RestartIce
  # 设置源码映射,注意替换为自己的路径
  (lldb) settings set target.source-map ../../../ D:\code\mediasoup-client-android\mediasoup-client\deps\webrtc\src如下图,要先点左边的'暂停',右边才能通过命令 image lookup -vrn webrtc::PeerConnection::RestartIce 设置一个断点

可能遇到的问题
- 部分文件无法在AS跟踪的问题
 .gitignore 忽略的,可以临时去掉其中部分内容
 不在工程目录的文件也无法跟踪,可以复制相关的代码过来
 然后AS菜单-->File -->Invalidata Caches Restart
webrtc 安卓开发环境
- 我开发环境是在 windows + VirtualBox + Ubuntu 2004 虚拟机
 如上webrtc\src的代码需要跟虚拟机webrtc\src代码同步
 我的方法是:Ubuntu 通过 smb 共享 webrtc 代码,windows下用BeyondCompare比较同步
- 如果全部在 Ubuntu ,使用 ln创建软链接,可能会更方便一些,未验证
- 把代码放 windows , 在 WindowSubLinux下的Ubuntu编译
 当然也是可以的,注意需要解决snap问题,参考 webrtc编译
本文参考自  https://webrtc.mthli.com/basic/webrtc-breakpoint/
该文中还有一些比较好 webrtc相关知识 文档
比如 SDP 会话描述介绍 、 RTP 协议介绍 、视频旋转角度 等
其它相关文档
- 
安卓webrtc在ubuntu 2004下编译使用 
 https://h89.cn/archives/235.html
- 
Android 断点调试 webrtc、 medieasoup 
 https://h89.cn/archives/248.html
- 
安卓增加 mediasoup webrtc 日志输出 
 https://h89.cn/archives/246.html
- 
安卓 Mediasoup V3 基于webrtc 分支m84 的编译 
 https://h89.cn/archives/245.html
- 
安卓 webrtc 开启h264 软编解码 
 https://h89.cn/archives/6.html
- 
安卓mediasoup输出H264流(支持H264编码) 
 https://h89.cn/archives/1.html
- 
安卓mediasoup webrtc h264 软编解码相关源码分析 
 https://blog.csdn.net/CSqingchen/article/details/120218923
本文链接:Android 断点调试 webrtc、 medieasoup - http://124.222.41.37:22380/archives/248.html
版权声明:原创文章 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文链接和本声明。
评论已关闭