repo
1
2
3
4
5
6
7
8
9
10
11
12
mkdir bin && cd bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo
PATH=$(pwd):$PATH
cd ..
git config --global user.email=[email protected]
git config --global user.name=Your Name
export REPO_URL='https://gerrit-googlesource.proxy.ustclug.org/git-repo'
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# https://github.com/microsoft/wsl/issues/2468#issuecomment-374904520
sudo apt-get install qemu qemu-user-static binfmt-support
sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'
repo init --depth 1 -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.1.0_r52 --platform=auto --no-clone-bundle
repo info
repo sync -f --force-sync --no-clone-bundle --no-tags
source build/envsetup.sh
lunch aosp_bullhead-userdebug
./prebuilts/misc/linux-x86/ccache/ccache -M 50G
指定分支的话, 参见 代号、标记和细分版本号, 例如 MMB29K
对应 android-6.0.1_r1
:
1
2
3
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-6.0.1_r1
repo info
不推荐使用 HTTP 协议同步,因为 HTTP 服务器不支持 repo sync
的 --depth
选项,可能导致部分仓库同步失败1。
修改内核
拉取代码
查看 关于手机
- 内核版本
, 比如 MMB29K
对应 3.4.0-g7717f76
, github 有个镜像 aosp-mirror/kernel_msm 可以方便地查看对应地分支 commit/7717f76 :
发现存在于三个分支中 android-msm-hammerhead-3.4-marshmallow-mr1 + android-msm-hammerhead-3.4-marshmallow-mr2 + android-msm-hammerhead-3.4-marshmallow-mr3
, 进第一个分支查看历史提交 commits/android-msm-hammerhead-3.4-marshmallow-mr1
此处可以利用 API 写个脚本来遍历出 7717f76
所在深度, 这样能少拉取点:
https://api.github.com/repos/aosp-mirror/kernel_msm/commits/android-msm-hammerhead-3.4-marshmallow-mr1?page=1
于是:
1
2
3
4
git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git -b android-msm-hammerhead-3.4-marshmallow-mr1 --depth 20
cd msm
git checkout 7717f76
配置 Perl
新版本 perl 不支持 defined(@array)
所以会报错, 为了暂时保持 不改动源码
的原则, 利用 perlbrew
切换到合适的 perl 版本:
1
2
3
4
5
6
7
sudo apt install perlbrew
perlbrew init
perlbrew --notest install perl-5.10.0
perlbrew switch perl-5.10.0
perl --version
prebuilts
1
2
3
4
5
6
cd ~
git clone https://aosp.tuna.tsinghua.edu.cn/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8 -b marshmallow-mr1-release --depth 1
# 添加到环境变量
export PATH=$(pwd)/arm-eabi-4.8/bin:$PATH
编译
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# make menuconfig 需要, 其实也没用
sudo apt install ncurses-dev
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-
cd msm
# 过滤出需要的配置
make help | grep hammerhead
# hammerhead_defconfig - Build for hammerhead
make hammerhead_defconfig
make -j7
file arch/arm/boot/zImage-dtb
# arch/arm/boot/zImage-dtb: Linux kernel ARM boot executable zImage (little-endian)
重新打包
此处先不考虑编译 AOSP 所以选择重打包 boot.img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cd ~
git clone https://github.com/pbatard/bootimg-tools
cd bootimg-tools
make
# 添加到环境变量
export PATH=$(pwd)/mkbootimg:$PATH
# 解包原 ROM 的 boot.img
unmkbootimg -i boot.img --kernel zImage-dtb
# 会输出一条用于重打包的命令, 记下来
# To rebuild this boot image, you can use the command:
# 用生成的 arch/arm/boot/zImage-dtb 替换 kernel
cp $KERNEL/msm/arch/arm/boot/zImage-dtb ./zImage-dtb
# 然后用刚才输出的命令打包 bootnew.img
# mkbootimg ... -o bootnew.img
刷入/运行
查看官网 运行内核 选择 fastboot 启动但不刷入的方式, 重启会恢复, 方便修改调试
1
2
# fastboot oem unlock # 解锁
fastboot boot bootnew.img
启动成功后查看 关于手机
- 内核版本
, 就会发现有所变化.
Magisk Patch
Magisk
是通过 patch boot.img 实现 root, 如果用 fastboot boot bootnew.img
方式启动, 基于这个原理 root 权限就会丢失, 所以如果需要保持 root 权限, 则需要用 Magisk
对生成的 bootnew.img 进行 patch.
可以先安装 Magisk Manager
, 然后用它 patch bootnew.img (需联网下载一些程序), 然后用生成的 magisk_patched.img 启动: fastboot boot magisk_patched.img
.
简单看了下 magisk 的 patch 实现. 以 Magisk v20.3
为例, 用来 patch 的可执行文件和脚本都在 Magisk-v20.3.zip
中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 下载并解压 arm 版本的 magiskboot magiskinit 并给权限
# x86 版本虽然方便执行但需要替换对应的文件
# 嫌麻烦所以此处用 qemu-user
sudo chmod a+x magisk*
# 下载 boot_patch.sh 和 util_functions.sh
wget https://github.com/topjohnwu/Magisk/raw/v20.3/scripts/boot_patch.sh
wget https://github.com/topjohnwu/Magisk/raw/v20.3/scripts/util_functions.sh
sed -i 's/\/system\/bin\/sh/\/bin\/sh/g' boot_patch.sh
# 替换为 qemu-user 执行
sed -i 's/\.\/magiskboot/qemu-arm-static $(cd $(dirname $0); pwd)\/magiskboot/g' boot_patch.sh
sed -i 's/\.\/magiskinit/qemu-arm-static $(cd $(dirname $0); pwd)\/magiskinit/g' boot_patch.sh
sed -i 's/\.\/util_functions\.sh/$(cd $(dirname $0); pwd)\/util_functions\.sh/g' boot_patch.sh
export BOOTMODE=true
sh boot_patch.sh bootnew.img
# 生成的 new-boot.img 刷入即可有 root 权限
编译内核时保持 /proc/version
和官方镜像一样
1
2
3
4
5
6
7
8
9
10
11
12
13
# No rule to make target `net/netfilter/xt_TCPMSS.o', needed by `net/netfilter/built-in.o'.
# https://lkml.org/lkml/2020/5/6/1301
mv net/netfilter/xt_tcpmss.c net/netfilter/xt_TCPMSS.c
# adb shell cat /proc/version
export KBUILD_BUILD_VERSION=1
export KBUILD_BUILD_USER=android-build
export KBUILD_BUILD_HOST=xxx.google.com
export KBUILD_BUILD_TIMESTAMP="Xxx Xxx xx xx:xx:xx UTC xxxx"
sed -i "s/#define LINUX_COMPILER/#define LINUX_COMPILER "'\\"gcc version x.x.x-google xxxxxxxx \\(prerelease\\) \\(GCC\\) \\" # /' scripts/mkcompile_h
make bullhead_defconfig
make -j7 KERNELRELEASE="x.xx.xx-gxxxxxxxxxxxx"