Android源码编译(基于Ubuntu18.0.4)

一、环境搭建

硬件要求

  • 如果是 Gingerbread (2.3.x) 及更高版本(包括 master 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。
  • 如果是校验代码,至少需要 100GB 可用磁盘空间;如果要进行编译,则还需要 150GB。如果要进行多次编译或使用 ccache,则需要更多空间。
  • 如果您在虚拟机中运行 Linux,则至少需要 16GB 的 RAM/交换空间。
软件要求

操作系统和 JDK
  • 操作系统要求
Android版本Ubuntu最低版本
Android 6.0至AOSP masterUbuntu 14.04
Android 2.3.x至Android 5.xUbuntu 12.04
Android 1.5至Android 2.2.xUbuntu 10.04
  • 对于 Java 开发套件 (JDK),需要注意的是 AOSP 中 Android 的 master 分支带有预编译版本的 OpenJDK;因此无需进行额外安装。较低的版本则需要单独进行安装,包括
    • Android 7.0 (Nougat) - Android 8.0 (O):Ubuntu - OpenJDK 8;Mac OS - jdk 8u45 或更高版本
    • Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - OpenJDK 7;Mac OS - jdk-7u71-macosx-x64.dmg
    • Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat):Ubuntu - Java JDK 6;Mac OS - Java JDK 6
    • Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu - Java JDK 5
主要软件包

具体要求可查看:Google源码编译要求

软件安装

Git安装
sudo apt-get install git 
git config --global user.email “test@test.com” 
git config --global user.name “test”

其中test@test.com为你自己的邮箱,test为你的用户名

repo工具安装
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
//拒绝连接可以使用tuna的git-repo镜像,将地址换成清华大学的镜像地址
详情查看网址https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/
安装 openJDK 8
sudo apt-get update
sudo apt-get install openjdk-8-jdk
其他依赖安装
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential  
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
sudo apt-get install libc6-dev-i386 
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
sudo apt-get install libncurses5

搭建编译环境官方文档(Google搭建Android源码编译环境

二、源码下载

建立源码文件夹

创建AOSP(文件夹名称可以更改)文件夹作为本地代码仓库,命令如下:

mkdir AOSP
cd AOSP
初始化仓库

通过执行初始化仓库命令可以获取AOSP项目master上最新的代码并初始化该仓库,命令如下:

//官方下载(异世界下载,不推荐)
repo init -u https://android.googlesource.com/platform/manifest
//清华镜像源(推荐)
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
//科大镜像源(推荐)
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest

如果执行该命令的过程中,如果提示无法连接到 gerrit.googlesource.com,那么我们只需要编辑 ~/bin/repo文件,找到REPO_URL这一行,然后将其内容修改为:

REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo'

然后重新执行上述命令即可

一般情况下我们只需要关注某个特定版本的代码(分支列表)如:

//不推荐
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-9.0.0_r30

真 · 初始化

//推荐
repo init --depth=1 -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-9.0.0_r30

--depth=1 表示只下载最近版本的代码,只保留最近的commit版本

源码同步

同步命令

repo sync

多线程并发同步

repo sync -j`nproc`
//nproc表示cpu支持最大线程数,如双核四线程,可使用
repo sync -j4
//四核八线程,可使用
repo sync -j8

-j 参数指定同时运行多少个任务,nproc是当前计算机的处理单元个数
真 · 同步

//推荐
repo sync -c -f --no-tags --no-clone-bundle -j`nproc`

-c 或者--current-branch表示只拉取当前分支代码(不指定可能会拉取其他分支的代码)
--no-tags 不拉取tags,tag虽然不大,但架不住多
--no-clone-bundle 不使用clone.bundle,clone.bundle是git bundle一样的打包文件,使用bundle文件可以做cdn下载的分流,cdn听上去不错,但是如果cdn到google的服务器,或者clone.bundle本来就占空间,不是很划算,所以不使用clone.bundle
-f 如果sync失败,继续同步
--force-sync 如果文件目录有差异,强制覆盖掉

小结
  • repo主要用到两个功能,一个是init项目,另一个是下载项目
  • AOSP项目本身很庞大,为了节约空间,尽量关注一个版本的代码
  • 源码同步时间较长,耐心等待

三、源码编译

  1. 加载编译环境
//注意:需要在源码文件夹根目录执行
source build/envsetup.sh
或
./build/envsetup.sh
  1. 选择编译目标
lunch

结果如下:

编译版本选择

选择编译目标(示例:选择aosp_x86_64-eng)

aosp_x86_64-eng
或
6

进行编译:

//nproc为cpu支持的最大线程数
make -j'nproc'
//如四核八线程可执行
make -j8

耐心等待编译完成即可

编译成功

至此,Android 源码编译结束
接下来可以通过emulator命令开启Android模拟器

//启动模拟器
emulator

运行结果如下:

Android模拟器

四、常见错误

内存不足导致编译失败
  • 方法一:增加内存(>=16g)
  • 方法二:分多次进行与源码编译(make指令进行源码编译时不会重复编译已经编译过的资源)
  • 方法三:找到文件 /源码根目录/prebuilts/sdk/tools/jack-admin打开,找到

JACK_SERVER_COMMAND=“java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME”

更改为:

JACK_SERVER_COMMAND=“java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096M -cp $LAUNCHER_JAR $LAUNCHER_NAME”

其中-Xmx4096M表示指定的jack_server内存大小,我在内存大小为8G的情况下设置成4096M,具体设置多少视实际情况而定。

脚本文件导致编译出错

编译过程中经常出现类似如下错误:

Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
ninja: build stopped: subcommand failed.
build/core/ninja.mk:148: recipe for target ‘ninja_wrapper’ failed
make: *** [ninja_wrapper] Error 1

_nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ failed

解决方法:

在build/envsetup.sh脚本中最后添加一句话export LC_ALL=C(工具链绝对路径太长导致(ubuntu18))

保存文件,并重新执行source build/envsetup.shlunch等指令并重新编译源代码。

模拟器开启失败

源码编译成功后,执行emulator报如下错误:

这是由于KVM用户组权限问题导致模拟器启动失败,具体解决方法请参考Ubuntu 18.04 emulator运行Android源码编译的 X86 虚拟机image

其他错误
  • 依赖资源缺失
    解决方法:安装/升级相关软件包
  • 待补充…

参考资料

Google官方文档
repo 工具使用手册
android:自己动手编译Android源码(超详细)

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值