android源码编译好-step1:下载FFmpeg库和NDK库

配置编译环境

编译环境Linux

step1:下载FFmpeg库和NDK库

(1)我在usr目录下建了一个ndk文件夹

(2)然后进入ndk文件夹android源码编译,找到下载地址,然后在命令行输入“wget”

(3)解压文件夹“tar -xzvf ffmpeg-4.0.2.tar.gz”

(4)下载NDK,输入命令“wget”

(5)解压ndk包“unzip android-ndk-r14b-linux-x86_64.zip”,如果unzip没有安装,系统会提示,按照系统提示安装即可,最后文件夹android-ndk-r14b将被解压

步骤2:NDK安装

为ndk设置环境变量:在命令行输入“vim ~/.bashrc”,回车打开文件

点击“i”按钮进入编辑模式,在文件末尾添加:

export NDKROOT=/usr/ndk/android-ndk-r14b
export PATH=$NDKROOT:$PATH

按Esc键退出编辑模式,输入“:wq”保存退出

在命令行模式下输入以下命令更新环境变量:

source ~/.bashrc

Step3:解压后的文件夹ffmpeg-4.0.2中配置configure(1)进入文件夹ffmpeg-4.0.2,输入“vim configure”回车,打开vim后会发现文件太大。 有数千行! 如何改变呢? 在命令行模式下输入“:?buildsetting”,就会找到需要更改的地方。

QQ截图20180914110011.png

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

用。。。来代替:

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

这一步的主要目的是生成只能Android使用的name-version .so文件格式。 否则生成的库在Linux上使用,Android上无法使用。

step3:编写Android编译的脚本

在解压后的文件夹ffmpeg-4.0.2中,新建build_android.sh文件(使用shell命令“touch build_android.sh”)

输入命令“vim build_android.sh”,回车打开文件,将以下内容粘贴到文件中:

#!/bin/bash
# 清空上次的编译
make clean
#你自己的NDK路径。
export NDK=/usr/ndk/android-ndk-r14b
# 设置你的android平台编译器的版本 这里采用Android4.0 
export SYSROOT=$NDK/platforms/android-14/arch-arm/
#编译使用的toolchain
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
# 这个是输出的路径
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
./configure --target-os=linux 
--prefix=$PREFIX --arch=arm 
--disable-doc 
--enable-shared 
--disable-static 
--disable-x86asm 
--disable-symver 
--enable-gpl 
--disable-ffmpeg 
--disable-ffplay 
--disable-ffprobe 
--disable-doc 
--disable-symver 
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- 
--enable-cross-compile 
--sysroot=$SYSROOT 
--extra-cflags="-Os -fpic $ADDI_CFLAGS" 
--extra-ldflags="$ADDI_LDFLAGS" 
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

android源码编译好-step1:下载FFmpeg库和NDK库

关于configure配置,可以根据自己的需求进行配置。 可配置的属性位于FFmpeg解压后的文件夹中的configure中。 配置文件中的show_help方法中有配置提示,例如:在命令行模式下输入“:?程序选项”即可搜索指定位置,根据上面的说明判断是否需要配置。 截图如下:

QQ截图20180915101135.png

--disable-ffmpeg 表示禁用ffmpeg工具。 编译时不编译ffmpeg工具。 --enable-ffmpeg 已启用,但configure文件配置有一个功能。 FFmpeg默认配置是没有在show_help模式下进行配置的。 而是使用前缀disable或enable来反转配置,即FFmpeg中各个属性的默认配置是反转show_help中各个配置的前缀。

第四步:编译ffmpeg

1)设置ndk中所有文件的权限 chmod 777 -R ndk

2)执行./android_build.sh

编译成功后,该文件将位于/usr/ndk/ffmpeg-4.0.2/android路径目录下。 事实上android源码编译好,脚本执行后,会编译出多个.so文件。 我们用的取的是/usr/ndk/ffmpeg-4.0.2/android/arm/lib中的大版本号,即名称上带数字的。 例如:

QQ截图20180915102327.png

需要注意的问题 1)很多人编译失败是因为build_android.sh文件空格较多

QQ截图20181027164820.png

2)编译过程中可能遇到的错误:

首先报一个警告:

WARNING: /root/ffmepg/ndk/android-ndk-r15c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-pkg-config not found, library detection may fail. 

直接忽略,这个对编译没有影响,但是不知道为什么会报这个警告。

如果还是报下面的错误

In file included from ./libavformat/internal.h:24:0,
                 from libavdevice/alldevices.c:23:
/usr/ndk/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/include/stdint.h:9:26: fatal error: stdint.h: No such file or directory
 # include_next          
