kali编译aosp和xposed
AOSP环境准备一个kali虚拟机,具体安装请看:https://blog.csdn.net/Qwertyuiop2016/article/details/118440538也可以选择Ubuntu,用起来差不多,因为kali里内置的工具我一个也没用过。下面是我给虚拟机的配置情况。特别注意图中红框的部分,不能勾选(如果勾选,编译的时候会卡死)。另外,我安装kali时,给的空间是240G,aosp的源
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 init
和repo 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-user
、aosp_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包
更多推荐
所有评论(0)