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 是更快的选择 虽然我没用过 但是真的很快看起来
编译目标
的内核 (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
编译
修改config
aarch64
请看 common/build.config.aarch64
获取到如下信息
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
如图
注释原有的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出来的架构 即
中的MAKE_GOALS
替换avd内核 尝试开机
关闭你的avd
进入 /Users/ltlly/Library/Android/sdk/system-images/android-31/google_apis/arm64-v8a中
备份原始 kernel-ranchu
将你build出来的Image改名为kernel-ranchu
选这个 能进入系统就算成功
如果你没进入系统 请 尝试
重新build
检查你有没有正确修改config
adb中使用uname -r 查看 你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)加速编译
当然你也可以删除该参数 每次都全量编译内核
替换内核 尝试开机
见上文
胜利结算画面
不足之处
avd的android镜像还是特征太多了 比如系统指纹什么的都能看出来不是一台正常设备
如果要去除这些特征的话就要全量build avd的镜像啦 等我以后想逆check环境的app再重新build这些叭
参考文献
虽然没什么用 但这是官方给出的内核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
标签:macarm,common,winx86,device,内核,avd,virtual,config,build From: https://www.cnblogs.com/FW-ltlly/p/17934456.html