AOSP 相关笔记

Posted by API Caller on February 24, 2020, last modified on February 25, 2020

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"

Ref