【Android安全】Ubuntu 下载、编译 、刷入Android-8.1.0_r1

0. 环境准备

  • Ubuntu 16.04 LTS(预留至少95GB磁盘空间,实测占94.2GB)

  • Pixel 2 XL

    要买欧版的,不要美版的。

    欧版能解锁BootLoader、能刷机。

    美版IMEI里一般带"v"或者"version",这样不能解锁BootLoader、也不能刷机。

  • 想刷入Android-8.1.0_r1

1. 下载源码

参考:https://blog.csdn.net/aichu6610/article/details/116071003

注意改用 python3 ~/bin/repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r1

1.1 安装并配置git和repo

安装git

c 复制代码
sudo apt install git
git config --global user.name "your name"
git config --global user.email "XXX@XXX.com"

安装并配置repo

c 复制代码
sudo apt install curl

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

安装JDK 8

c 复制代码
sudo apt update
sudo apt install openjdk-8-jdk

创建文件目录

c 复制代码
mkdir  /home/tom/Android-8.1.0_r1
cd /home/tom/Android-8.1.0_r1

修改配置

找到~/bin/repo文件,修改如下配置

c 复制代码
REPO_URL = 'https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

在终端下运行

c 复制代码
git config --global url.https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/.insteadof https://android.googlesource.com

执行gedit ~/.bashrc然后在末尾添加:

c 复制代码
export PATH=~/bin:$PATH
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

运行 source ~/.bashrc 使环境变量生效

1.2 使用repo同步代码

Repo是谷歌提供的一套python脚本,封装了一系列git命令,用来管理多个git库

初始化repo仓库

c 复制代码
python3 ~/bin/repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r1

如果想用其他版本,在这里查询:

https://source.android.com/source/build-numbers?hl=zh-cn

同步代码

c 复制代码
repo sync -j8

这个过程会持续数个小时

-j8貌似是并行的意思,如果报错可以去掉-j8试试

中间有报错,但不知道是否有影响

某些时刻输出过长,所以最后就多出来一截 应该无大碍

以防万一,又 repo sync 了几遍

2. 准备驱动脚本

地址:https://developers.google.com/android/drivers

要找 android-8.1.0_r1 的 pixel 2xl的驱动

android-8.1.0_r1就是OPM1.171019.011

参考:https://source.android.com/docs/setup/about/build-numbers?hl=zh-cn#source-code-tags-and-builds

所以锁定:

https://developers.google.com/android/drivers#taimenopm1.171019.011

将上面两个link的内容下载下来,得到两个sh:

复制代码
extract-google_devices-taimen.sh 
extract-qcom-taimen.sh

3. 编译

3.1 编译

c 复制代码
source build/envsetup.sh

将下载的两个驱动脚本 放入源码根目录下 并执行

c 复制代码
./extract-google_devices-taimen.sh 
./extract-qcom-taimen.sh

一顿敲回车(注意不要敲过油了)

最后敲入I ACCEPT

执行lunch

c 复制代码
lunch

我的是Pixel 2 XL,也就是 taimen,所以选27