compilation terminated.
ffbuild/common.mak:60: recipe for target 'libavdevice/alldevices.o' failed
make: *** [libavdevice/alldevices.o] Error 1

这可能是因为你使用的ndk是最新的,新版本中就会出现这个问题。 在Stack Overflow中,你可以发现其他人也遇到了同样的问题。 这是ndk-r14之后出现的问题。 用老版本的ndk就可以了。

3)编译出来的.so文件太大

如果你的APP关心包的大小,我们可以根据编译时需要的功能进行配置,更改bash脚本(即我们创建的build_android.sh文件),添加配置:

--disable-everything

以下组件不会添加到编译中:

Individual component options:--disable-everything     
disable all components listed below--disable-encoder=NAME  
 disable encoder NAME
--enable-encoder=NAME  
 enable encoder NAME
--disable-encoders       
disable all encoders--disable-decoder=NAME   
disable decoder NAME
--enable-decoder=NAME   
enable decoder NAME--disable-decoders       
disable all decoders--disable-hwaccel=NAME   
disable hwaccel NAME--enable-hwaccel=NAME   
enable hwaccel NAME--disable-hwaccels       
disable all hwaccels--disable-muxer=NAME     
disable muxer NAME--enable-muxer=NAME     
enable muxer NAME--disable-muxers         
disable all muxers--disable-demuxer=NAME   
disable demuxer NAME--enable-demuxer=NAME   
enable demuxer NAME--disable-demuxers      
disable all demuxers--enable-parser=NAME     
enable parser NAME--disable-parser=NAME   
disable parser NAME--disable-parsers       
disable all parsers--enable-bsf=NAME       
enable bitstream filter NAME--disable-bsf=NAME       
disable bitstream filter NAME--disable-bsfs           
disable all bitstream filters--enable-protocol=NAME   
enable protocol NAME--disable-protocol=NAME 
disable protocol NAME--disable-protocols     
disable all protocols--enable-indev=NAME     
enable input device NAME--disable-indev=NAME     
disable input device NAME--disable-indevs         
disable input devices--enable-outdev=NAME     
enable output device NAME--disable-outdev=NAME   
disable output device NAME--disable-outdevs       
disable output devices--disable-devices       
disable all devices--enable-filter=NAME     
enable filter NAME--disable-filter=NAME   
disable filter NAME--disable-filters       
disable all filters

如果只添加--disable-everything,几乎所有编译的东西都没有了,所以需要在build_android.sh中添加要编译的组件,如:

#!/bin/bash
# 清空上次的编译
make clean
#你自己的NDK路径。
export NDK=/usr/ndk/android-ndk-r14b
# 设置你的android平台编译器的版本 这里采用Android4.0 
export SYSROOT=$NDK/platforms/android-14/arch-arm/
#编译使用的toolchain
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
# 这个是输出的路径
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
./configure --target-os=linux 
--prefix=$PREFIX --arch=arm 
--disable-everything 
--enable-decoder=h264 
--enable-decoder=mp3 
--enable-decoder=aac 
--disable-doc 
--enable-shared 
--disable-static 
--disable-x86asm 
--disable-symver 
--enable-gpl 
--disable-ffmpeg 
--disable-ffplay 
--disable-ffprobe 
--disable-doc 
--disable-symver 
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- 
--enable-cross-compile 
--sysroot=$SYSROOT 
--extra-cflags="-Os -fpic $ADDI_CFLAGS" 
--extra-ldflags="$ADDI_LDFLAGS" 
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

下载并编译Android13源码

最近在研究Android源码定制相关的内容。 偶然在B站看了高乐高掠食者的课程,就跟着课程走,也整理了资料,写了一些博客。 虽然目前网上这方面的内容确实很少,但同时感谢Golego Predator的免费课程,干货十足。

那么我们就进入题外话吧:

本文是在Ubuntu22.04下进行的,因为Google推荐使用Ubuntu进行Android系统编译和开发,所以默认情况下,阅读本文的朋友已经在笔记本中安装了Ubuntu系统,并且有一定的Linux基础。

同时,本文使用的Ubuntu已经配置了北大的Ubuntu软件源。 如果有些软件下载速度慢,朋友们可以参考以下地址进行配置:

ubuntu|镜像站使用帮助|复旦大学开源软件镜像站|TsinghuaOpenSourceMirror

一些可有可无的词语

由于众所周知的原因,我们很难从Google官方代码库下载aosp,所以本文使用的是中国科大的镜像,南方的朋友可以使用北大的镜像大学。

建议在专用文件夹下编译开发aosp。 我在用户根目录下创建了一个Android目录,这个目录在安装AndroidStudio的时候也下载到这个目录下。 路径如下:~/Android/Sdk,而aosp的目录是~/Android/aosp虽然不冲突,但是介意的朋友可以另外创建一个目录

cd ~            # 进入到用户根目录
mkdir Android   # 创建Android 文件夹
cd Android      # 进入刚创建的文件夹

1.下载aosp

在下载之前,我们需要确保Ubuntu中已经安装了wget。 没有下载的朋友可以使用以下命令安装:

# sudo apt update # 没有进行软件源更新的可以调用
sudo apt install wget -y

然后我们使用中国科大的镜像下载aosp

# 这里我们添加 -c 参数表示断点续传
wget -c https://mirrors.ustc.edu.cn/aosp-monthly/aosp-latest.tar

执行这个命令后,根据你的网速,可能需要等待40分钟或更长时间(主要看你的网络情况,这个文件有70G,如果你的网速比较快,可能下载得比较快,反之亦然) )

下载完成后,我们会对文件的md5码进行校准,以防下载不完整或者文件损坏等情况。

android源码编译好-step1:下载FFmpeg库和NDK库

md5sum aosp-latest.tar

我们将操作结果与文件内容进行比较。 如果md5一致,则说明该文件没有问题,我们可以进行下一步。

当文件下载正确后,我们就可以解压aosp-latest.tar文件了

tar xvf aosp-latest.tar

由于此文件比较大,可能需要等待20-30分钟。 其实这和你的硬盘性能有关。当文件解压后,我们可以在这个目录下看到一个aosp文件夹。 如果我们这个时候进去,会发现这个文件夹里只有一个.repo文件夹,并且没有任何代码。 这是因为我们只下载了相当于一些配置文件的东西。 我们还需要进行代码同步。 .repo文件夹的功能类似于Git项目的.get文件夹

在等待的过程中,您可以打开另一个终端参考下面的教程来安装和配置一些必要的环境

2.同步Android源代码

在拉取Android源码之前,我们需要确认机器中已经安装了所需的环境

2.1 安装Git

首先我们安装并配置git下载编译android源码,已经安装配置的朋友可以跳过这一步

sudo apt install git -y

安装完成后,我们会调用以下命令来配置Git

git config --global user.email xxx@qq.com
git config --global user.name "xxxxx"

2.2 安装仓库

把它拿出来,让我们安装 repo

mkdir ~/.repo        # 在用户根目录创建一个.repo的文件夹,用于下载repo
# 下载repo 到用户根目录下的.repo文件夹
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.repo/repo
# 给repo文件授予权限
chmod a+x ~/.repo/repo
# 将.repo 目录添加到环境变量中
echo "PATH=~/.repo:$PATH" >> ~/.bashrc
# 使.bashrc 生效
source ~/.bashrc 

安装repo后,我们需要为repo配置外部源,否则代码同步时可能会出现异常

android源码编译好-step1:下载FFmpeg库和NDK库

export REPO_URL='https://gerrit-googlesource.proxy.ustclug.org/git-repo'

2.3 安装Python

因为repo是由一系列python脚本组成的,所以我们还需要安装python环境。 虽然repo使用的是python2,为了避免一些情况,我们还安装了python3

#Ubuntu中默认安装了python3,可以调用一下python3命令,如果有了的话可以跳过这步
sudo apt install python3 -y
sudo apt install python2 -y

如果我们安装后调用python2命令,可以发现python2终端已经打开了,如果调用python命令,仍然提示找不到命令,所以需要添加软链接

sudo ln -s /usr/bin/python2 /usr/bin/python

注意,如果执行python命令时提示的python版本是python3,还需要执行该命令,并且在执行该命令之前,需要执行以下命令删除之前设置的软链接

sudo rm -rf /usr/bin/python

如果成功我们可以运行 python 命令

2.4 安装JDK

网上有些教程要求我们安装openjdk8,编译时提示jvm版本太高,所以我们可以直接安装openjdk11

sudo apt update                        # 更新Ubuntu软件源
sudo apt install openjdk-11-jdk -y     # 安装openjdk 11

2.5 安装并编译依赖

安装好里面的软件后,我们还需要安装一些软件包来支持源码编译

sudo apt-get install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig libncurses5

2.6 同步Android源代码

当我们配置完需要的环境之后就可以同步Android源码了,这里我同步的是android-13.0.0_r24

android源码编译好-step1:下载FFmpeg库和NDK库

cd aosp        # 进入源码目录

指定源代码版本。 建议指定前检查aosp镜像是否有该版本

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-13.0.0_r24

如果我们在/home/zhen/Android/aosp中看到提示repohasbeeninitialized说明初始化已经完成,就可以进行下一步了

同步Android源代码

repo sync

