在音视频领域,webrtc是一个不得不学习和研究的框架。 很多博客和书籍对webrtc的研究都仅限于介绍Web上的JS业务交互。 但对于一个音视频方向的开发者来说还不够。 webrtc的JS开发只是一个web后端和一个应用需求webrtc 源码编译,但实际上webrtc不仅仅用于web,还可以用于app和PC客户端。 webrtc的存在,或者定制开发webrtc或者移植webrtc中的经典算法等等,这就需要对webrtc原生代码进行研究和二次开发,本文将开始webrtc源码的下载和编码,为后面铺路用于webrtc学习和二次开发。
Webrtc框架
1.webrtc下载
或许读者也和笔者之前一样,从网上拿了别人的webrtc源码,但是已经不能满足需求了(github上的源码只是部分或者是从云端下载的源码)磁盘太旧)。 虽然自己下载webrtc非常容易(前提是使用科学的互联网工具),但是为什么不自己去获取新鲜的一手代码呢。
1)环境配置
Webrtc 是 chrome 代码的一部分。 下载chrome和编译chrome代码本身就包含了下载和编译webrtc,只不过webrtc是作为静态库进入到chrome.exe中,或者作为webrtc_componet.dll.exe给chrome使用。 上面我们的《浏览器编译实践》中配置的环境配置已经完成,是为了适应webrtc下载编译的环境,这里就不展开了。
2)代码下载
下载代码的步骤很简单,基本上下面4条命令就完成了(这个地方需要代理,确保代理没问题)。
Webrtc下载步骤
虽然步骤很简单,但过程并不容易。 首先,确保你的环境配置没问题,否则下载会困难,其次,你的网络稳定,否则会经常断线。 作者也下载了N次才成功。 建议白天下载,网络比较稳定。经过足够的尝试,终于下载完成
Webrtc下载
webrtc目录结构如下:
Webrtc的目录结构
二、编译
生成ninja项目配置命令:
gngenout/默认
翻译忍者计划
ninja-Cout/默认
如果需要IDE调试webrtc 源码编译,可以像chrome项目一样生成VS项目
gngen --ide=vsouttest
生成了 1220 个 VS 项目
打开 all.sln 解决方案并单击“生成”以生成解决方案。
最终生成的webrtc.lib在D:webrtc-checkoutsrcouttestobj下,可以被应用程序编译调用,同时生成很多测试可执行程序。
注:这里的内容总结自Google官网:AOSP编译内核。 编译完成后,省砖的部分参考了其他大鳄的文章。 文章最后提供了上传到CSDN的msm内核和Aarch64gcc工具的下载链接。 如果不想从官网下载,可以直接使用该资源。
一、简介 1、环境
手机:像素
安卓版本:8.1.0
内核版本:3.18.70-g520f6eb
Ubuntu编译内核:20.04.2
2. 编译内核流程概述
简单分为以下几个过程:
(1)下载源码并拉取对应分支的源码;
(2)在Ubuntu中配置编译所需的环境(主要是aarch64-linux-android-gcc安装);
(3)按照google官网的步骤编译;
(4)将内核刷入手机。
2. 编译过程
官网给出了一个编译案例,是hikey版本。 本文测试机为pixel,需要与pixel和hikey进行对比下载编译android源码,然后进行相应的修改。
Google官网上给出了一个表格,列出了内核源代码和二进制文件的名称和位置,方便我们选择内核。 这里我们只复制了hikeyy、sailfish和hammerhead版本,以便于比较:
设备二进制文件所在位置 源代码所在位置 编译配置
旗鱼
设备/谷歌/marlin-内核
内核/MSM
marlin_defconfig
远足
设备/linaro/hikey-内核
内核/hikey-linaro
远足定义配置
锤头鲨
设备/lge/hammerhead-kernel
内核/MSM
锤头定义配置
hikey的编译过程如下:
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
cd hikey-linaro
git checkout -b android-hikey-linaro-4.1 origin/android-hikey-linaro-4.1
make hikey_defconfig
make
后续的pull分支和编译代码会参考hikey的编译过程。
1.下载内核源码
您需要编译并安装 msm 内核。 可以在官网查看,如下:
# msm 项目包含适用于 ADP1、ADP2、Nexus One、Nexus 4、Nexus 5、Nexus 6、Nexus 5X、Nexus 6P、Nexus 7 (2013)、Pixel 和 Pixel XL 的源代码,可用作在 Qualcomm MSM 芯片组上开展相关工作的着手点。
git clone https://android.googlesource.com/kernel/msm
下载内核源码不能直接通过上述命令下载,需要翻墙或者从清华大学源、科大源或者其他国外源下载。 我从vultr订购了一个美国vps,使用命令行登录,然后使用上面的git命令下载源代码,然后压缩打包并发回本地(当我尝试下载一个1G的vps时显存,会报显存不够,后来用了4G显存的vps下载,下载打包发回来后,把vps删除了,避免再收费,vps上的下载是速度很快,但是返回本地很慢)。 下载完成后,拉取分支代码的过程可以在本地完成,这个过程不需要翻墙。
2.拉取对应手机对应的代码分支
第一个问题是需要拉取哪个分支。 官网拉取如下,分支为“origin/android-hikey-linaro-4.1”:
git checkout -b android-hikey-linaro-4.1 origin/android-hikey-linaro-4.1
(1)通过手机型号和系统版本选择需要的代码分支
通过 gitbranch -a 可以查看所有分支,但是由于分支太多,无法一次性显示出来,所以可以使用命令 gitbranch -a >branches.txt,然后从文件中查看所有分支.txt,或过滤器以查看各个分支。
因为sailfish对应的二进制文件位置是device/google/marlin-kernel,所以使用marlin来过滤分支。 另外,由于使用的Android源码版本是8,即oreo,所以有理由相信我们需要拉取的分支是下面包含字符串“marlin-3.18-oreo”的分支。
git branch -a > branches.txt
cat branches.txt | grep marlin
remotes/origin/android-msm-marlin-3.18-android10
...
remotes/origin/android-msm-marlin-3.18-o-mr1-preview1
remotes/origin/android-msm-marlin-3.18-o-preview-1
remotes/origin/android-msm-marlin-3.18-o-preview-2
remotes/origin/android-msm-marlin-3.18-o-preview-3
remotes/origin/android-msm-marlin-3.18-o-preview-4
remotes/origin/android-msm-marlin-3.18-oreo
remotes/origin/android-msm-marlin-3.18-oreo-m2
remotes/origin/android-msm-marlin-3.18-oreo-m4
remotes/origin/android-msm-marlin-3.18-oreo-mr1-preview2
remotes/origin/android-msm-marlin-3.18-oreo-r3
remotes/origin/android-msm-marlin-3.18-oreo-r6
remotes/origin/android-msm-marlin-3.18-p-preview-1
remotes/origin/android-msm-marlin-3.18-p-preview-2
...
(2)从设备信息中找到需要的代码分支
另外,通过当前手机上的内核版本号拉取同一分支的代码。 首先是找到当前手机的内核版本。 Google官网提供的方法如下:
dd if=kernel bs=1 skip=$(LC_ALL=C grep -a -b -o $'x1fx8bx08x00x00x00x00x00' kernel | cut -d ':' -f 1) | zgrep -a 'Linux version'
# 对于 Nexus 5 (hammerhead),请运行以下命令:
dd if=zImage-dtb bs=1 skip=$(LC_ALL=C od -Ad -x -w2 zImage-dtb | grep 8b1f | cut -d ' ' -f1 | head -1) | zgrep -a 'Linux version'
但运行上述命令时,可能会因为缺少个别命令而无法获取内核版本。 所以可以这样使用:
cat /proc/version
Linux version 3.18.52-gf69ee35-dirty (tom@ubuntu) (gcc version 4.9.x 20150123 (prerelease) (GCC) ) #2 SMP PREEMPT Tue Nov 19 04:50:45 PST 2019
# 3.18.52-gf69ee35-dirty 便是当前的内核版本
当然,你也可以通过查找手机设置来获取内核版本信息。
此时可以通过内核版本信息中的“f69ee35”检索分支,如下:
git checkout f69ee35
也可以使用下面的命令找到对应的分支(当天运行命令时间比较长,比较慢),然后下载:
git branch -r --contains f69ee35
命令结果如下:
...
origin/android-msm-marlin-3.18-o-mr1-preview1
origin/android-msm-marlin-3.18-oreo
origin/android-msm-marlin-3.18-oreo-m2
origin/android-msm-marlin-3.18-oreo-m4
origin/android-msm-marlin-3.18-oreo-mr1-preview2
origin/android-msm-marlin-3.18-oreo-r3
...
当找到并确定某个分支后,通过类似下面的命令将远程分支拉取到本地:
git checkout -b android-hikey-linaro-4.1 origin/android-hikey-linaro-4.1
# 如:
git checkout -b android-msm-marlin-3.18-oreo origin/android-msm-marlin-3.18-oreo
3.下载并配置aarch64-linux-android-gcc进行交叉编译
如果你已经下载了Android源码,该工具包含在prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9下,你可以直接使用或者复制下来使用。 如果您还没有下载Android源代码,可以从北京大学或其他来源下载。
编译命令如下:
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
export PATH=$PATH:/***/aarch64/aarch64-linux-android-4.9/bin # 配置交叉编译链工具的环境变量,这里是64位的工具,如果32位,则需配置32位的工具
cd msm
git checkout -b android-msm-marlin-3.18-oreo origin/android-msm-marlin-3.18-oreo # 如果已经拉取过分支,这一步可以跳过,也根据设备及Android系统版本拉取相应的其它分支
make marlin_defconfig # marlin_defconfig 是从 官网上查到。对比 hikey 的 hikey_defconfig 可知是salfish对应的是marlin_defconfig
make #也可以用多线程跑,如 make -j8 ,线程数可随Ubuntu系统的线程数更改
MODPOST 0 modules
DTC arch/arm64/boot/dts/htc/msm8996pro-htc_sailfish-xa.dtb
DTC arch/arm64/boot/dts/htc/msm8996pro-v1.1-htc_marlin-xd.dtb
DTC arch/arm64/boot/dts/htc/msm8996pro-htc_marlin-xc.dtb
DTC arch/arm64/boot/dts/htc/msm8996-v3-htc_t50-xa.dtb
DTC arch/arm64/boot/dts/htc/msm8996-v3-htc_sailfish-xb.dtb
DTC arch/arm64/boot/dts/htc/msm8996-v3-htc_t50-xb.dtb
DTC arch/arm64/boot/dts/htc/msm8996pro-htc_sailfish-xb.dtb
DTC arch/arm64/boot/dts/htc/msm8996pro-htc_marlin-a.dtb
DTC arch/arm64/boot/dts/htc/msm8996pro-v1.1-htc_sailfish-xd.dtb
DTC arch/arm64/boot/dts/htc/msm8996-v3-htc_t50-xc.dtb
DTC arch/arm64/boot/dts/htc/msm8996pro-v1.1-htc_marlin-xc.dtb
DTC arch/arm64/boot/dts/htc/msm8996pro-htc_marlin-xa.dtb
DTC arch/arm64/boot/dts/htc/msm8996pro-htc_sailfish-xc.dtb
LZ4 arch/arm64/boot/Image.lz4
CAT arch/arm64/boot/Image.lz4-dtb # arch/arm64/boot/Image.lz4-dtb 可最终用来刷机,但不能直接刷机,还需要编译一下
4.对编译后的镜像进行进一步处理并保存砖块
官网也给出了处理方法,如下:
镜像输出到arch/arm64/boot/Image目录下; 内核二进制文件输出到 arch/arm64/boot/dts/hisilicon/hi6220-hikey.dtb 文件。 请将Image目录和hi6220-hikey.dtb文件复制到hikey-kernel目录中。
上述第一种方法的意思是用Android源码中预设的内核文件替换编译好的arch/arm64/boot/Image.lz4-dtb,然后编译Android源码。 预设的内核镜像位置类似:android -8.0.0_r1/device/lge/bullhead-kernel/下载编译android源码,不同的设备存储位置不同,但通过内核文件名不难找到。 您可以在使用 make bootimage (或任何其他编译启动映像的 make 命令行)时添加 TARGET_PREBUILT_KERNEL 变量。 所有设备都支持此变量,因为它是通过 device/common/populate-new-device.sh 设置的。 例如:导出 TARGET_PREBUILT_KERNEL=$your_kernel_path/arch/arm/boot/zImage-dtb 。
方法是将编译好的Image.lz4-dtb存放在某个位置,然后设置为环境变量,然后通过make bootimage编译得到boot.img。 boot.img并通过fastboot命令保存brick。 喜欢:
source build/envsetup.sh
lunch 23
export TARGET_PREBUILT_KERNEL=***/Image.lz4-dtb
make bootimage
之后正常刷boot.img,或者刷全机。
这里是用第二种方法进一步处理Image.lz4-dtb,然后救砖。 刷机编译前后的内核版本截图如下(编译版本通常包含内核编译时间,说明刷机成功):
网上也可以找到方法,可以先从手机导入boot.img,然后用工具替换boot.img中的zImage文件。
三、总结
网上有很多文章介绍如何编译和烧录内核,但我个人认为这无非是从官网AOSP编译内核的参考和总结,所以我个人认为首先要看的是谷歌官方文档。 如果您有任何疑问,请搜索并查看其他人的 Summarize 文档。 如有不对的地方,欢迎批评和原谅。
msm内核代码和Aarch64gcc工具上传到:
android-msm-kernel-code-and-aarch64gcc-multi.zip.001
android-msm-kernel-code-and-aarch64gcc-multi.zip.002
android-msm-kernel-code-and-aarch64gcc-multi.zip.003
代码占用空间较大,压缩时分为三个包。 如果需要,将这三个包下载到同一目录下并解压。
参考
AOSP编译内核
3、编译Android系统内核并救砖(修改反调试标志位)
Android系统编译之内核编译
android内核源码编译救砖