如何编译avd for macarm or winx86 内核

发布时间 2023-12-29 11:34:45作者: FW_ltlly

AVD:Android Virtual Device

前言

别问需求 问就是抽象

背景是pixel6好贵 买不起

备用机内核只有4.4 改了三天内核代码 只把kernelSu patch进去了 玩不起ebpf 呜呜呜

什么 我是mac m1? 有android studio的原生arm模拟器?

avd 启动!

解决痛点: 没有root 等需要自定义内核的需求 如patch kernelSu

另说:如果你只是需要root的话 使用 https://gitlab.com/newbit/rootAVD 安装magisk 是更快的选择 虽然我没用过 但是真的很快看起来

编译目标

Alt text

的内核 (x86_64与aarch64两个版本)

环境搭建

系统

wsl2 + ubuntu22.04(x86) 32g

推荐你的ubuntu有16g以上的可用内存

我不推荐使用vmware 我的vmware把cpu核数拉满了也只能吃30% 好奇怪 但是只是影响编译速度而已(

如果你有一个高性能的linux服务器就更好了

网络

需要大量访问 https://android.googlesource.com/ 获取代码与toolchains

如果你能稳定快速访问当我没说(

不要使用proxychains 很不稳定

我使用export http_proxy 等

apt

不记得apt安装过什么了(

sudo apt install git 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

我还另行配置了ssh和scp 我在mac上ssh到我的wsl进行的编译

repo的安装

mkdir ~/bin

wget https://storage.googleapis.com/git-repo-downloads/repo -P ~/bin/

chmod a+x ~/bin/repo

在~/.bashrc中添加 export PATH=~/bin:$PATH

拉取源码

BRANCH=common-android12-5.10-lts
ROOTDIR=AVD-kernel-$BRANCH
mkdir $ROOTDIR && cd $ROOTDIR
repo init --depth=1 -u https://android.googlesource.com/kernel/manifest -b $BRANCH
repo sync --force-sync --no-clone-bundle --no-tags -j$(nproc)

如果中途断了 就把整个建立的文件夹都删了再重新拉吧

真的很慢 拉取加编译后共占16g

Alt text

编译

修改config

aarch64

请看 common/build.config.aarch64

获取到如下信息

Alt text

MAKE_GOALS="
Image
modules
"

FILES="
arch/arm64/boot/Image
vmlinux
System.map
vmlinux.symvers
modules.builtin
modules.builtin.modinfo
"

然后请看 common-modules/virtual-device/build.config.virtual_device.aarch64

Alt text

如图

注释原有的MAKE_GOALS 和 FILES

追加 SKIP_CP_KERNEL_HDR=1
追加 上面获取的信息

x86_64

common/build.config.x86_64

拿到

MAKE_GOALS="
bzImage
modules
prepare-objtool
"

FILES="
arch/x86/boot/bzImage
vmlinux
System.map
vmlinux.symvers
modules.builtin
modules.builtin.modinfo
"

然后修改 common-modules/virtual-device/build.config.virtual_device.x86_64

注释原有的MAKE_GOALS 和 FILES

追加 SKIP_CP_KERNEL_HDR=1
追加 上面获取的信息

其他架构

和上面类似

make config

根据你要build的内核架构

x86_64

BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 \
FRAGMENT_CONFIG=common/arch/x86/configs/gki_defconfig \
build/config.sh

进入菜单后直接save 然后exit即可

aarch64

BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.aarch64 \
FRAGMENT_CONFIG=common/arch/arm64/configs/gki_defconfig \
build/config.sh

进入菜单后直接save 然后exit即可

make原版内核

aarch64

time LTO=thin BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.aarch64 \
build/build.sh -j$(nproc)

x86


time LTO=thin  BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 \
build/build.sh -j$(nproc)


time命令用来计时 不加也行(

LTO=thin比较重要,如果你的内存小于32g 加这个参数,否则不加( 反正我没加没build成功 直接给我wsl跑崩溃了

如果所有的都没报错的话 你会在shell中看到输出
类似于
Files copied to ~/AVD-kernel-common-android12-5.10-lts/out/android12-5.10/dist

然后你可以在dist中找到Image文件 或 bzImage 取决于你build出来的架构 即

Alt text

中的MAKE_GOALS

替换avd内核 尝试开机

Alt text

关闭你的avd

进入 /Users/ltlly/Library/Android/sdk/system-images/android-31/google_apis/arm64-v8a中

备份原始 kernel-ranchu

将你build出来的Image改名为kernel-ranchu

Alt text

选这个 能进入系统就算成功

如果你没进入系统 请 尝试

重新build

检查你有没有正确修改config

adb中使用uname -r 查看Alt text 你repo拉下来的源码是否与之匹配 如:common-android12-5.10-lts

修改内核

演示集成kernelSu

https://kernelsu.org/zh_CN/guide/how-to-build.html#使用-kernelsu-构建内核

在common目录下执行

curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -

来一键集成kernelSu

或者你选择修改内核的config

命令见 make config 节

修改后save exit即可

重新编译内核

aarch64

time LTO=thin BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.aarch64 \
SKIP_MRPROPER=1 \
build/build.sh -j$(nproc)

x86


time LTO=thin  BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 \
SKIP_MRPROPER=1 \
build/build.sh -j$(nproc)


增加了SKIP_MRPROPER=1参数 用来跳过 make mrproper 命令(类似于更彻底的make clean)加速编译

当然你也可以删除该参数 每次都全量编译内核

替换内核 尝试开机

见上文

胜利结算画面

Alt text

Alt text

Alt text

不足之处

avd的android镜像还是特征太多了 比如系统指纹什么的都能看出来不是一台正常设备

如果要去除这些特征的话就要全量build avd的镜像啦 等我以后想逆check环境的app再重新build这些叭

参考文献

绝大多数命令魔改自
https://xdaforums.com/t/guide-build-mod-update-kernel-ranchu-goldfish-5-4-5-10-gki-ramdisk-img-modules-rootavd-android-11-r-12-s-avd-google-play-store-api.4220697/

虽然没什么用 但这是官方给出的内核build方式
https://source.android.com/docs/setup/build/building-kernels?hl=zh-cn

如果你只是想为avd安装一个magisk https://gitlab.com/newbit/rootAVD

安装repo https://blog.csdn.net/xuanwolanxue/article/details/104678027

现在最新的wsl2可以直接共享windows的ip的 也可以直接走代理 https://www.v2ex.com/t/975098?p=2

集成KernelSu https://kernelsu.org/zh_CN/guide/how-to-build.html#使用-kernelsu-构建内核

看看内核源码 https://elixir.bootlin.com/linux/v4.4.302/source

为android增加硬件断点 https://bbs.kanxue.com/thread-278647.htm#msg_header_h1_4

如果你修改的内核低于5.10 又想开启ebpf相关功能? https://blog.seeflower.dev/archives/174/#title-1