由于Android源码比较大,这一步需要等待20分钟左右

3.源码编译 3.1 初始化编译环境

当Android源码同步完成后,我们就可以开始编译Android源码了

首先我们需要初始化编译环境

source build/envsetup.sh

执行此命令,如果没有错误,则继续下一步。 值得注意的是,每次我们重新打开终端进行编译等操作时都必须执行该命令。

3.2 消除编译内容

第一次编译的时候,我们需要把之前编译的内容去掉(按理说这一步是没有必要的,而且为了避免前面出现乱七八糟的问题,所以才执行)

make clean

3.3 选择编译版本

然后我们要选择一个版本进行编译下载编译android源码,然后进行编译。

这部分我们可以执行lunch命令,然后选择你要编译的版本

You're building on Linux
Lunch menu .. Here are the common combinations:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_barbet-userdebug
     4. aosp_bluejay-userdebug
     5. aosp_bluejay_car-userdebug
     6. aosp_bramble-userdebug
     7. aosp_bramble_car-userdebug
     8. aosp_car_arm-userdebug
     9. aosp_car_arm64-userdebug
     10. aosp_car_x86-userdebug
     ...
     65. rb5-userdebug
     66. sdk_car_arm-userdebug
     67. sdk_car_arm64-userdebug
     68. sdk_car_portrait_x86_64-userdebug
     69. sdk_car_x86-userdebug
     70. sdk_car_x86_64-userdebug
     71. sdk_pc_x86_64-userdebug
     72. silvermont-eng
     73. uml-userdebug
     74. yukawa-userdebug
     75. yukawa_sei510-userdebug
Which would you like? [aosp_arm-eng]
Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng): 

您还可以在午餐命令后添加参数。 添加参数有两种形式。 我用的是第二种方法

使用序数编译

lunch 1     # 与 lunch aosp_arm-eng 等价

使用版本名编译 使用序号编译

lunch sdk_phone_x86_64-userdebug

电话->编译电话的固件

x86_64->编译x86架构的64位系统

userdebug->这是指编译出来的固件类型,可选参数有user、userdebug、eng,其中user是最终打包给用户的版本,用过MIUI的同学可以把即将发布的MIUI视为这个版本; userdebug 是面向开发者的版本,可以root但默认没有root。 该版本对应MIUI开发板及测试版; eng是工程师版本,开放所有权限。 该版本通常是工程师进行开发时使用的。 侯所用。

需要注意的是,从Android12开始,如果需要编译虚拟机固件,需要编译sdk前缀的版本

3.4 开始编译

选择编译版本后,我们就可以开始编译了

make -j8

这个j6的意思是使用6个线程来编译。 这个参数取决于你的CPU参数和显存,即最大线程数不能超过CPU支持的最大线程数,而如果你的显存比较小,就得选择较小的线程数。 我们在编译报137错误时可以选择较小的线程数或者减小交换空间的大小,建议交换空间的大小不要超过显存的一半。 比如你的显存是16G,那么可以设置为8G。 如果你的显存是32G的话,可以设置为16G

交换空间的设置方法可以参考这篇博客:ubuntu调整交换空间-简书

这部分编译耗时最长,可能需要4个多小时。 事实上,如果你的CPU性能更好,时间会更少

android源码编译好-step1:下载FFmpeg库和NDK库

3.5 验证是否编译成功

我们编译完成后,可以执行以下命令启动虚拟机来验证编译是否成功

emulator

4. 错误解决 4.1A newversionofrepo(XXX) 可用。

这个错误表明repo有较新的版本,所以我们需要将~/.repo目录下的repo文件替换为.repo/repo中的repo文件

# 在aosp目录下执行
cp .repo/repo/repo ~/.repo/repo

之后执行刚才报这个错误的命令就可以看到。

4.2 编译到一半终端崩溃

我有一台旧主机,i5-6500-16G显存。 只有当我编译它时才会出现这个问题。 以后换新主机就好了。 不知道是显存小还是什么原因。

参考

这里只是一些参考。 由于当时急于解决问题,所以忘记记录一些文章。 我之前找不到它们,所以我不会发布它们。

Golego 521的个人空间-Android13逆向ROM定制ART定制入门系列-哔哩哔哩视频

jdk版本对应的java版本号 - 上海软件培训 - Java培训 - Python培训中学 - 万马学院

Android系统源码查看-简书

AOSP镜像使用帮助—USTCMirrorHelp 文档

AOSP|镜像站使用帮助|复旦大学开源软件镜像站|TsinghuaOpenSourceMirror

调整ubuntu中的交换空间 - 简书

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 android源码编译好-step1:下载FFmpeg库和NDK库 https://www.wkzy.net/game/127801.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务