Serie de prácticas de desarrollo de audio y video de Android-05-Descargue el código fuente de WebRTC del sitio web oficial y compile y publique el paquete aar en GitHubPackages

prefacio

Presumiblemente estudiantes que tienen experiencia en compilar el código fuente oficial de WebRTC, porque no pueden conectarse directamente a la red externa, de hecho, la mayor parte del tiempo no se dedica a compilar, sino a descargar el código fuente de WebRTC. Como dice el refrán, todo es difícil al principio. Después de pisar un número desconocido de escollos, este artículo nació con la esperanza de ayudarte.

Recordatorio: si no tiene una herramienta de acceso a Internet científica estable, se recomienda no intentar descargar el código fuente del sitio web oficial para compilar WebRTC, porque algunos programas en depot_tools deben estar conectados a la red externa para descargar localmente. no puede conectarse a la red externa, habrá muchos incluso si usa un espejo doméstico. Se informan errores, y estos errores se mencionarán en los siguientes capítulos sobre soluciones a errores comunes.

Preparación

Requisitos del sistema

La recomendación oficial recomienda utilizar las siguientes versiones del sistema para la compilación:

  • Ubuntu 14.04 LTS (fiable con EoL abril de 2022)
  • Ubuntu 16.04 LTS (xenial con EoL abril 2024)
  • Ubuntu 18.04 LTS (biónico con EoL abril de 2028)
  • Ubuntu 20.04 LTS (focal con Eol abril 2030)
  • Ubuntu 19.04 (discoteca)
  • Ubuntu 19.10 (eoan)

¿Cómo lo sabes? Hay un script ./build/install-build-deps.sh en el código fuente. Ejecútelo. Si la versión de su sistema no coincide, se informará el siguiente error.

ERROR: The only supported distros are
        Ubuntu 14.04 LTS (trusty with EoL April 2022)
        Ubuntu 16.04 LTS (xenial with EoL April 2024)
        Ubuntu 18.04 LTS (bionic with EoL April 2028)
        Ubuntu 20.04 LTS (focal with Eol April 2030)
        Ubuntu 19.04 (disco)
        Ubuntu 19.10 (eoan)

Disco: se recomienda preparar 20 GB de espacio en disco, puede averiguarlo.
imagen.png
Memoria: Se recomiendan al menos 8GB, cuando pienso en compilar Android se agotan los 32G.

Digresión: no importa qué código fuente se compile, se recomienda mantenerlo consistente con el entorno de compilación recomendado oficialmente, porque hay muchos problemas inexplicables, que en realidad son causados ​​​​por el entorno de compilación, y no vale la pena perder demasiado tiempo paso a paso. sobre estas trampas.

Recordatorio: el tutorial para descargar el código fuente de WebRTC y compilarlo proviene principalmente de: https://webrtc.github.io/webrtc-org/ , el autor usa el sistema Ubuntu 20.04.5 LTS 64 y configura un 2T PCIE 3.0 de producción nacional SSD, la memoria de la computadora es 32G, la CPU es AMD 5900X. Antes de comenzar, vuelva a confirmar si ha preparado una herramienta de Internet de red científica estable; de ​​lo contrario, no lo intente a la ligera.

Lo importante es decirlo de nuevo. Se recomienda enfáticamente usar la versión de Ubuntu recomendada oficialmente para compilar el código fuente. Lo mismo es cierto para Android. Un entorno de compilación consistente a menudo obtiene el doble de resultados con la mitad del esfuerzo, lo que le permite evitar más desvíos.
En cuanto a Windows, no tengo la energía para probarlo por el momento. Busqué en Internet y descubrí que muchos grandes ya han publicado tutoriales. Aquí recomiendo la segunda nota WebRTC de la trepadora de hierba: compilación (actualizada en marzo de 2021)

¿Qué es depot_tools?

La introducción oficial es la siguiente:
Chromium y Chromium OS usan un paquete de scripts llamado depot_tools para administrar pagos y revisiones de código.
El paquete depot_tools incluye gclient, gcl, git-cl, repo y otros.
Vea la documentación actualizada de configuración de depot_tools en el tutorial depot_tools . Luego, continúe con el tutorial o consulte la documentación de depot_tools para su uso. Estos mismos documentos también están disponibles como páginas man.
Consulte también How-To: Uso de depot_tools
Traducción automática:
Chromium y Chromium OS usan un paquete de secuencias de comandos llamado depot_tools para gestionar pagos y revisiones de código.
El paquete depot_tools incluye gclient, gcl, git-cl, repo, etc.
Consulte la documentación de configuración actualizada de depot_tools en el tutorial depot_tools. Luego continúe con este tutorial o consulte la documentación de depot_tools para su uso. Estos mismos documentos también están disponibles como páginas man.
Consulte también procedimientos: Uso de depot_tools

Lectura extendida:
freeabc habla sobre la herramienta de compilación depot_tools hoy y tiene una comprensión básica de depot_tools. El principio y la implementación de depot_tools
son demasiado insensibles , y comprender el principio de depot_tools lo ayudará a resolver los problemas de informe de errores encontrados de forma independiente.

Descargar depot_tools

El primer paso, por supuesto, es instalar depot_tools. Muchos tutoriales toman este paso de una sola vez, pero de hecho, este paso aparentemente simple contiene muchas trampas, que se mencionarán más adelante.

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

Es muy simple, solo usa la herramienta de Git Clone, aún no tienes Git.

El autor creó un nuevo directorio webrtc aquí, de la siguiente manera:

inserte la descripción de la imagen aquí

Abra la terminal de la línea de comandos y ejecute el siguiente comando:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
foto.png
¿Cree que funcionará bien? No mucho después, el paquete de regalo de horas extras se entregará de inmediato.
Podría decir, ¿depot_tools.git no tiene también un espejo doméstico? ¿Por qué no? Tienes razón, arreglemoslo ahora mismo.

# 声网Agora WebRTC团队提供的 WebRTC 镜像源
git clone https://webrtc.bj2.agoralab.co/webrtc-mirror/depot_tools.git depot_tools_agoralab

# Qualcomm Innovation Center团队提供的 WebRTC 镜像源
git clone https://source.codeaurora.org/quic/lc/chromium/tools/depot_tools.git depot_tools_quic -b chromium.org/main

Después de las pruebas, la fuente espejo de WebRTC proporcionada por el equipo de Agora WebRTC es la más rápida.
foto.png
La fuente espejo de WebRTC proporcionada por el equipo del Centro de innovación de Qualcomm no está mal, pero no es la rama maestra de forma predeterminada y la rama debe especificarse mediante -b.
foto.png

注意:source.codeaurora.org 已经迁移到git.codelinaro.org
Nota: Los repositorios mantenidos por Qualcomm Innovation Center Inc. han migrado a git.codelinaro.org . Los repositorios QUIC en este sitio no recibirán ninguna actualización después del 31 de marzo de 2022 y se eliminarán el 31 de marzo de 2023. Si su proyecto depende de estos repositorios, ajuste su configuración de herramientas para usar el nuevo proyecto actualizado ubicación.

La herramienta depot_tools se ha descargado, pero las cosas están lejos de ser fluidas, porque algunas herramientas necesitan estar conectadas a la red externa para descargarlas, y les diré cuándo las uso más adelante.

Instalar depot_tools

Para instalar depot_tools, establezca la ruta del programa ejecutable en la variable de entorno. Primero, configure el directorio actual como el espacio de trabajo.

export WORKSPACE=`pwd`

A continuación, configure las variables de entorno del directorio depot_tools. cipd también se modifica a permisos ejecutables.

#WORKSPACE变量是前面设置的,如果你有多个depot_tools源,注意修改为实际你要用的depot_tools路径
chmod +x $WORKSPACE/depot_tools/cipd
export PATH=$PATH:$WORKSPACE/depot_tools

Tenga en cuenta que las variables de entorno establecidas al ejecutar el comando de exportación en la línea de comando actual son temporales (porque quiero intentar usar diferentes fuentes de depot_tools, es más conveniente usar variables de entorno temporales).

Si desea establecer una variable de entorno permanente (recomendado), se recomienda agregar la variable de entorno al archivo ~/.bashrc. Específicamente, agregue el siguiente comando a ~/.bashrc e ingrese la fuente ~/.bashrc para recargar bash. La /ruta/a/ debe ser reemplazada por la ruta donde se encuentra depot_tools.

export PATH=/path/to/depot_tools:$PATH

La captura de pantalla del directorio es la siguiente:
foto.pngPara obtener más información sobre la configuración de variables de entorno, los estudiantes interesados ​​pueden buscar y aprender por sí mismos.

Ejecute gclinet desde la línea de comando, si no se informa ningún error, no se puede encontrar la línea de comando, lo que indica que la configuración de la variable de entorno se realizó correctamente.
foto.pngO ejecute el comando which gclient para encontrar la ruta.
foto.png

Configurar Git

Este paso generalmente lo establece todo el mundo, principalmente para configurar la información de la cuenta global de Git.

$ git config --global user.name "XXX"
$ git config --global user.email "[email protected]"
$ git config --global core.autocrlf false
$ git config --global core.filemode false
$ # and for fun!
$ git config --global color.ui true

Descargar código fuente WebRTC sincrónico

Usar espejo WebRTC doméstico (no recomendado)

De hecho, debido a la existencia del muro, la primera vez que intenté compilar el código fuente de WebRTC fue siguiendo el tutorial espejo de WebRTC del equipo de Agora WebRTC. El tutorial proviene de: https://webrtc.org.cn/ espejo/ . Con el fin de contarles a todos los pozos que se han pisado tanto como sea posible, el autor sigue este tutorial para volver a recorrerlos para que todos puedan saltarse estos pozos. Por supuesto, los pasos para sincronizar el almacén oficial de Google y el código fuente de la imagen Github WebRTC también se enseñarán paso a paso.

La línea de comando utilizada:

export WORKSPACE=`pwd`

cd $WORKSPACE

rm -rf depot_tools_agoralab && git clone https://webrtc.bj2.agoralab.co/webrtc-mirror/depot_tools.git depot_tools_agoralab

chmod +x $WORKSPACE/depot_tools_agoralab/cipd

export PATH=$PATH:$WORKSPACE/depot_tools_agoralab

