AOSP源码编译踩坑实录

AOSP源码编译踩坑实录

Posted by hmoytx on February 16, 2023

AOSP源码编译踩坑实录

前言

最近在研究安卓沙箱,恰好又看到几篇文章和视频,所以尝试基于Android8.1版本,记录一下从源码下载到编译的全过程(踩坑记录)。

环境

操作系统:Ubuntu 16.04
内存: 12G
磁盘: 300G

配置编译环境

下载platform-tools压缩包并配置系统环境变量。

https://dl.google.com/android/repository/platform-tools_r30.0.5-linux.zip  

unzip platform-tools_r30.0.5-linux.zip  -d  /home/

vim  ~/.bashrc

末尾添加:
export ADB_PATH=/home/platform-tools
export PATH=$PATH:$ADB_PATH

激活环境:
source ~/.bashrc

安装Git环境

sudo apt-get install git  
初始化Git
git config --global user.email "[email protected]"
git config --global user.name "xxx"

安装repo命令

没有bin目录就先创建:
mkdir /home/user/bin

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo

配置源
vim  ~/.bashrc

末尾添加:
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

激活环境
source  ~/.bashrc

然后开始准备下载源码。

源码下载

注意这里的源码分支应该根据我们的设备情况而选定,详细参考官网:官网
1
这里我使用的是pixel1,所以对应的分支就是android-8.1.0_r31,在下载源码的过程中,时间太长可能会中途失败,所以我们需要编写down.sh,保持运行:

#!/bin/bash
echo  "==========start repo sync==="
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-8.1.0_r31
repo sync -j4 -d --force-sync --no-clone-bundle
while [ $? = 1 ]; do 
        echo "======sync failed, re-sync again======"
        sleep 3 
        repo sync -j4 -d --force-sync --no-clone-bundle
done

然后就是运行开始下载,漫长的等待。
下载完后如图:
2

源码编译及碰到的问题

在源码编译过程中,一定要注意对应Android版本的平台要求,和Android版本所需要的JDK版本,这里编译的是Android8,使用OpenJDK8,系统自带也是,就不用再去下载。
3
然后配置驱动文件,需要下载对应设备的驱动文件,这里我们使用的是Google piexl1,可以去官方网址下载下载地址
4
下载后,解压将sh文件放到安卓源码目录下。
5
依次运行下载的驱动文件,按Enter键一行行的查看,最后输入 I ACCEPT。
开始准备编译,使用build目录中的envsetup.sh脚本初始化环境。

source build/envsetup.sh

6
输入 lunch,选择与设备对应的编译版本,这里我是pixel1,选sailfish。
7
执行命令开始编译。

make -j4 #看你设置的线程来

8

报错一

第一个报错,提示SSL error:
9
原因是默认的openjdk 版本是1.8.0_292,默认禁用了TLSv1, TLSv1.1。
解决办法:
把/etc/java-8-openjdk/security/java.security文件中的下面部分:

jdk.tls.disabledAlgorithms=SSLv3,TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves

改为(取消TLSv1, TLSv1.1 禁用):

jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves

然后在sdk/prebuilts/sdk/tools/ 目录下执行:

./jack-admin kill-server && ./jack-admin start-server 

报错二

第二个报错,提示Out of memory error,这个没办法,加内存增加swap分区。
10

报错三

第三个报错,提示conection to the jack server time out。
防火墙的问题,执行命令:

sudo ufw disable` 关闭防火墙
sudo git config --global http.sslVerify false`  关闭ssl校验

编译成功

终于没有报错了,然后就是漫长的等待,编译成功。
11
生成的编译结果在out/target/product/sailfish下。
12

刷入设备

从官网下载刷机包。
要做的是替换掉image zip中的文件,在编译结果目录中找到,替换(最好不要解压再压缩,直接替换)。
13
运行脚本刷机。
14
最后效果:
15