前言
最近在研究安卓沙箱,恰好又看到几篇文章和视频,所以尝试基于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
然后开始准备下载源码。
源码下载
注意这里的源码分支应该根据我们的设备情况而选定,详细参考官网:官网
这里我使用的是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
然后就是运行开始下载,漫长的等待。
下载完后如图:
源码编译及碰到的问题
在源码编译过程中,一定要注意对应Android版本的平台要求,和Android版本所需要的JDK版本,这里编译的是Android8,使用OpenJDK8,系统自带也是,就不用再去下载。
然后配置驱动文件,需要下载对应设备的驱动文件,这里我们使用的是Google piexl1,可以去官方网址下载下载地址:
下载后,解压将sh文件放到安卓源码目录下。
依次运行下载的驱动文件,按Enter键一行行的查看,最后输入 I ACCEPT。
开始准备编译,使用build目录中的envsetup.sh脚本初始化环境。
输入 lunch,选择与设备对应的编译版本,这里我是pixel1,选sailfish。
执行命令开始编译。
报错一
第一个报错,提示SSL error:
原因是默认的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分区。
报错三
第三个报错,提示conection to the jack server time out。
防火墙的问题,执行命令:
sudo ufw disable` 关闭防火墙
sudo git config --global http.sslVerify false` 关闭ssl校验
编译成功
终于没有报错了,然后就是漫长的等待,编译成功。
生成的编译结果在out/target/product/sailfish下。
刷入设备
从官网下载刷机包。
要做的是替换掉image zip中的文件,在编译结果目录中找到,替换(最好不要解压再压缩,直接替换)。
运行脚本刷机。
最后效果: