AOSP

环境准备

一个kali虚拟机,具体安装请看:https://blog.csdn.net/Qwertyuiop2016/article/details/118440538

也可以选择Ubuntu,用起来差不多,因为kali里内置的工具我一个也没用过。下面是我给虚拟机的配置情况。特别注意图中红框的部分,不能勾选(如果勾选,编译的时候会卡死)。
在这里插入图片描述
另外,我安装kali时,给的空间是240G,aosp的源码就190G,加上其他一些编译的文件,至少要300G的空间吧。所以我添加了一块500G的硬盘(步骤就不描述了,点击下面的添加一直下一步改个空间确定就行),这样添加的硬盘其实就是一些vmdk文件,你甚至可以在另一个虚拟机加载这个硬盘。当你不需要时,直接移除硬盘即可。最好是选择单个文件,这样目录清晰一些,而且其他的虚拟机加载也方便,相当于是个移动硬盘了。

在这里插入图片描述

添加完成之后打开虚拟机搜索GParted,就可以看到硬盘了。点击上面的设备->创建分区表,接着格式化一下硬盘,使用mount命令挂载即可。比如我的500G硬盘上面显示的是/dev/sda1,挂载硬盘命令:
mkdir /root/sda1
mount /dev/sda1 /root/sda1

安装依赖

https://source.android.google.cn/setup/build/initializing?hl=zh-cn

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

安装java

ubuntu apt install openjdk-8-jdk
kali
http://security.debian.org/debian-security/pool/updates/main/o/openjdk-8/
从上面的链接下载四个文件到某个空文件夹:
openjdk-8-jdk-headless_8u302-b08-1~deb9u1_amd64.deb
openjdk-8-jdk_8u302-b08-1~deb9u1_amd64.deb
openjdk-8-jre-headless_8u302-b08-1~deb9u1_amd64.deb
openjdk-8-jre_8u302-b08-1~deb9u1_amd64.deb
当前文件夹下执行dpkg -i *.deb就安装成功了

切换java为java1.8
update-alternatives --config java
update-alternatives --config javac

python

我试了编译Android7.1.2的系统,必须要python2,kali是自带的python2

Ubuntu18只需要输入python或者python2就会有提示,然后根据提示apt install即可

因为conda虚拟环境会导致访问的Python变成anaconda的python,只需要删除~/.bashrc里关于conda init的代码重新打开一个终端即可。编译完了,在执行一遍conda init bash, 又是原来的conda环境

也可以使用conda创建一个python2.7的虚拟环境 conda create -n py27 python=2.7 -y

然后切换到该虚拟环境conda activate py27

查看python的路径which python

做个软链接ln -s python路径 /usr/bin/python

启动TLSv1, TLSv1.1

https://segmentfault.com/a/1190000039970343

按照文章中的步骤去掉TLSv1, TLSv1.1

这是为了解决下面的这个错误

Jack server failed to (re)start, try 'jack-diagnose' or see Jack server log
SSL error when connecting to the Jack server. Try 'jack-diagnose'
SSL error when connecting to the Jack server. Try 'jack-diagnose'

在这里插入图片描述

安装repo

先安装repo
sudo curl https://storage.googleapis.com/git-repo-downloads/repo > /usr/local/bin/repo
chmod +x /usr/local/bin/repo

配置git
git config --global user.email "你的邮箱"
git config --global user.name "你的用户名"

设置repo的同步源(改命令仅在当前终端有效,也可以加入~/.bashrc)
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

repo查看帮助信息: repo help,查看某个命令的帮助信息: repo help sync。不过这两个命令需要先执行repo init。

下载源码

https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

下载源码有两种方法(#后面为注释,复制命令时请勿带上):
第一种(下载压缩包)

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar # 解压tar包
cd AOSP                # AOSP为解压的tar的文件夹,进入到这个文件夹
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-7.1.2_r8
repo sync -l -c              # 同步, -l表示只从本地.repo文件夹内同步,不访问网络。 -c表示当前分支

第二种(直接同步整颗树)

mkdir WORKING_DIRECTORY # WORKING_DIRECTORY只是个文件夹的名称,随意指定
cd WORKING_DIRECTORY
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-7.1.2_r8
repo sync  

两种方法都会得到一个.repo的文件夹,这是全部的安卓源码。结合上面的命令, 是不是可以只下载某个分支的源码,比如下面的命令
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-7.1.2_r8
repo sync -c

不太清楚是不是可以,按常理来说可以,因为我只编译某个系统确要下载整个源码,这不合理。 这是可以的,所以最好是这样去同步某个分支,而不需要全部的代码。这样同步大概七十多个G

分支列表请看:https://source.android.google.cn/setup/start/build-numbers?hl=zh-cn

.repo文件夹,其他均可以随意删除,比如你可以直接rm ./*,这会把所有的非隐藏文件删除掉,即只保留.repo。下次想在编译只需要再次运行repo initrepo sync -l又可以得到某个分支的源码了。

开始编译

https://source.android.google.cn/setup/build/building

export LC_ALL=C # 这个的解释看百度吧
source build/envsetup.sh
lunch # 选择一个设备,输入序号即可。
在这里插入图片描述
各个版本的解释

aosp 意味着一个全功能的Android。有时也称为通用系统映像。
mini 意味着精简的Android。
emulator 意味着这个 Android 是要在qemu-emulator 中运行的。
x86 arm   Android运行的CPU架构
user 正常的发行版Android
eng 带有附加调试工具的开发配置
userdebug 具有 root 访问权限和调试功能

并不是只有它列出来的才能使用,你可以自己拼接:aosp_sailfish-useraosp_sailfish-eng等。

使用lunch aosp_sailfish-user即可编译指定的版本。我第一次编译的是aosp_x86_64-eng,因为我想在电脑上运行这个编译的镜像

m -j8 # 开始编译,-j后面的8是指线程数,即使你不指定-j,它仍然以它认为最合适的线程数编译,不会是单线程的

m和make:https://blog.csdn.net/luoshengyang/article/details/19023609

在这里插入图片描述
我八线程编译用了一个小时15分钟,速度还行

启动模拟器

要想在电脑上运行你编译的aosp镜像,最好选择x86的,如果是arm的,你可能一个小时都等不来它启动成功。

编译完直接在当前终端执行emulator就可以启动了。不过在vmware中启动模拟器需要vt-x的支持,要先关机在勾选上面的第一张图的那个Vt-x的勾在开机。但是关机后当前终端的环境变量又没了。所以需要重新执行:
source build/envsetup.sh
lunch aosp_x86_64-eng # 你编译选择的哪个,这里就要选哪个,不然找不到镜像文件
emulator
在这里插入图片描述

驱动

如果需要在真机中运行,还需要下载驱动文件

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

需要下载和源码设备匹配的版本,比如源码是android-8.1.0_r1,则应下载OPM1.171019.011版本的驱动,在根据设备来选,比如pixel,就选择Pixel binaries for Android 8.1.0 (OPM1.171019.011)

源码分支和驱动版本的对应关系看:

https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds

下载完成后解压到源码的目录,执行一遍压缩包里的sh脚本即可。脚本实际上是将文件解压到vendor目录下。如果你下载错了,直接删除这个目录的文件重新下载执行一遍即可

刷入手机

编译完之后会在out/target/product/sailfish/生成一些镜像文件,刷机步骤如下:

cd out/target/product/sailfish/ # 其实我试了不在这个目录也能刷,只要设置了ANDROID_PRODUCT_OUT指向这个目录就行。为了避免不必要的错误还是谨慎点好

export ANDROID_PRODUCT_OUT=$(pwd)

fastboot flashall -w # 将目录镜像刷入手机
在这里插入图片描述

其实刷机真正用到的是那些文件,目录用不上。如果要保存的话只需要保存文件就可以了。下次刷机设置ANDROID_PRODUCT_OUT,然后刷就行。

至于手机进入fastboot这些基本操作就不多说了

xposed

http://www.manongjc.com/detail/11-xslsxmzofjxcljo.html

几乎都是按照上面这篇博客来操作的

需要注意的地方:

编译XposedBridge和XposedInstall时,要使用java8来编译,不能用自带的java11,不然会报下面这个错误,
请添加图片描述

更换JDK版本:在File->Setting->Build,Execution…->Build Tools->Gradle,右侧的Gradle JDK就可以改jdk的版本

另外,编译XposedTools时需要先编译对应的系统。比如你想编译./build.pl -t arm64:25,就需要先编译aosp安卓7.1arm64架构的系统,我编译的是aosp_angler-userdebug,然后build.conf填这个编译的源码路径

如果没有编译系统就编译xposed的话也会报错,如果只编译了x86的系统,然后编译arm的xposed不会报错,但是编译出来的压缩包刷不到手机(XposedInstaller安装这个压缩包的时候会报错)。

编译xposedTools只是需要aosp的源码而已,编译完成的所有文件(xposed的zip刷机包,XposedInstaller等)是可以在任何机器上运行的。另外,运行的手机或者模拟器需要对应你编译的sdk版本和CPU架构。我测试了在手机和逍遥模拟器都可以直接刷入我自己编译的zip包

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