which gclient

mkdir -p $WORKSPACE/webrtc-agoralab && cd $WORKSPACE/webrtc-agoralab

solutions = [
  { "name"        : "src",
    "url"         : "https://webrtc.bj2.agoralab.co/webrtc-mirror/src.git@65e8d9facab05de13634d777702b2c93288f8849",
    "deps_file"   : "DEPS",
    "managed"     : False,
    "safesync_url": "",
    "custom_deps": {
    },
  },
]
target_os = ["android"]


Captura de pantalla del proceso:
imagen.pngobviamente usando un espejo doméstico, pero aún necesita conectarse a un sitio web extranjero, ¡entonces se informará un error!

curl: (28) Failed to connect to chrome-infra-packages.appspot.com port 443: 连接超时
curl: (28) Failed to connect to chrome-infra-packages.appspot.com port 443: 连接超时
/media/xiangang/Repository/webrtc/depot_tools_agoralab/bootstrap_python3: 行 32: bootstrap-3.8.0.chromium.8_bin/python3/bin/python3: 没有那个文件或目录
/media/xiangang/Repository/webrtc/depot_tools_agoralab/gclient: 第 32 行: exec: python:未找到

Al final, todavía tienes que usar herramientas científicas en línea (si tuviera una, la habría usado hace mucho tiempo, déjame decirte). ¿No puedo usarlo? En teoría debería ser posible. Por ejemplo, después de que el autor descargue, cargue la versión completa de depot_tools en Github para que todos la descarguen y la usen, ¿no es así? El autor buscó depot_tools en Github y descubrió que se cargaron directamente mediante bifurcación o clon, y no incluían bootstrap-3.8.0.chromium.8_bin. Puede ser de poca importancia hacerlo, porque cuando realmente se sincroniza el código fuente de WebRTC, se deben usar herramientas científicas de Internet, por lo que es mejor usar herramientas científicas de Internet de principio a fin para evitar trampas inesperadas.

Luego abra la herramienta científica de Internet y abra el agente de red.
imagen.pngTenga en cuenta que primero debe ejecutar curl cip.cc para verificar si la terminal actual es válida. Si la ip aún muestra nacional, debe reiniciar una nueva terminal.
imagen.pngPara la demostración, el autor utilizó la imagen domestic depot_tools, por lo que la variable de entorno de depot_tools es temporal, por lo que el nuevo terminal abierto necesita reconfigurar la variable de entorno. Después de una breve operación, puede ver que curl cip.cc ha cambiado a una IP extranjera.

gclient: línea 32: exec: python: problema no encontrado. Solución: Ejecute export GCLIENT_PY3=1 en la línea de comandos.

En este momento, puede volver a ejecutar: gclient sync. Pero, de hecho, la red proxy puede no ser muy estable. Se recomienda escribir un script, ejecutar el comando gclient sync en un bucle y salir de la ejecución después de un período de tiempo después de que se complete la sincronización.

#!/bin/bash
gclient sync
while [ $? -ne 0 ]
do
echo "======gclient sync failed ,gclient sync again======"
sleep 3
gclient sync
done

usar:

touch sync.sh  # 1. 创建 sync.sh 文件
vim sync.sh # 2. 复制上面的脚本内容到 sync.sh 里面,这里你可以使用你自己喜欢的方法打开并修改文件,比如 vscode
chmod a+x sync.sh #3. 修改权限
./sync.sh # 4. 运行脚本,万事大吉

Después de un período de incansables esfuerzos, el código fuente se puede descargar y sincronizar normalmente (en realidad, puede que no sea tan fácil, le deseo buena suerte). Sin embargo, el autor no recomienda encarecidamente el uso de la duplicación doméstica. Está bien si no hay problema, pero será una pérdida de tiempo si hay un problema. Además, ni siquiera sabe si el espejo doméstico se actualiza de forma síncrona y a qué versión se actualiza.

Use el código fuente oficial de WebRTC de Google (recomendado)

Requisito previo: Abra la herramienta científica de Internet y abra el proxy de red.

Una vez que esté habilitado, ejecute el comando curl cip.cc para verificar si el terminal está en el estado de proxy. ¿Por qué no hacer ping a Google? Porque ping es un mensaje ICMP y el agente no lo reenvía, por lo que no puede usar ping para detectar si el agente de red del terminal intermedio tiene éxito, recuerde recordar.
Lectura extendida: varios métodos de programación de Linux de big K para permitir que la terminal use el proxy
foto.png Tenga en cuenta que si el comando curl cip.cc aún muestra la IP doméstica, puede abrir una nueva terminal de línea de comando y operar nuevamente.

La descarga e instalación de depot_tools no es mucho que decir, también se obtiene del sitio web oficial de Google y las variables de entorno están configuradas.

Cree un directorio llamado webrtc-checkout al mismo nivel que el directorio depot_tools.
foto.png
Ingrese al directorio webrtc-checkout para ejecutar, ejecute el siguiente comando

#手动创建目录则跳过,直接在对应目录打开命令行终端
mkdir webrtc-checkout && cd webrtc-checkout
#fetch是用来初始化项目配置的工具,一般会在第一次拉取项目时用到,这里配置获取webrtc android平台的代码
fetch --nohooks webrtc_android
#此命令主要负责拉取项目代码、执行代码hook等操作,是gclient最重要的功能。
gclient sync

#其他平台的
linux : fetch --nohooks webrtc
android: fetch --nohooks webrtc_android
ios: fetch --nohooks webrtc_ios

Nuevamente, si no tiene una herramienta científica estable en Internet, se recomienda que no se lance. De lo contrario, será como lo siguiente, da un paso, un paso equivocado, un paso equivocado, un paso equivocado. foto.png
Es posible que se le solicite que actualice depot_tools, simplemente seleccione N.
Para deshabilitar las actualizaciones automáticas, se puede establecer una variable de entorno: DEPOT_TOOLS_UPDATE=0.

OK to update it to https://chromium.googlesource.com/chromium/tools/depot_tools.git ? [Y/n] n

El siguiente paso es esperar a que se complete la sincronización del código fuente. Si falla, puede intentar ejecutarlo unas cuantas veces más y, en general, es fluido.

Usando el espejo WebRTC en Github

La imagen proviene de: https://github.com/ibaoger/webrtc.git
Cree un nuevo directorio webrtc-github, ingrese al directorio y cree un nuevo archivo .gclient, escriba el contenido de la siguiente manera:

solutions = [
  { "name"        : 'src',
    "url"         : 'https://github.com/ibaoger/webrtc.git',
    "deps_file"   : 'DEPS',
    "managed"     : True,
    "custom_deps" : {
    },
    "custom_vars": {},
  },
]
target_os = [ 'android' ]

Abra la terminal de línea de comando para ejecutar gclient sync. El proceso completo de ejecución es el siguiente:

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github$ gclient sync

________ running 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://github.com/ibaoger/webrtc.git /media/xiangang/Repository/webrtc/webrtc-github/_gclient_src_rubntize' in '/media/xiangang/Repository/webrtc/webrtc-github'
Cloning into '/media/xiangang/Repository/webrtc/webrtc-github/_gclient_src_rubntize'...
remote: Enumerating objects: 425721, done.
remote: Counting objects: 100% (2220/2220), done.
remote: Compressing objects: 100% (901/901), done.
Receiving objects:   9% (41042/425721), 18.85 MiB | 43                                                                                                                                                                                                                                                                                                                                                                Receiving objects:   9% (41042/425721), 19.80 MiB | 65                                                                                                                                                     Receiving objects:   9% (41044/425721), 22.65 MiB | 54                                                                                                                                                                                                                                                                                                                                                                Receiving objects:   9% (41044/425721), 23.39 MiB | 49                                                                                                                                                                                                                                                                                                                                                                Receiving objects:   9% (41045/425721), 24.10 MiB | 46                                                                                                                                                     remote: Total 425721 (delta 1361), reused 2092 (delta 1307), pack-reused 423501
Receiving objects: 100% (425721/425721), 262.00 MiB | 52.00 KiB/s, done.
Resolving deltas: 100% (345232/345232), done.
Syncing projects:   0% ( 1/246) src
[1:25:38] Still working on:
[1:25:38]   src/base
[1:25:38]   src/build
[1:25:38]   src/buildtools
[1:25:38]   src/examples/androidtests/third_party/gradle
[1:25:38]   src/testing
[1:25:38]   src/third_party
[1:25:38]   src/tools

...省略

Syncing projects:   3% ( 8/246) src/examples/androidtests/third_party/gradle
src/buildtools (ERROR)
----------------------------------------
[1:24:37] Started.
[1:24:37] 

________ running 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src/buildtools /media/xiangang/Repository/webrtc/webrtc-github/src/_gclient_buildtools_luvh_dxs' in '/media/xiangang/Repository/webrtc/webrtc-github'

[1:24:37] Cloning into '/media/xiangang/Repository/webrtc/webrtc-github/src/_gclient_buildtools_luvh_dxs'...
[1:26:48] fatal: unable to access 'https://chromium.googlesource.com/chromium/src/buildtools/': Failed to connect to chromium.googlesource.com port 443: Connection timed out
[1:26:50] 
________ running 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src/buildtools /media/xiangang/Repository/webrtc/webrtc-github/src/_gclient_buildtools_luvh_dxs' in '/media/xiangang/Repository/webrtc/webrtc-github' attempt 2 / 2

[1:26:50] Cloning into '/media/xiangang/Repository/webrtc/webrtc-github/src/_gclient_buildtools_luvh_dxs'...
[1:29:01] fatal: unable to access 'https://chromium.googlesource.com/chromium/src/buildtools/': Failed to connect to chromium.googlesource.com port 443: Connection timed out
Traceback (most recent call last):
  File "/work/depot_tools/gclient_scm.py", line 1177, in _Clone
    self._Run(clone_cmd,
  File "/work/depot_tools/gclient_scm.py", line 1518, in _Run
    gclient_utils.CheckCallAndFilter(cmd, env=env, **kwargs)
  File "/work/depot_tools/gclient_utils.py", line 715, in CheckCallAndFilter
    raise subprocess2.CalledProcessError(
subprocess2.CalledProcessError: Command 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src/buildtools /media/xiangang/Repository/webrtc/webrtc-github/src/_gclient_buildtools_luvh_dxs' returned non-zero exit status 128 in /media/xiangang/Repository/webrtc/webrtc-github
[1:29:05] _____ Conflicting directory found in /media/xiangang/Repository/webrtc/webrtc-github/src/buildtools. Moving to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/buildtools5aonwdxq.
----------------------------------------


Warnings:
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/buildtools moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/buildtools5aonwdxq.
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/tools moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/toolsqsruy_96.
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/testing moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/testingzzl4y5lf.
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/base moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/base0c3qxg31.
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/build moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/buildadru8ysv.
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/third_party moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/third_partyrwxgp826.
Conflicting directory /media/xiangang/Repository/webrtc/webrtc-github/src/examples/androidtests/third_party/gradle moved to /media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/examples/androidtests/third_party/gradlexnkdvm5p.
Traceback (most recent call last):
  File "/work/depot_tools/gclient_scm.py", line 647, in update
    self._Clone(revision, url, options)
  File "/work/depot_tools/gclient_scm.py", line 1177, in _Clone
    self._Run(clone_cmd,
  File "/work/depot_tools/gclient_scm.py", line 1518, in _Run
    gclient_utils.CheckCallAndFilter(cmd, env=env, **kwargs)
  File "/work/depot_tools/gclient_utils.py", line 715, in CheckCallAndFilter
    raise subprocess2.CalledProcessError(
subprocess2.CalledProcessError: Command 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src/buildtools /media/xiangang/Repository/webrtc/webrtc-github/src/_gclient_buildtools_luvh_dxs' returned non-zero exit status 128 in /media/xiangang/Repository/webrtc/webrtc-github

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/xiangang/.vpython-root/2661ac/lib/python3.8/shutil.py", line 791, in move
    os.rename(src, real_dst)
FileNotFoundError: [Errno 2] No such file or directory: '/media/xiangang/Repository/webrtc/webrtc-github/src/buildtools' -> '/media/xiangang/Repository/webrtc/webrtc-github/_bad_scm/src/buildtools5aonwdxq/buildtools'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/work/depot_tools/metrics.py", line 291, in print_notice_and_exit
    yield
  File "/work/depot_tools/gclient.py", line 3489, in <module>
    sys.exit(main(sys.argv[1:]))
  File "/work/depot_tools/gclient.py", line 3475, in main
    return dispatcher.execute(OptionParser(), argv)
  File "/work/depot_tools/subcommand.py", line 252, in execute
    return command(parser, args[1:])
  File "/work/depot_tools/gclient.py", line 3026, in CMDsync
    ret = client.RunOnDeps('update', args)
  File "/work/depot_tools/gclient.py", line 2020, in RunOnDeps
    work_queue.flush(revision_overrides,
  File "/work/depot_tools/gclient_utils.py", line 1013, in flush
    reraise(e[0], e[1], e[2])
  File "/work/depot_tools/gclient_utils.py", line 70, in reraise
    raise value
  File "/work/depot_tools/gclient_utils.py", line 1090, in run
    self.item.run(*self.args, **self.kwargs)
  File "/work/depot_tools/gclient.py", line 1005, in run
    self._got_revision = self._used_scm.RunCommand(command, options, args,
  File "/work/depot_tools/gclient_scm.py", line 128, in RunCommand
    return getattr(self, command)(options, args, file_list)
  File "/work/depot_tools/gclient_scm.py", line 650, in update
    self._DeleteOrMove(options.force)
  File "/work/depot_tools/gclient_scm.py", line 203, in _DeleteOrMove
    shutil.move(self.checkout_path, dest_path)
  File "/home/xiangang/.vpython-root/2661ac/lib/python3.8/shutil.py", line 811, in move
    copy_function(src, real_dst)
  File "/home/xiangang/.vpython-root/2661ac/lib/python3.8/shutil.py", line 435, in copy2
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "/home/xiangang/.vpython-root/2661ac/lib/python3.8/shutil.py", line 264, in copyfile
    with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
FileNotFoundError: [Errno 2] No such file or directory: '/media/xiangang/Repository/webrtc/webrtc-github/src/buildtools'

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github$                                                                                                                                                                                                               

Puedes ver el error:

fatal: unable to access 'https://chromium.googlesource.com/chromium/src/buildtools/': Failed to connect to chromium.googlesource.com port 443: Connection timed out

Todavía hay algunas herramientas como este buildtoosl que deben descargarse de https://chromium.googlesource.com , porque el espejo de WebRTC no contiene esta herramienta.
¿qué hacer? La forma sencilla es descargar manualmente estas herramientas de otros espejos domésticos, pero es muy molesto, porque todavía hay muchas herramientas que necesitan ser procesadas de esta manera.Mira, hay tantas, tengo muchas ganas de llorar.

https://chromium.googlesource.com/chromium/src/base
https://chromium.googlesource.com/chromium/src/build
https://chromium.googlesource.com/chromium/src/buildtools
https://chromium.googlesource.com/external/github.com/gradle/gradle
https://chromium.googlesource.com/chromium/src/ios
https://chromium.googlesource.com/chromium/src/testing
https://chromium.googlesource.com/chromium/src/third_party
https://chromium.googlesource.com/chromium/llvm-project/cfe/tools/clang-format
https://chromium.googlesource.com/chromium/llvm-project/libcxx
https://chromium.googlesource.com/chromium/llvm-project/libcxxabi
https://chromium.googlesource.com/external/llvm.org/libunwind
https://chromium.googlesource.com/android_ndk
https://chromium.googlesource.com/android_tools
https://chromium.googlesource.com/external/github.com/google/auto
https://chromium.googlesource.com/catapult
https://chromium.googlesource.com/external/github.com/google/compact_enc_det
https://chromium.googlesource.com/external/colorama
https://chromium.googlesource.com/chromium/tools/depot_tools
https://chromium.googlesource.com/chromium/third_party/errorprone
https://chromium.googlesource.com/chromium/third_party/ffmpeg
https://chromium.googlesource.com/chromium/deps/findbugs
https://chromium.googlesource.com/chromium/src/third_party/freetype2
https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz
https://chromium.googlesource.com/external/github.com/google/gtest-parallel
https://chromium.googlesource.com/external/github.com/google/googletest
https://chromium.googlesource.com/chromium/deps/icu
https://chromium.googlesource.com/external/jsr-305
https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp
https://chromium.googlesource.com/external/junit
https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer
https://chromium.googlesource.com/chromium/deps/libjpeg_turbo
https://chromium.googlesource.com/chromium/deps/libsrtp
https://chromium.googlesource.com/webm/libvpx
https://chromium.googlesource.com/libyuv/libyuv
https://chromium.googlesource.com/linux-syscall-support
https://chromium.googlesource.com/external/mockito/mockito
https://chromium.googlesource.com/chromium/deps/nasm
https://chromium.googlesource.com/external/github.com/cisco/openh264
https://chromium.googlesource.com/external/github.com/kennethreitz/requests
https://chromium.googlesource.com/external/robolectric
https://chromium.googlesource.com/chromium/third_party/ub-uiautomator
https://chromium.googlesource.com/external/github.com/sctplab/usrsctp
https://chromium.googlesource.com/chromium/deps/yasm/binaries
https://chromium.googlesource.com/chromium/deps/yasm/patched-yasm
https://chromium.googlesource.com/chromium/src/tools
https://chromium.googlesource.com/infra/luci/client-py

Head iron, intente continuar ejecutando gclient sync, el resultado sigue siendo el siguiente error:

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ gclient sync
/media/xiangang/Repository/webrtc/webrtc-github/.gclient_entries missing, .gclient file in parent directory /media/xiangang/Repository/webrtc/webrtc-github might not be the file you want to use.
Syncing projects: 100% ( 1/ 1) src
src (ERROR)
----------------------------------------
[0:00:00] Started.
[0:00:00] Finished running: git config remote.origin.url
[0:00:00] Finished running: git rev-list -n 1 HEAD
[0:00:00] Finished running: git rev-parse --abbrev-ref=strict HEAD
----------------------------------------
Error: Command 'git remote update' returned non-zero exit status 1 in /media/xiangang/Repository/webrtc/webrtc-github/src
fatal: unable to access 'https://github.com/ibaoger/webrtc.git/': GnuTLS recv error (-110): The TLS connection was non-properly terminated.

El más libre de problemas, al final, es utilizar herramientas científicas de Internet. Abra el proxy de red honestamente y ejecute gclient sync nuevamente.
foto.png¡Alrededor de una hora después, snyc terminó!

otras maneras

Tal vez pueda considerar configurar un servidor en la nube externo. Después de una serie de compilación síncrona del código fuente, publique el producto compilado en Maven. ¿Por qué no hacerlo? Por supuesto, este método no está exento de desventajas, es decir, es costoso y costoso. Los jugadores de RMB pueden considerar este método, solo consulte el tutorial oficial: https://webrtc.github.io/webrtc-org/native-code/android/

Compilar WebRTC

Si usa el sistema Ubuntu, generalmente se recomienda ejecutar gclient sync después de la sincronización: ./build/install-build-deps.sh, que se usa para descargar, instalar y compilar dependencias.
Una vez realizado el trabajo preparatorio, compilar el código fuente es muy sencillo. Para el proceso de compilación, consulte la documentación en el sitio web oficial.
foto.png

Generar archivos de proyecto Ninja

WebRTC usa Ninja como sistema de compilación de forma predeterminada y usa GN para generar archivos de proyecto Ninja. Podemos especificar que los archivos del proyecto Ninja se generen en un directorio de nuestra elección, como out/Debug o out/Release.

Use el valor predeterminado (compilación de depuración) para generar el archivo de proyecto Ninja, ejecute el siguiente comando (el archivo de proyecto generado se encuentra en el directorio src del código fuente de pago):

gn gen out/Default

Demostración:
foto.png
Compilación de lanzamiento, ejecute el siguiente comando para generar el archivo del proyecto Ninja:

gn gen out/Default --args='is_debug=false'

Manifestación:
foto.png

compilar

Después de generar los archivos del proyecto Ninja a través de GN, puede usar Ninja para compilarlos.

Para el archivo de proyecto Ninja generado en out/Default, ejecute el siguiente comando para compilar:

ninja -C out/Default

Demostración:
foto.pngPuede ser que el rendimiento de la computadora sea bueno y la compilación se complete en menos de 10 minutos. En el directorio /webrtc/webrtc-github/src/out/Default/obj, puede ver el archivo de biblioteca estática compilado: libwebrtc.a.
foto.png

generar aar

Mirando el tutorial oficial, descubrimos que Google proporciona un paquete aar WebRTC listo para usar para que lo usemos directamente.
foto.png
Pero si también queremos empaquetarlo en aar y publicarlo en maven, ¿funcionará? ¡Por supuesto! Hay un script build_aar.py en el directorio código fuente/src/tools_webrtc/android para este propósito, ¿no es genial?
foto.pngDebido a que es un script de python, necesita un entorno de python, pero a menudo somos propensos a pisar el pozo al usar el python instalado (incluido con el sistema) para ejecutar, y a menudo la ejecución falla debido a la falta de coincidencia de la versión. De hecho, depot_tools usa tanto python2 como python3.

Abrimos build_aar.py:
foto.pngencontramos que la primera línea es #!/usr/bin/env vpython3. Puede tener una duda, ¿qué es vpython3 y cuál es la diferencia con python3? Si lee el principio insensible depot_tools y el blog de implementación mencionado anteriormente , sabrá que vpython es el entorno de virtualización de python de Google, que se utiliza principalmente para aislar diferentes versiones de entornos de python, porque los proyectos de Google usan muchos Entonces, vpython3 es el entorno de virtualización de la versión de python3 proporcionada por Google. Se encuentra en el directorio [email protected]_bin de depot_tools, como se muestra en la siguiente figura: Por lo tanto, se recomienda encarecidamente utilizar python3 que viene con depot_tools para ejecutar el script build_aar.py.
foto.png

Presta atención a los comentarios del guión:

El script debe ejecutarse desde la carpeta raíz src.
./tools_webrtc/android/build_aar.py

#!/usr/bin/env vpython3

# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
"""Script to generate libwebrtc.aar for distribution.

The script has to be run from the root src folder.
./tools_webrtc/android/build_aar.py

.aar-file is just a zip-archive containing the files of the library. The file
structure generated by this script looks like this:
 - AndroidManifest.xml
 - classes.jar
 - libs/
   - armeabi-v7a/
     - libjingle_peerconnection_so.so
   - x86/
     - libjingle_peerconnection_so.so
"""

Eso es para ejecutar en el directorio src: ./tools_webrtc/android/build_aar.py, no necesita ejecutarse especificando la ruta python3

/webrtc/depot_tools/[email protected]_bin/python3/bin/python3 tools_webrtc/android/build_aar.py

Intentamos ejecutar el comando en el directorio src: ./tools_webrtc/android/build_aar.py
foto.pngproceso de ejecución:

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ ./tools_webrtc/android/build_aar.py
INFO:root:Building: armeabi-v7a
Done. Made 5847 targets from 338 files in 426ms
ninja: Entering directory `/tmp/tmp6ozvfe9z/armeabi-v7a'
[3311/4313] ACTION //sdk/android:base_java__compile_java(//build/toolchain/android:android_clang_arm)
FAILED: obj/sdk/android/base_java.javac.jar obj/sdk/android/base_java.javac.jar.info 
python3 ../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py --depfile=gen/sdk/android/base_java__compile_java.d --generated-dir=gen/sdk/android/base_java/generated_java --jar-path=obj/sdk/android/base_java.javac.jar --java-srcjars=\[\"gen/sdk/android/base_java.generated.srcjar\"\] --target-name //sdk/android:base_java__compile_java --classpath=@FileArg\(gen/sdk/android/base_java.build_config.json:android:sdk_interface_jars\) --header-jar obj/sdk/android/base_java.turbine.jar --classpath=\[\"obj/sdk/android/base_java.turbine.jar\"\] --classpath=@FileArg\(gen/sdk/android/base_java.build_config.json:deps_info:javac_full_interface_classpath\) --chromium-code=1 --warnings-as-errors --jar-info-exclude-globs=\[\"\*/R.class\",\ \"\*/R\\\$\*.class\",\ \"\*/Manifest.class\",\ \"\*/Manifest\\\$\*.class\",\ \"\*/\*GEN_JNI.class\"\] @gen/sdk/android/base_java.sources
注: ../../../media/xiangang/Repository/webrtc/webrtc-github/src/sdk/android/src/java/org/webrtc/RefCountDelegate.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Traceback (most recent call last):
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 823, in <module>
    sys.exit(main(sys.argv[1:]))
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in main
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 55, in CallAndWriteDepfileIfStale
    CallAndRecordIfStale(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 154, in CallAndRecordIfStale
    function(*args)
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in <lambda>
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 437, in _OnStaleMd5
    _RunCompiler(changes,
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 570, in _RunCompiler
    build_utils.CheckOutput(cmd,
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/build_utils.py", line 296, in CheckOutput
    raise CalledProcessError(cwd, args, MSG.format(stream_string))
util.build_utils.CalledProcessError: Command failed: ( cd /tmp/tmp6ozvfe9z/armeabi-v7a; ../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -proc:none -d obj/sdk/android/base_java.javac.jar.staging/classes -classpath obj/third_party/android_sdk/android.ijar.jar:obj/sdk/android/base_java.turbine.jar:obj/third_party/androidx/androidx_annotation_annotation_jvm.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib_common.ijar.jar:obj/third_party/android_deps/org_jetbrains_annotations.ijar.jar @obj/sdk/android/base_java.javac.jar.staging/files_list.txt )

Command failed because it wrote to stderr.
You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
[3315/4313] ACTION //tools/android/errorprone_plugin:errorprone_plugin__compile_java(//build/toolchain/android:android_clang_arm)
FAILED: obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar.info 
python3 ../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py --depfile=gen/tools/android/errorprone_plugin/errorprone_plugin__compile_java.d --generated-dir=gen/tools/android/errorprone_plugin/errorprone_plugin/generated_java --jar-path=obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar --java-srcjars=\[\"gen/tools/android/errorprone_plugin/errorprone_plugin.generated.srcjar\"\] --target-name //tools/android/errorprone_plugin:errorprone_plugin__compile_java --header-jar obj/tools/android/errorprone_plugin/errorprone_plugin.turbine.jar --classpath=\[\"obj/tools/android/errorprone_plugin/errorprone_plugin.turbine.jar\"\] --classpath=@FileArg\(gen/tools/android/errorprone_plugin/errorprone_plugin.build_config.json:deps_info:javac_full_interface_classpath\) --chromium-code=1 --warnings-as-errors @gen/tools/android/errorprone_plugin/errorprone_plugin.sources
注: ../../../media/xiangang/Repository/webrtc/webrtc-github/src/tools/android/errorprone_plugin/src/org/chromium/tools/errorprone/plugin/NoSynchronizedMethodCheck.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Traceback (most recent call last):
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 823, in <module>
    sys.exit(main(sys.argv[1:]))
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in main
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 55, in CallAndWriteDepfileIfStale
    CallAndRecordIfStale(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 154, in CallAndRecordIfStale
    function(*args)
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in <lambda>
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 437, in _OnStaleMd5
    _RunCompiler(changes,
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 570, in _RunCompiler
    build_utils.CheckOutput(cmd,
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/build_utils.py", line 296, in CheckOutput
    raise CalledProcessError(cwd, args, MSG.format(stream_string))
util.build_utils.CalledProcessError: Command failed: ( cd /tmp/tmp6ozvfe9z/armeabi-v7a; ../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -proc:none -d obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar.staging/classes -classpath obj/tools/android/errorprone_plugin/errorprone_plugin.turbine.jar:obj/third_party/android_deps/com_google_errorprone_javac.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_core.ijar.jar:obj/third_party/android_deps/org_pcollections_pcollections.ijar.jar:obj/third_party/android_deps/com_google_protobuf_protobuf_java.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_type_annotations.ijar.jar:obj/third_party/android_deps/com_google_auto_auto_common.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_check_api.ijar.jar:obj/third_party/android_deps/org_checkerframework_dataflow_errorprone.ijar.jar:obj/third_party/android_deps/io_github_java_diff_utils_java_diff_utils.ijar.jar:obj/third_party/android_deps/org_eclipse_jgit_org_eclipse_jgit.ijar.jar:obj/third_party/android_deps/com_google_auto_value_auto_value_annotations.ijar.jar:obj/third_party/android_deps/com_github_kevinstern_software_and_algorithms.ijar.jar:obj/third_party/android_deps/com_github_ben_manes_caffeine_caffeine.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_annotation.ijar.jar:obj/third_party/android_deps/com_google_guava_guava.ijar.jar:obj/third_party/android_deps/org_checkerframework_checker_qual.ijar.jar:obj/third_party/android_deps/com_google_j2objc_j2objc_annotations.ijar.jar:obj/third_party/android_deps/com_google_guava_listenablefuture.ijar.jar:obj/third_party/android_deps/com_google_guava_failureaccess.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_annotations.ijar.jar:obj/third_party/android_deps/com_google_code_findbugs_jsr305.ijar.jar:obj/third_party/android_deps/com_google_auto_service_auto_service_annotations.ijar.jar @obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar.staging/files_list.txt )

Command failed because it wrote to stderr.
You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
[3322/4313] ACTION //modules/audio_device:audio_device_java__compile_java(//build/toolchain/android:android_clang_arm)
FAILED: obj/modules/audio_device/audio_device_java.javac.jar obj/modules/audio_device/audio_device_java.javac.jar.info 
python3 ../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py --depfile=gen/modules/audio_device/audio_device_java__compile_java.d --generated-dir=gen/modules/audio_device/audio_device_java/generated_java --jar-path=obj/modules/audio_device/audio_device_java.javac.jar --java-srcjars=\[\"gen/modules/audio_device/audio_device_java.generated.srcjar\"\] --target-name //modules/audio_device:audio_device_java__compile_java --classpath=@FileArg\(gen/modules/audio_device/audio_device_java.build_config.json:android:sdk_interface_jars\) --header-jar obj/modules/audio_device/audio_device_java.turbine.jar --classpath=\[\"obj/modules/audio_device/audio_device_java.turbine.jar\"\] --classpath=@FileArg\(gen/modules/audio_device/audio_device_java.build_config.json:deps_info:javac_full_interface_classpath\) --chromium-code=1 --warnings-as-errors --jar-info-exclude-globs=\[\"\*/R.class\",\ \"\*/R\\\$\*.class\",\ \"\*/Manifest.class\",\ \"\*/Manifest\\\$\*.class\",\ \"\*/\*GEN_JNI.class\"\] @gen/modules/audio_device/audio_device_java.sources
注: 某些输入文件使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Traceback (most recent call last):
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 823, in <module>
    sys.exit(main(sys.argv[1:]))
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in main
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 55, in CallAndWriteDepfileIfStale
    CallAndRecordIfStale(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 154, in CallAndRecordIfStale
    function(*args)
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in <lambda>
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 437, in _OnStaleMd5
    _RunCompiler(changes,
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 570, in _RunCompiler
    build_utils.CheckOutput(cmd,
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/build_utils.py", line 296, in CheckOutput
    raise CalledProcessError(cwd, args, MSG.format(stream_string))
util.build_utils.CalledProcessError: Command failed: ( cd /tmp/tmp6ozvfe9z/armeabi-v7a; ../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -proc:none -d obj/modules/audio_device/audio_device_java.javac.jar.staging/classes -classpath obj/third_party/android_sdk/android.ijar.jar:obj/modules/audio_device/audio_device_java.turbine.jar:obj/rtc_base/base_java.turbine.jar:obj/third_party/androidx/androidx_annotation_annotation_jvm.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib_common.ijar.jar:obj/third_party/android_deps/org_jetbrains_annotations.ijar.jar @obj/modules/audio_device/audio_device_java.javac.jar.staging/files_list.txt )

Command failed because it wrote to stderr.
You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
[3336/4313] ACTION //third_party/android_deps:org_jetbrains_kotlin_kotlin_stdlib_java__dex(//build/toolchain/android:android_clang_arm)
ninja: build stopped: subcommand failed.
Traceback (most recent call last):
  File "./tools_webrtc/android/build_aar.py", line 269, in <module>
    sys.exit(main())
  File "./tools_webrtc/android/build_aar.py", line 263, in main
    BuildAar(args.arch, args.output, args.use_goma, args.use_remoteexec,
  File "./tools_webrtc/android/build_aar.py", line 243, in BuildAar
    Build(build_dir, arch, use_goma, use_remoteexec, extra_gn_args,
  File "./tools_webrtc/android/build_aar.py", line 198, in Build
    _RunNinja(output_directory, ninja_args)
  File "./tools_webrtc/android/build_aar.py", line 129, in _RunNinja
    subprocess.check_call(cmd)
  File "/work/depot_tools/.cipd_bin/.cipd/pkgs/0/Gz9krHL6kKjbvGdxI5atUyCuwSXBMIhmVrK6FblTzSIC/3.8/lib/python3.8/subprocess.py", line 364, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/media/xiangang/Repository/webrtc/webrtc-github/src/third_party/ninja/ninja', '-C', '/tmp/tmp6ozvfe9z/armeabi-v7a', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']' returned non-zero exit status 1.
xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ 


El resultado fue incorrecto. Afortunadamente, hay consejos para decirnos la solución: a menudo puede configurar treat_warnings_as_errors=false para no tratar la salida como un error (útil cuando se desarrolla localmente).

Bien, intente nuevamente: ./tools_webrtc/android/build_aar.py --extra-gn-args "treat_warnings_as_errors=false"
foto.pngEsta vez tuvo éxito, el proceso de ejecución completo es el siguiente:

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ ./tools_webrtc/android/build_aar.py --extra-gn-args "treat_warnings_as_errors=false"
INFO:root:Building: armeabi-v7a
Done. Made 5847 targets from 338 files in 431ms
ninja: Entering directory `/tmp/tmplq7o6un2/armeabi-v7a'
[3314/4313] ACTION //sdk/android:base_java__compile_java(//build/toolchain/android:android_clang_arm)
注: ../../../media/xiangang/Repository/webrtc/webrtc-github/src/sdk/android/src/java/org/webrtc/RefCountDelegate.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。

...省略

The above stderr output was from:
../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED -J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED -XDcompilePolicy=simple '-Xplugin:ErrorProne -XepAllErrorsAsWarnings -XepDisableWarningsInGeneratedCode -Xep:InlineMeInliner:OFF -Xep:InvalidParam:OFF -Xep:InvalidLink:OFF -Xep:InvalidInlineTag:OFF -Xep:EmptyBlockTag:OFF -Xep:PublicConstructorForAbstractClass:OFF -Xep:InvalidBlockTag:OFF -Xep:StaticAssignmentInConstructor:OFF -Xep:MutablePublicArray:OFF -Xep:UnescapedEntity:OFF -Xep:NonCanonicalType:OFF -Xep:AlmostJavadoc:OFF -Xep:ReturnValueIgnored:OFF -Xep:InlineMeSuggester:OFF -Xep:DoNotClaimAnnotations:OFF -Xep:JavaUtilDate:OFF -Xep:IdentityHashMapUsage:OFF -Xep:UnnecessaryMethodReference:OFF -Xep:LongFloatConversion:OFF -Xep:CharacterGetNumericValue:OFF -Xep:ErroneousThreadPoolConstructorChecker:OFF -Xep:StaticMockMember:OFF -Xep:MissingSuperCall:OFF -Xep:ToStringReturnsNull:OFF -Xep:MalformedInlineTag:OFF -Xep:DoubleBraceInitialization:OFF -Xep:CatchAndPrintStackTrace:OFF -Xep:SynchronizeOnNonFinalField:OFF -Xep:TypeParameterUnusedInFormals:OFF -Xep:CatchFail:OFF -Xep:JUnitAmbiguousTestClass:OFF -Xep:DefaultCharset:OFF -Xep:UnrecognisedJavadocTag:OFF -Xep:JdkObsolete:OFF -Xep:FunctionalInterfaceClash:OFF -Xep:FutureReturnValueIgnored:OFF -Xep:OperatorPrecedence:OFF -Xep:ThreadJoinLoop:OFF -Xep:StringSplitter:OFF -Xep:ClassNewInstance:OFF -Xep:ClassCanBeStatic:OFF -Xep:FloatCast:OFF -Xep:ThreadLocalUsage:OFF -Xep:Finally:OFF -Xep:FragmentNotInstantiable:OFF -Xep:HidingField:OFF -Xep:IntLongMath:OFF -Xep:BadComparable:OFF -Xep:EqualsHashCode:OFF -Xep:TypeParameterShadowing:OFF -Xep:ImmutableEnumChecker:OFF -Xep:InputStreamSlowMultibyteRead:OFF -Xep:BoxedPrimitiveConstructor:OFF -Xep:OverrideThrowableToString:OFF -Xep:CollectionToArraySafeParameter:OFF -Xep:ObjectToString:OFF -Xep:UnusedMethod:OFF -Xep:UnusedVariable:OFF -Xep:UnsafeReflectiveConstructionCast:OFF -Xep:MixedMutabilityReturnType:OFF -Xep:EqualsGetClass:OFF -Xep:UndefinedEquals:OFF -Xep:ExtendingJUnitAssert:OFF -Xep:SystemExitOutsideMain:OFF -Xep:TypeParameterNaming:OFF -Xep:UnusedException:OFF -Xep:UngroupedOverloads:OFF -Xep:FunctionalInterfaceClash:OFF -Xep:InconsistentOverloads:OFF -Xep:SameNameButDifferent:OFF -Xep:UnnecessaryLambda:OFF -Xep:UnnecessaryAnonymousClass:OFF -Xep:LiteProtoToString:OFF -Xep:MissingSummary:OFF -Xep:ReturnFromVoid:OFF -Xep:EmptyCatch:OFF -Xep:BadImport:OFF -Xep:UseCorrectAssertInTests:OFF -Xep:InlineFormatString:OFF -Xep:DefaultPackage:OFF -Xep:RefersToDaggerCodegen:OFF -Xep:RemoveUnusedImports:OFF -Xep:UnnecessaryParentheses:OFF -Xep:UnicodeEscape:OFF -Xep:AlreadyChecked:OFF -Xep:BinderIdentityRestoredDangerously:WARN -Xep:EmptyIf:WARN -Xep:EqualsBrokenForNull:WARN -Xep:InvalidThrows:WARN -Xep:LongLiteralLowerCaseSuffix:WARN -Xep:MultiVariableDeclaration:WARN -Xep:RedundantOverride:WARN -Xep:StaticQualifiedUsingExpression:WARN -Xep:StringEquality:WARN -Xep:TimeUnitMismatch:WARN -Xep:UnnecessaryStaticImport:WARN -Xep:UseBinds:WARN -Xep:WildcardImport:WARN' -XDshould-stop.ifNoError=FLOW -proc:none -processorpath lib.java/tools/android/errorprone_plugin/errorprone_plugin.jar:lib.java/third_party/android_deps/com_google_auto_service_auto_service_annotations.jar:lib.java/third_party/android_deps/com_google_code_findbugs_jsr305.jar:lib.java/third_party/android_deps/com_google_errorprone_error_prone_annotations.jar:lib.java/third_party/android_deps/com_google_guava_failureaccess.jar:lib.java/third_party/android_deps/com_google_guava_listenablefuture.jar:lib.java/third_party/android_deps/com_google_j2objc_j2objc_annotations.jar:lib.java/third_party/android_deps/org_checkerframework_checker_qual.jar:lib.java/third_party/android_deps/com_google_guava_guava.jar:lib.java/third_party/android_deps/com_google_errorprone_error_prone_annotation.jar:lib.java/third_party/android_deps/com_github_ben_manes_caffeine_caffeine.jar:lib.java/third_party/android_deps/com_github_kevinstern_software_and_algorithms.jar:lib.java/third_party/android_deps/com_google_auto_value_auto_value_annotations.jar:lib.java/third_party/android_deps/org_eclipse_jgit_org_eclipse_jgit.jar:lib.java/third_party/android_deps/io_github_java_diff_utils_java_diff_utils.jar:lib.java/third_party/android_deps/org_checkerframework_dataflow_errorprone.jar:lib.java/third_party/android_deps/com_google_errorprone_error_prone_check_api.jar:lib.java/third_party/android_deps/com_google_auto_auto_common.jar:lib.java/third_party/android_deps/com_google_errorprone_error_prone_type_annotations.jar:lib.java/third_party/android_deps/com_google_protobuf_protobuf_java.jar:lib.java/third_party/android_deps/org_pcollections_pcollections.jar:lib.java/third_party/android_deps/com_google_errorprone_error_prone_core.jar:lib.java/third_party/android_deps/com_google_errorprone_javac.jar -Werror -d obj/sdk/android/peerconnection_java__errorprone.errorprone.stamp.staging/classes -classpath obj/third_party/android_sdk/android.ijar.jar:obj/sdk/android/peerconnection_java.turbine.jar:obj/modules/audio_device/audio_device_java.turbine.jar:obj/sdk/android/logging_java.turbine.jar:obj/sdk/android/java_audio_device_module_java.turbine.jar:obj/sdk/android/default_video_codec_factory_java.turbine.jar:obj/sdk/android/swcodecs_java.turbine.jar:obj/sdk/android/libvpx_vp9_java.turbine.jar:obj/sdk/android/libvpx_vp8_java.turbine.jar:obj/sdk/android/dav1d_java.turbine.jar:obj/sdk/android/hwcodecs_java.turbine.jar:obj/sdk/android/video_java.turbine.jar:obj/sdk/android/video_api_java.turbine.jar:obj/sdk/android/builtin_audio_codecs_java.turbine.jar:obj/sdk/android/audio_api_java.turbine.jar:obj/rtc_base/base_java.turbine.jar:obj/sdk/android/base_java.turbine.jar:obj/third_party/androidx/androidx_annotation_annotation_jvm.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib_common.ijar.jar:obj/third_party/android_deps/org_jetbrains_annotations.ijar.jar @obj/sdk/android/peerconnection_java__errorprone.errorprone.stamp.staging/files_list.txt
[4565/4565] SOLINK ./libjingle_peerconnection_so.so
INFO:root:Collecting common files.
INFO:root:Collecting: armeabi-v7a
INFO:root:Collecting: arm64-v8a
INFO:root:Collecting: x86
INFO:root:Collecting: x86_64
INFO:root:List of licenses: webrtc, abseil-cpp, android_deps, android_ndk, android_sdk, androidx, base64, boringssl, crc32c, dav1d, fft, fiat, g711, g722, ijar, jdk, libaom, libc++, libc++abi, libevent, libjpeg_turbo, libsrtp, libunwind, libvpx, libyuv, nasm, ooura, opus, pffft, protobuf, rnnoise, sigslot, spl_sqrt_floor, zlib
INFO:root:Skipping compile time or internal dependency: android_deps
INFO:root:Skipping compile time or internal dependency: androidx
INFO:root:Skipping compile time or internal dependency: jdk
xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ 


El nombre del archivo aar generado por defecto es: libwebrtc.aar
foto.pngÁbralo y eche un vistazo:
foto.pngfoto.png
Compare el paquete aar proporcionado por Google:
foto.pnglo mismo, no hay problema. Si desea obtener más información sobre el uso de parámetros de build_aar.py, se recomienda consultar el código fuente, por lo que no elaboraré demasiado aquí.
El método de análisis de parámetros está aquí:

def _ParseArgs():
  parser = argparse.ArgumentParser(description='libwebrtc.aar generator.')
  parser.add_argument(
      '--build-dir',
      type=os.path.abspath,
      help='Build dir. By default will create and use temporary dir.')
  parser.add_argument('--output',
                      default='libwebrtc.aar',
                      type=os.path.abspath,
                      help='Output file of the script.')
  parser.add_argument('--arch',
                      default=DEFAULT_ARCHS,
                      nargs='*',
                      help='Architectures to build. Defaults to %(default)s.')
  parser.add_argument('--use-goma',
                      action='store_true',
                      default=False,
                      help='Use goma.')
  parser.add_argument('--use-remoteexec',
                      action='store_true',
                      default=False,
                      help='Use RBE.')
  parser.add_argument('--use-unstripped-libs',
                      action='store_true',
                      default=False,
                      help='Use unstripped .so files within libwebrtc.aar')
  parser.add_argument('--verbose',
                      action='store_true',
                      default=False,
                      help='Debug logging.')
  parser.add_argument(
      '--extra-gn-args',
      default=[],
      nargs='*',
      help="""Additional GN arguments to be used during Ninja generation.
              These are passed to gn inside `--args` switch and
              applied after any other arguments and will
              override any values defined by the script.
              Example of building debug aar file:
              build_aar.py --extra-gn-args='is_debug=true'""")
  parser.add_argument(
      '--extra-ninja-switches',
      default=[],
      nargs='*',
      help="""Additional Ninja switches to be used during compilation.
              These are applied after any other Ninja switches.
              Example of enabling verbose Ninja output:
              build_aar.py --extra-ninja-switches='-v'""")
  parser.add_argument(
      '--extra-gn-switches',
      default=[],
      nargs='*',
      help="""Additional GN switches to be used during compilation.
              These are applied after any other GN switches.
              Example of enabling verbose GN output:
              build_aar.py --extra-gn-switches='-v'""")
  return parser.parse_args()

Por ejemplo, si quiero generar el so de la plataforma especificada, puedo ejecutarlo así:

./tools_webrtc/android/build_aar.py --extra-gn-args "treat_warnings_as_errors=false" --arch "armeabi-v7a" "arm64-v8a"

Finalmente, el libwebrtc.aar generado solo contiene "armeabi-v7a" y "arm64-v8a", por lo que
foto.pngel tamaño del paquete aar cambia de 41,8 M a 17,2 M.

Publicar aar en GitHubPackages

¿Por qué no Sonatype Nexus Repository Manager? Por supuesto, no hay dinero, y todavía hay un cierto costo para configurar un servidor en la nube adicional como almacén de Maven.
¿Por qué no publicar en el repositorio mavenCentral()? Por supuesto, es demasiado problema, después de todo, el aar de WebRTC solo se compila para su propio uso.
¿Por qué no usar JitPack? Debido a que JitPack no admite cargar aar directamente, debe colocar un módulo en Github y dejar que JitPack lo compile en aar por sí mismo Aunque también es factible, todavía es un poco problemático.
Después de algunas comparaciones, descubrí que GitHubPackages sigue siendo bastante bueno.
Lectura extendida: documentación oficial de Github GitHubPackages

Publique aarGitHubPackages usando el complemento Maven Publish

El uso del complemento Maven Publish no se presenta mucho, consulte la documentación oficial: https://docs.gradle.org/current/userguide/publishing_maven.html

Abra AndroidStudio, cree un nuevo proyecto WebRTCAndroidMavenPublish y luego cree un módulo maven_publish_libwebrtc:
imagen.png
El contenido completo del build.gradle del módulo es el siguiente:

plugins {
    
    
    id 'com.android.library'
    id 'org.jetbrains.kotlin.android'
    id 'maven-publish'
}

android {
    
    
    namespace 'com.nxg.maven_publish_libwebrtc'
    compileSdk 33

    defaultConfig {
    
    
        minSdk 24
        targetSdk 33

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
    }

    buildTypes {
    
    
        release {
    
    
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
    
    
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
    
    
        jvmTarget = '1.8'
    }
}

dependencies {
    
    

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

publishing {
    
    

    repositories {
    
    
        maven {
    
    
            name = "GitHubPackages"
            url = "https://maven.pkg.github.com/xiangang/webrtc-android-maven"
            version = '1.0.0'//版本号
            credentials {
    
    
                username = project.findProperty("GITHUB_ACTOR") ?: System.getenv("GITHUB_ACTOR")
                password = project.findProperty("GITHUB_TOKEN") ?: System.getenv("GITHUB_TOKEN")
            }
        }
    }

    publications {
    
    
        androidWebRTC(MavenPublication) {
    
    
            groupId = 'com.github.xiangang'//域名反写
            artifactId = 'libwebrtc'//aar的名称
            artifact "/work/webrtc-checkout/src/libwebrtc.aar"//aar包的目录
        }
    }
}

Primero haga referencia al complemento de publicación maven:

plugins {
    
    
    id 'maven-publish'
}

Entonces puedes usar este complemento:

publishing {
    
    
    repositories {
    
    
        maven {
    
    
            name = "GitHubPackages"
            url = "https://maven.pkg.github.com/xiangang/webrtc-android-maven"
            version = '1.0.0'//版本号
            credentials {
    
    
                username = project.findProperty("GITHUB_ACTOR") ?: System.getenv("GITHUB_ACTOR")
                password = project.findProperty("GITHUB_TOKEN") ?: System.getenv("GITHUB_TOKEN")
            }
        }
    }

    publications {
    
    
        androidWebRTC(MavenPublication) {
    
    
            groupId = 'com.github.xiangang'//域名反写
            artifactId = 'libwebrtc'//aar的名称
            artifact "/work/webrtc-checkout/src/libwebrtc.aar"//aar包的目录
        }
    }
}

Para el uso de complementos, consulte la documentación oficial de Github: Use Gradle para publicar paquetes de Java Debido a las limitaciones de espacio, no me extenderé demasiado.

Debe crear su propio almacén, el autor aquí es el almacén: webrtc-android-maven , genere un GITHUB_TOKEN dedicado para este almacén, para obtener más información, consulte " Uso de GITHUB_TOKEN para la autenticación ".

Los GITHUB_ACTOR y GITHUB_TOKEN del autor se guardan en gradle.properties del proyecto y, por supuesto, también se pueden guardar en las variables de entorno del sistema de compilación.
imagen.png
El androidWebRTC de las publicaciones se nombra por sí mismo y puede personalizarlo. Debido a que el aar que se lanzará está listo, debe usar el artefacto para definir la ruta del aar.

Cuando esté listo, ejecute la tarea Gradle correspondiente para publicar.
imagen.png
Captura de pantalla del proceso de ejecución:
imagen.png
Ingresa a la página de Github y podrás ver los paquetes publicados:
imagen.pngAbre el link: ¡
imagen.pngsubido con éxito!

Gradle hace referencia a aar en GitHubPackages

¿Cómo hace referencia gradle al aar de GitHubPackage? También es muy simple.
Tome el artículo del autor Práctica de desarrollo de audio y video de Android serie-04-Android WebRTC push stream al servidor SRS para realizar el proyecto de función de flujo push-pull como ejemplo, agregue esta configuración experta en build.gradle del directorio raíz del proyecto como siguiente:
imagen.pngimagen.png
Tenga en cuenta que debe traer credencial, de lo contrario no se puede obtener.

allprojects {
    
    
    repositories {
    
    
        jcenter()
        google()
        maven {
    
     url 'http://maven.aliyun.com/nexus/content/groups/public/' }
        maven {
    
    
            name = "GitHubPackages"
            url = "https://maven.pkg.github.com/xiangang/webrtc-android-maven"
            credentials {
    
    
                username = project.findProperty("GITHUB_ACTOR") ?: System.getenv("GITHUB_ACTOR")
                password = project.findProperty("GITHUB_TOKEN") ?: System.getenv("GITHUB_TOKEN")
            }
        }
        maven {
    
     url 'https://jitpack.io' }
    }
}

Entonces podrías decir ¿qué pasa si otros quieren usar tu aar? TOKEN público? Así es, puedes generar un token separado para hacer referencia a aar y hacerlo público. Github hace un buen trabajo al controlar los permisos. Por supuesto, puede cargar aar directamente, y otros pueden descargarlo localmente para usarlo, o cargarlo en otros almacenes de maven. El autor no recomienda usar GitHubPackages, es demasiado lento.

crea tu propia sucursal

Generalmente use la rama de lanzamiento para crear su propia rama, ejecute el comando para ver: git branch -r
imagen.pngCree su propia rama: git checkout -b xiangang_webrtc origin/main
Ejecute el comando de sincronización: gclient sync
imagen.png

actualización de código

Si necesita actualizar el código, puede usarlo como Git. Después de actualizar, use el comando gcient sync para sincronizar:

git checkout master
git pull origin master
gclient sync
git checkout xiangang_webrtc 
git merge master

Resumen de soluciones de informe de errores comunes

curl: (28) No se pudo conectar al puerto 443 de chrome-infra-packages.appspot.com: se agotó el tiempo de conexión

Solución: Se necesita una herramienta científica estable de acceso a Internet. El autor utiliza Qv2ray, que se presentó en el capítulo anterior de descarga y sincronización del código fuente de WebRTC.
imagen.png

bootstrap_python3: línea 32: bootstrap-3.8.0.chromium.8_bin/python3/bin/python3: No existe tal archivo o directorio

Solución: utilice herramientas científicas en línea.
¿Por qué? Abramos bootstrap_python3 y echemos un vistazo:
imagen.pngmire el directorio depot_tools, de hecho no existe tal archivo bootstrap-3.8.0.chromium.8_bin/python3/bin/python3. En este punto, es posible que tenga una idea (es el propio autor), ¿no es python3 aquí? No puedo simplemente instalarlo directamente. El uso de pyenv también admite la coexistencia de varias versiones y el cambio en cualquier momento, ¿no sería hermoso? Pero lo siento, si realmente haces esto, caerás en el pozo.

En primer lugar, tenemos que averiguar por qué no hay bootstrap-3.8.0.chromium.8_bin/python3/bin/python3, ¿se está olvidando Google? Por supuesto que no. En su lugar, bootstrap-3.8.0.chromium.8_bin es un archivo grande y debe descargarse mediante las herramientas de CIPD para conectarse a https://chrome-infra-packages.appspot.com . depot_tools no incluye estas herramientas de archivos grandes.

CIPD significa Implementación de paquetes de infraestructura de Chrome ( https://chromium.googlesource.com/infra/luci/luci-go/+/main/cipd/README.md) , que se utiliza principalmente para administrar archivos binarios utilizados en el proyecto de Google construcción (como compiladores y similares), simplemente puede considerarlo como un sistema git para archivos grandes.
Todos los archivos administrados por CIPD se pueden ver en ( https://chrome-infra-packages.appspot.com)

Por lo tanto, incluso si las depot_tools que usamos se descargan a través de espejos domésticos, aún necesitamos herramientas científicas en línea para descargar otras herramientas de archivos grandes requeridas. Mire estas ofertas en el foro, se informa el mismo error, la respuesta es sí, es decir, se necesitan herramientas científicas de Internet.
imagen.png
imagen.png

gclient: línea 32: exec: python: no encontrado

Solución: Ejecute export GCLIENT_PY3=1 en la línea de comandos. Abra gclient, puede ver que se ejecuta python.
imagen.pngPero python no está instalado en esta máquina, y no hay python en el directorio depot_tools, solo vpython3.
imagen.pngSiendo ese el caso, solo use vpython3 directamente. Según el código, GCLIENT_PY3==1 usa vpython3.

ERROR en //build/config/sysroot.gni:62:7: la afirmación falló.

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ gn gen out/Default
ERROR at //build/config/sysroot.gni:62:7: Assertion failed.
      assert(
      ^-----
Missing sysroot (//build/linux/debian_bullseye_amd64-sysroot). To fix, run: build/linux/sysroot_scripts/install-sysroot.py --arch=amd64
See //build/config/sysroot.gni:63:11: 
          exec_script("//build/dir_exists.py",
          ^-----------------------------------
This is where it was set.
See //build/config/linux/pkg_config.gni:5:1: whence it was imported.
import("//build/config/sysroot.gni")
^----------------------------------
See //BUILD.gn:24:1: whence it was imported.
import("//build/config/linux/pkg_config.gni")
^-------------------------------------------

Solución: ejecute build/linux/sysroot_scripts/install-sysroot.py --arch=amd64

ERROR en //build/config/compiler/BUILD.gn:1418:22:

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ gn gen out/Default
ERROR at //build/config/compiler/BUILD.gn:1418:22: Script returned non-zero exit code.
    clang_revision = exec_script("//tools/clang/scripts/update.py",
                     ^----------
Current dir: /media/xiangang/Repository/webrtc/webrtc-github/src/out/Default/
Command: python3 /media/xiangang/Repository/webrtc/webrtc-github/src/tools/clang/scripts/update.py --print-revision --verify-version=16
Returned 1 and printed out:

The expected clang version is llvmorg-16-init-17653-g39da55e8-2 but the actual version is 
Did you run "gclient sync"?

See //build/config/BUILDCONFIG.gn:335:3: which caused the file to be included.
  "//build/config/compiler:cet_shadow_stack",
  ^-----------------------------------------

Solución: Vuelva a ejecutar gclient sync.

ERROR: obj/sdk/android/base_java.javac.jar obj/sdk/android/base_java.javac.jar.info

xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ ./tools_webrtc/android/build_aar.py
INFO:root:Building: armeabi-v7a
Done. Made 5847 targets from 338 files in 426ms
ninja: Entering directory `/tmp/tmp6ozvfe9z/armeabi-v7a'
[3311/4313] ACTION //sdk/android:base_java__compile_java(//build/toolchain/android:android_clang_arm)
FAILED: obj/sdk/android/base_java.javac.jar obj/sdk/android/base_java.javac.jar.info 
python3 ../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py --depfile=gen/sdk/android/base_java__compile_java.d --generated-dir=gen/sdk/android/base_java/generated_java --jar-path=obj/sdk/android/base_java.javac.jar --java-srcjars=\[\"gen/sdk/android/base_java.generated.srcjar\"\] --target-name //sdk/android:base_java__compile_java --classpath=@FileArg\(gen/sdk/android/base_java.build_config.json:android:sdk_interface_jars\) --header-jar obj/sdk/android/base_java.turbine.jar --classpath=\[\"obj/sdk/android/base_java.turbine.jar\"\] --classpath=@FileArg\(gen/sdk/android/base_java.build_config.json:deps_info:javac_full_interface_classpath\) --chromium-code=1 --warnings-as-errors --jar-info-exclude-globs=\[\"\*/R.class\",\ \"\*/R\\\$\*.class\",\ \"\*/Manifest.class\",\ \"\*/Manifest\\\$\*.class\",\ \"\*/\*GEN_JNI.class\"\] @gen/sdk/android/base_java.sources
注: ../../../media/xiangang/Repository/webrtc/webrtc-github/src/sdk/android/src/java/org/webrtc/RefCountDelegate.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Traceback (most recent call last):
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 823, in <module>
    sys.exit(main(sys.argv[1:]))
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in main
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 55, in CallAndWriteDepfileIfStale
    CallAndRecordIfStale(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 154, in CallAndRecordIfStale
    function(*args)
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in <lambda>
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 437, in _OnStaleMd5
    _RunCompiler(changes,
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 570, in _RunCompiler
    build_utils.CheckOutput(cmd,
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/build_utils.py", line 296, in CheckOutput
    raise CalledProcessError(cwd, args, MSG.format(stream_string))
util.build_utils.CalledProcessError: Command failed: ( cd /tmp/tmp6ozvfe9z/armeabi-v7a; ../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -proc:none -d obj/sdk/android/base_java.javac.jar.staging/classes -classpath obj/third_party/android_sdk/android.ijar.jar:obj/sdk/android/base_java.turbine.jar:obj/third_party/androidx/androidx_annotation_annotation_jvm.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib_common.ijar.jar:obj/third_party/android_deps/org_jetbrains_annotations.ijar.jar @obj/sdk/android/base_java.javac.jar.staging/files_list.txt )

Command failed because it wrote to stderr.
You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
[3315/4313] ACTION //tools/android/errorprone_plugin:errorprone_plugin__compile_java(//build/toolchain/android:android_clang_arm)
FAILED: obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar.info 
python3 ../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py --depfile=gen/tools/android/errorprone_plugin/errorprone_plugin__compile_java.d --generated-dir=gen/tools/android/errorprone_plugin/errorprone_plugin/generated_java --jar-path=obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar --java-srcjars=\[\"gen/tools/android/errorprone_plugin/errorprone_plugin.generated.srcjar\"\] --target-name //tools/android/errorprone_plugin:errorprone_plugin__compile_java --header-jar obj/tools/android/errorprone_plugin/errorprone_plugin.turbine.jar --classpath=\[\"obj/tools/android/errorprone_plugin/errorprone_plugin.turbine.jar\"\] --classpath=@FileArg\(gen/tools/android/errorprone_plugin/errorprone_plugin.build_config.json:deps_info:javac_full_interface_classpath\) --chromium-code=1 --warnings-as-errors @gen/tools/android/errorprone_plugin/errorprone_plugin.sources
注: ../../../media/xiangang/Repository/webrtc/webrtc-github/src/tools/android/errorprone_plugin/src/org/chromium/tools/errorprone/plugin/NoSynchronizedMethodCheck.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Traceback (most recent call last):
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 823, in <module>
    sys.exit(main(sys.argv[1:]))
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in main
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 55, in CallAndWriteDepfileIfStale
    CallAndRecordIfStale(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 154, in CallAndRecordIfStale
    function(*args)
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in <lambda>
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 437, in _OnStaleMd5
    _RunCompiler(changes,
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 570, in _RunCompiler
    build_utils.CheckOutput(cmd,
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/build_utils.py", line 296, in CheckOutput
    raise CalledProcessError(cwd, args, MSG.format(stream_string))
util.build_utils.CalledProcessError: Command failed: ( cd /tmp/tmp6ozvfe9z/armeabi-v7a; ../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -proc:none -d obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar.staging/classes -classpath obj/tools/android/errorprone_plugin/errorprone_plugin.turbine.jar:obj/third_party/android_deps/com_google_errorprone_javac.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_core.ijar.jar:obj/third_party/android_deps/org_pcollections_pcollections.ijar.jar:obj/third_party/android_deps/com_google_protobuf_protobuf_java.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_type_annotations.ijar.jar:obj/third_party/android_deps/com_google_auto_auto_common.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_check_api.ijar.jar:obj/third_party/android_deps/org_checkerframework_dataflow_errorprone.ijar.jar:obj/third_party/android_deps/io_github_java_diff_utils_java_diff_utils.ijar.jar:obj/third_party/android_deps/org_eclipse_jgit_org_eclipse_jgit.ijar.jar:obj/third_party/android_deps/com_google_auto_value_auto_value_annotations.ijar.jar:obj/third_party/android_deps/com_github_kevinstern_software_and_algorithms.ijar.jar:obj/third_party/android_deps/com_github_ben_manes_caffeine_caffeine.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_annotation.ijar.jar:obj/third_party/android_deps/com_google_guava_guava.ijar.jar:obj/third_party/android_deps/org_checkerframework_checker_qual.ijar.jar:obj/third_party/android_deps/com_google_j2objc_j2objc_annotations.ijar.jar:obj/third_party/android_deps/com_google_guava_listenablefuture.ijar.jar:obj/third_party/android_deps/com_google_guava_failureaccess.ijar.jar:obj/third_party/android_deps/com_google_errorprone_error_prone_annotations.ijar.jar:obj/third_party/android_deps/com_google_code_findbugs_jsr305.ijar.jar:obj/third_party/android_deps/com_google_auto_service_auto_service_annotations.ijar.jar @obj/tools/android/errorprone_plugin/errorprone_plugin.javac.jar.staging/files_list.txt )

Command failed because it wrote to stderr.
You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
[3322/4313] ACTION //modules/audio_device:audio_device_java__compile_java(//build/toolchain/android:android_clang_arm)
FAILED: obj/modules/audio_device/audio_device_java.javac.jar obj/modules/audio_device/audio_device_java.javac.jar.info 
python3 ../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py --depfile=gen/modules/audio_device/audio_device_java__compile_java.d --generated-dir=gen/modules/audio_device/audio_device_java/generated_java --jar-path=obj/modules/audio_device/audio_device_java.javac.jar --java-srcjars=\[\"gen/modules/audio_device/audio_device_java.generated.srcjar\"\] --target-name //modules/audio_device:audio_device_java__compile_java --classpath=@FileArg\(gen/modules/audio_device/audio_device_java.build_config.json:android:sdk_interface_jars\) --header-jar obj/modules/audio_device/audio_device_java.turbine.jar --classpath=\[\"obj/modules/audio_device/audio_device_java.turbine.jar\"\] --classpath=@FileArg\(gen/modules/audio_device/audio_device_java.build_config.json:deps_info:javac_full_interface_classpath\) --chromium-code=1 --warnings-as-errors --jar-info-exclude-globs=\[\"\*/R.class\",\ \"\*/R\\\$\*.class\",\ \"\*/Manifest.class\",\ \"\*/Manifest\\\$\*.class\",\ \"\*/\*GEN_JNI.class\"\] @gen/modules/audio_device/audio_device_java.sources
注: 某些输入文件使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Traceback (most recent call last):
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 823, in <module>
    sys.exit(main(sys.argv[1:]))
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in main
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 55, in CallAndWriteDepfileIfStale
    CallAndRecordIfStale(
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/md5_check.py", line 154, in CallAndRecordIfStale
    function(*args)
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 812, in <lambda>
    md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5(
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 437, in _OnStaleMd5
    _RunCompiler(changes,
  File "../../../media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/compile_java.py", line 570, in _RunCompiler
    build_utils.CheckOutput(cmd,
  File "/media/xiangang/Repository/webrtc/webrtc-github/src/build/android/gyp/util/build_utils.py", line 296, in CheckOutput
    raise CalledProcessError(cwd, args, MSG.format(stream_string))
util.build_utils.CalledProcessError: Command failed: ( cd /tmp/tmp6ozvfe9z/armeabi-v7a; ../../../media/xiangang/Repository/webrtc/webrtc-github/src/third_party/jdk/current/bin/javac -g --release 11 -encoding UTF-8 -sourcepath : -Xlint:-dep-ann -proc:none -d obj/modules/audio_device/audio_device_java.javac.jar.staging/classes -classpath obj/third_party/android_sdk/android.ijar.jar:obj/modules/audio_device/audio_device_java.turbine.jar:obj/rtc_base/base_java.turbine.jar:obj/third_party/androidx/androidx_annotation_annotation_jvm.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib.ijar.jar:obj/third_party/android_deps/org_jetbrains_kotlin_kotlin_stdlib_common.ijar.jar:obj/third_party/android_deps/org_jetbrains_annotations.ijar.jar @obj/modules/audio_device/audio_device_java.javac.jar.staging/files_list.txt )

Command failed because it wrote to stderr.
You can often set treat_warnings_as_errors=false to not treat output as failure (useful when developing locally).
[3336/4313] ACTION //third_party/android_deps:org_jetbrains_kotlin_kotlin_stdlib_java__dex(//build/toolchain/android:android_clang_arm)
ninja: build stopped: subcommand failed.
Traceback (most recent call last):
  File "./tools_webrtc/android/build_aar.py", line 269, in <module>
    sys.exit(main())
  File "./tools_webrtc/android/build_aar.py", line 263, in main
    BuildAar(args.arch, args.output, args.use_goma, args.use_remoteexec,
  File "./tools_webrtc/android/build_aar.py", line 243, in BuildAar
    Build(build_dir, arch, use_goma, use_remoteexec, extra_gn_args,
  File "./tools_webrtc/android/build_aar.py", line 198, in Build
    _RunNinja(output_directory, ninja_args)
  File "./tools_webrtc/android/build_aar.py", line 129, in _RunNinja
    subprocess.check_call(cmd)
  File "/work/depot_tools/.cipd_bin/.cipd/pkgs/0/Gz9krHL6kKjbvGdxI5atUyCuwSXBMIhmVrK6FblTzSIC/3.8/lib/python3.8/subprocess.py", line 364, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/media/xiangang/Repository/webrtc/webrtc-github/src/third_party/ninja/ninja', '-C', '/tmp/tmp6ozvfe9z/armeabi-v7a', 'sdk/android:libwebrtc', 'sdk/android:libjingle_peerconnection_so']' returned non-zero exit status 1.
xiangang@xiangang-ubuntu:/media/xiangang/Repository/webrtc/webrtc-github/src$ 


Solución: Cambie ./tools_webrtc/android/build_aar.py a ./tools_webrtc/android/build_aar.py --extra-gn-args "treat_warnings_as_errors=false".

resumen

Si planea descargar y compilar el código fuente de WebRTC desde el sitio web oficial, encontrará muchas dificultades si no puede conectarse directamente a la red externa. Aunque actualmente hay réplicas de WebRTC, algunas herramientas como vpython aún deben descargarse de servidores extranjeros, y las herramientas de construcción como chromium no están en el almacén de WebRTC, por lo que si no tiene herramientas científicas de Internet, no se torture. Muy problemático.

Afortunadamente, si lee este artículo y planea compilar el código fuente de WebRTC, se pueden omitir muchos errores comunes, lo que le ayudará a ahorrar mucho tiempo.

funcionar sin herramientas científicas de internet Hay herramientas científicas en línea
Descargar depot_tools Nivel de dificultad: ★★☆☆☆ Dificultad: ★☆☆☆☆
Descargar el código fuente de WebRTC Dificultad: ★★★★☆ Dificultad: ★☆☆☆☆
Espejo domestico Almacén de Google espejo github
Índice recomendado: ☆☆☆☆☆ Índice recomendado: ★★★★★ Índice recomendado: ★☆☆☆☆

En resumen, lo más fácil y recomendado es habilitar el proxy de red, seguir la documentación oficial, descargar el código fuente del almacén de Google e iniciar su proceso de compilación. ¡Te deseo lo mejor! Para más preguntas, por favor deje un mensaje para comunicarse.

Escrito al final, en primer lugar, muchas gracias por su paciencia al leer el artículo completo. No es fácil insistir en escribir artículos originales y prácticos. Si este artículo le resulta útil, le invitamos a que le guste. y comente el artículo. Su aliento es la insistencia del autor. Impulso implacable. Si hay algún error en el artículo, por favor corrígeme, gracias de nuevo.

Referencias

WebRTFC oficial de Google: https://webrtc.googlesource.com/src
Fuente espejo de WebRTC proporcionada por el equipo de Agora WebRTC: https://webrtc.org.cn/mirror
Espejo Github WebRTC: https://github.com/ibaoger /webrtc
Artículo de .git para obtener la compilación del cliente WebRTC |Android

Supongo que te gusta

Origin blog.csdn.net/xiangang12202/article/details/128962094
Recomendado
Clasificación