(各机型的对照参考:https://blog.csdn.net/guyongqiangx/article/details/123971895)

执行 time make

(这里不并行了,并行容易出bug,如果想并行可以time make -j4

c 复制代码
time make

3.2 报错:Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed.

复制代码
[  4% 5148/105788] Lex: applypatch <= bootable/recovery/edify/lexer.ll
FAILED: out/target/product/taimen/obj/STATIC_LIBRARIES/libedify_intermediates/lexer.cpp 
/bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -oout/target/product/taimen/obj/STATIC_LIBRARIES/libedify_intermediates/lexer.cpp bootable/recovery/edify/lexer.ll"
flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed.
Aborted (core dumped)
[  4% 5153/105788] target arm C++: libaudioprocessing_32 <= frameworks/av/media/libaudioprocessing/AudioResamplerDyn.cpp
ninja: build stopped: subcommand failed.
15:07:08 ninja failed with: exit status 1

解决办法:参考:https://groups.google.com/g/android-building/c/0kzPnw3akxg/m/ozJe-XlSAQAJ

c 复制代码
export LC_ALL=C

然后

c 复制代码
make clean
time make

出现了新的报错

3.3 报错:Out of memory error GC overhead limit exceeded.

复制代码
[ 62% 65895/105788] Building with Jack: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex
FAILED: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex 
/bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp
Out of memory error (version 1.3-rc7 'Douarn' (445000 d7be3910514558d6715ce455ce0861ae2f56925a by android-jack-team@google.com)).
GC overhead limit exceeded.
Try increasing heap size with java option '-Xmx<size>'.
Warning: This may have produced partial or corrupted output.
[ 62% 65900/105788] //art/compiler:libart-compiler clang++ optimizing/optimizing_compiler.cc [linux]
ninja: build stopped: subcommand failed.
20:28:27 ninja failed with: exit status 1

解决办法:参考 https://blog.csdn.net/liangtianmeng/article/details/86665237

在文件/prebuilts/sdk/tools/jack-admin中修正-Xmx参数

修改变量JACK_SERVER_VM_ARGUMENTS,添加参数 -Xmx2048M

c 复制代码
JACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation -mx2048M}"

然后

c 复制代码
make clean
time make


至此,编译成功了

4. 刷机

4.1 Ubuntu安装fastboot和adb

在Ubuntu系统上安装ADB Fastboot

c 复制代码
sudo apt install android-tools-adb
sudo apt install android-tools-fastboot

4.2 手机OEM解锁

要买欧版的,不要美版的。

欧版能解锁BootLoader、能刷机。

美版IMEI里一般带"v"或者"version",这样不能解锁BootLoader、也不能刷机。

手机解锁

参考:https://www.cnblogs.com/ciml/p/13949911.html

c 复制代码
adb reboot bootloader
c 复制代码
# 先看看设备是否连接成功
fastboot devices
c 复制代码
# 解锁 (用于2015年及之后的设备)
fastboot flashing unlock

# 老设备解锁 (2014及以前的设备)
fastboot oem unlock

这里用fastboot flashing unlock

如果报错

复制代码
FAILED (remote: 'Flashing Unlock is not allowed')
fastboot: error: Command failed

说明手机的开发者模式里"OEM解锁"没有打开

需要保证网络畅通,确保能访问Google

再次adb reboot bootloader

手机进入bootloader

c 复制代码
adb reboot bootloader
c 复制代码
fastboot flashing unlock

之后通过音量加减键选中Yes,通过电源键确认

4.3 刷入img镜像

参考:https://www.cnblogs.com/ciml/p/13714036.html

在刚才编译源码的同一终端窗口内执行

c 复制代码
fastboot flashall 

如果报错 error: ANDROID_PRODUCT_OUT not set

大概率是没在同一终端窗口执行

解决方法:执行

c 复制代码
export ANDROID_PRODUCT_OUT=~/Android-8.1.0_r1/out/target/product/taimen

其中,~/Android-8.1.0_r1/out/target/product/taimen 是img文件所在的目录

再次执行fastboot flashall

成功!

相关推荐
踢球的打工仔3 小时前
PHP面向对象(7)
android·开发语言·php
安卓理事人3 小时前
安卓socket
android
安卓理事人9 小时前
安卓LinkedBlockingQueue消息队列
android
万能的小裴同学10 小时前
Android M3U8视频播放器
android·音视频
q***577411 小时前
MySql的慢查询(慢日志)
android·mysql·adb
JavaNoober11 小时前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
城东米粉儿12 小时前
关于ObjectAnimator
android
zhangphil13 小时前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android
火柴就是我14 小时前
从头写一个自己的app
android·前端·flutter
lichong95115 小时前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端