【Android安全-pixel 5 编译安卓12源码和源码】此文章归类为:Android安全。
源代码标记和 build:f9eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6L8%4g2J5j5$3g2Q4x3X3g2S2L8X3c8J5L8$3W2V1i4K6u0W2j5$3!0E0i4K6u0r3k6r3!0U0M7#2)9J5c8Y4y4W2N6s2g2H3i4K6u0r3M7X3g2X3k6i4u0W2L8X3y4W2i4K6u0r3j5Y4g2A6L8r3c8Q4x3X3c8F1N6h3#2T1k6i4u0K6
谷歌官方镜像:62fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0K6i4K6u0W2k6$3!0G2k6$3I4W2i4K6u0W2j5$3&6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0r3K9h3#2S2k6$3g2K6i4K6y4r3K9r3I4Q4x3@1c8*7K9q4)9J5k6r3y4F1i4K6t1K6M7X3g2V1k6X3W2F1
驱动程序二进制文件:7cdK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0K6i4K6u0W2k6$3!0G2k6$3I4W2i4K6u0W2j5$3&6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0r3k6s2u0A6N6X3g2J5M7#2)9K6c8X3S2D9i4K6y4p5P5X3S2Q4x3X3c8U0L8W2)9J5x3%4u0W2k6r3k6A6L8R3`.`.
内核分支信息:3d9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0W2k6$3!0G2k6$3I4W2M7$3!0#2M7X3y4W2i4K6u0W2j5$3!0E0i4K6u0r3K9$3g2J5L8X3g2D9i4K6u0r3L8i4y4E0i4K6u0r3i4K6u0n7M7X3g2X3M7H3`.`.
硬盘最少要300G以上,内存最少要16G以上,如果要内核和源码 硬盘最少500G
本次编译所用的环境配置:
vmware版本 15 Pro
Ubuntu版本 20.4 TLS
空间 750G
内存 32G
下图的F盘 是编译完源码和内核所用的空间

安装好系统后,先将Ubuntu的源更换成国内的源,如 清华源、中科大源。这样下载的速度就会很快了。
编辑源列表
1 | sudo nano /etc/apt/sources.list |
替换默认源
1 2 3 4 5 6 7 8 9 10 11 | deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiversedeb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiversedeb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiversedeb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiversedeb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse |
配置好源后就可以搭建源码编译的环境了。
1 2 3 4 5 | sudo apt-get updatesudo apt-get install git openjdk-11-jdk flex bison gperf build-essential \zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev \libxml2-utils xsltproc unzip fontconfig python-is-python3 libncurses5 |
2020年1月1日起,不再支持 python2,请使用 python3。
1 | sudo apt install python3.8 |
分别替换为自己的名字和邮箱(邮箱和名字随便填)
1 2 | git config --global user.name YourNamegit config --global user.email you@example.com |
1 2 3 | mkdir ~/bincurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo |
如果下载不下来,可以用下面的命令试试
1 2 3 4 | mkdir ~/binPATH=~/bin:$PATHcurl -sSL '93fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4k6i4u0J5K9i4c8Q4x3X3c8Y4L8$3!0Y4L8r3g2K6L8%4g2J5j5$3g2Q4x3X3g2H3M7X3!0^5P5g2)9J5k6i4g2K6N6r3y4D9N6h3N6Q4x3X3g2G2M7X3N6Q4x3V1k6Y4K9i4c8Q4x3X3c8J5k6i4m8G2i4K6u0r3i4K6u0n7i4K6u0r3L8h3q4K6N6r3g2J5i4K6u0r3M7X3g2H3L8#2)9K6c8X3k6G2M7X3#2S2N6q4)9K6c8q4c8q4h3q4c8Q4x3U0M7`. |base64 -d > ~/bin/repochmod a+x ~/bin/repo |
1 | mkdir 12 & cd 12 |
在这里 7d7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6L8%4g2J5j5$3g2Q4x3X3g2S2L8X3c8J5L8$3W2V1i4K6u0W2j5$3!0E0i4K6u0r3k6r3!0U0M7#2)9J5c8Y4y4W2N6s2g2H3i4K6u0r3M7X3g2X3k6i4u0W2L8X3y4W2i4K6u0r3j5Y4g2A6L8r3c8Q4x3X3c8F1N6h3#2T1k6i4u0K6i4K6y4r3K9r3I4Q4x3@1c8*7K9q4)9J5k6r3y4F1
查看自己手机所对应的Tag, 比如我的手机是 Pixel 5,在 Tag 列表查看对应的机型都有哪些 TAG。
这里我选了android-12.0.0_r28这个Tag,(因为这个Tag支持的手机型号多,到时候换手机可以直接用)
| build ID | 标记 | 支持的设备 |
|---|---|---|
| SQ1A.220205.002 | android-12.0.0_r28 | Pixel 3a、Pixel 3a XL、Pixel 4、Pixel 4 XL、Pixel 4a、Pixel 4a (5G)、Pixel 5、Pixel 5a (5G) |
注意,repo 默认的使用的地址是 REPO_URL = '5a4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4k6i4u0J5K9i4c8Q4x3X3g2Y4L8$3!0Y4L8r3g2K6L8%4g2J5j5$3g2Q4x3X3g2U0L8$3#2Q4x3V1k6Y4K9i4c8Q4x3X3c8J5k6i4m8G2i4K6t1%4
这里需要修改 REPO_URL,否则会出现无法下载的情况.
修改方法:打开 ~/bin/repo, 把 REPO_URL 一行替换成下面的:
1 | REPO_URL = '56bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4k6i4u0J5K9i4c8Q4x3X3c8Y4L8$3!0Y4L8r3g2K6L8%4g2J5j5$3g2Q4x3X3g2H3M7X3!0^5P5g2)9J5k6i4g2K6N6r3y4D9N6h3N6Q4x3X3g2G2M7X3N6Q4x3V1k6Y4K9i4c8Q4x3X3c8J5k6i4m8G2i4K6t1%4 |
1 | repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-12.0.0_r28 |
1 | repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.0.0_r28 |
最好是晚上同步代码,大约一个半小时就同步完成了,我在白天同步过,6个多小时都没有同步完
1 | repo sync -c -j4 |
也可以使用下面的脚本同步。
1 2 3 4 5 6 7 8 | #!/bin/bashpython3 ~/bin/repo sync -j4while [ $? -ne 0 ]doecho "======sync failed ,re-sync again======"sleep 3python3 ~/bin/repo sync -j4done |
驱动程序需要在这里下载 70bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0K6i4K6u0W2k6$3!0G2k6$3I4W2i4K6u0W2j5$3&6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0r3k6s2u0A6N6X3g2J5M7#2)9K6c8X3S2D9i4K6y4p5P5X3S2Q4x3X3c8U0L8W2)9J5x3%4u0W2k6r3k6A6L8R3`.`.
以pixel 5 为例,根据源码的Tag手机所对应的驱动是
1 | Android 12.0.0(SQ1A.220205.002) 的 Pixel 5 |
Pixel 5 驱动二进制文件 下载地址 cf8K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0K6i4K6u0W2k6$3!0G2k6$3I4W2i4K6u0W2j5$3&6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0r3k6s2u0A6N6X3g2J5M7#2)9K6c8X3S2D9i4K6y4p5P5X3S2Q4x3X3c8U0L8W2)9J5x3%4u0W2k6r3k6A6L8R3`.`.
下载完成后将驱动文件解压,放入aosp文件的根目录。
下载的内容解压后,是两个 sh 文件,以 Pixel 5 为例,在代码根目录执行,用 Enter 向下翻页,直到最后手动输入 I ACCEPT.
使用Enter快速向下翻页的时候,翻到到第8的时候最好改为单点Enter,不然容易直接跳过去。
如果内存不够,会在99%的时候显示编译失败
增加10G swap内存空间,不然会内存不够,如果你的硬盘空间够大,可以分配更大的内存空间。
1 | dd if=/dev/zero of=swapfile bs=1M count=30000 |
mkswap创建交换文件:
1 | mkswap swapfile |
swapon激活
1 | sudo swapon swapfile |
查看
1 | free -m |
-user:代表这是编译出的系统镜像是可以用来正式发布到市场的版本,其权限是被限制的(如,没有root权限,不能dedug等)
-userdebug:在user版本的基础上开放了root权限和debug权限。
-eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),还附带了许多debug工具。
1 | source build/envsetup.sh |
1 | lunch |
这里我选择 aosp_redfin-userdebug,就选 30:
1 |
1 | make -j8 |
第一次编译,大约需要4个小时,最好不要修改任何代码,不然一报错就要重新开始
编译过程

编译完成

编译完成后,可以将下面的命令写成一个脚本,如12.sh,这样就不用每次输入命令了。
1 2 3 | source build/envsetup.shlunch 30make -j8 |
编译完的镜像会在/out/target/product/redfin 文件中,redfin 是设备代号,redfin 表示 Pixel 5。
如果刷机的时候报错,只要将android-info.txt修改成对应的版本即可

安装fastboot
1 | sudo apt-get install android-tools-fastboot |
安装kvm
1 | sudo apt-get install qemu-kvm |
配置ANDROID_PRODUCT_OUT环境(注意要用自己的路径替代)
1 | export ANDROID_PRODUCT_OUT=/home/lving/Desktop/12/out/target/product/redfin |
编译完的镜像会在/out/target/product/redfin 文件中,redfin 是设备代号,redfin 表示 Pixel 5。
注意, 没有vbmeta_system.img的话刷出来可能无法开机
1 2 3 4 5 6 | adb reboot fastbootfastboot flash product product.imgfastboot flash system_ext system_ext.imgfastboot flash vbmeta_system vbmeta_system.imgfastboot flash system system.imgfastboot reboot |
如果使用上面命令刷完无法开机,可以把谷歌的官方镜像全部换成自己编译出来的镜像,再刷一次就可以了。

如果刷入使用了下面编译的内核,刷机的时候要先刷入使用源码编译出来的内核文件,再刷入系统镜像,不然可能会无法开机
把抓包证书放在AOSP源码目录下的“system/ca-certificates/files”目录下即可,添加的是以.0结尾的证书
2.跟踪JNI调用
在 art/runtime/reflection.cc中的InvokeWithArgArray函数中添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | void InvokeWithArgArray(const ScopedObjectAccessAlreadyRunnable& soa, ArtMethod* method, ArgArray* arg_array, JValue* result, const char* shorty) REQUIRES_SHARED(Locks::mutator_lock_) { uint32_t* args = arg_array->GetArray(); if (UNLIKELY(soa.Env()->IsCheckJniEnabled())) { CheckMethodArguments(soa.Vm(), method->GetInterfaceMethodIfProxy(kRuntimePointerSize), args); } //add code before invoke ArtMethod* artMethod= nullptr; Thread* self=Thread::Current(); const ManagedStack* managedStack= self->GetManagedStack(); if(managedStack!= nullptr){ ArtMethod** tmpartmethod= managedStack->GetTopQuickFrame(); if(tmpartmethod!= nullptr){ artMethod=*tmpartmethod; } } if(artMethod!= nullptr && (artMethod->PrettyMethod()).find("xxxxxxx") != std::string::npos) { std::ostringstream oss; oss << "[InvokeWithArgArray]beforecall caller:" << artMethod->PrettyMethod() << "---called:"<< method->PrettyMethod(); LOG(ERROR)<<oss.str(); } //add end method->Invoke(soa.Self(), args, arg_array->GetNumBytes(), result, shorty);} |
这个find("xxxxxxx")中的xxxxxxx根据自己的需要来填写。
官方构建内核文档:dbbK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6L8%4g2J5j5$3g2Q4x3X3g2S2L8X3c8J5L8$3W2V1i4K6u0W2j5$3!0E0i4K6u0r3k6r3!0U0M7#2)9J5c8Y4y4W2N6s2g2H3i4K6u0r3j5Y4g2A6L8r3c8Q4x3V1k6T1N6h3W2D9k6r3W2F1k6#2)9J5k6s2m8A6P5r3g2D9i4K6u0V1K9$3g2J5L8X3g2D9M7#2)9K6c8X3S2D9i4K6y4p5P5X3S2Q4x3X3c8U0L8W2)9J5x3%4y4#2M7s2m8G2M7Y4c8W2k6q4)9J5k6r3E0W2M7X3&6W2L8q4)9J5k6r3u0J5j5h3&6U0K9r3g2K6
| 设备 | 仓库分支 |
|---|---|
| Pixel 5 (redfin) | android-msm-redbull-4.19-android14-qpr3 |
通过查找,我们知道了Pixel 5 的分支是android-msm-redbull-4.19-android14-qpr3,内核版本为 4.19。内核源码的代号是
1 | android-msm-redbull-4.19 |
那我么就在14cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0W2k6$3!0G2k6$3I4W2M7$3!0#2M7X3y4W2i4K6u0W2j5$3!0E0i4K6u0r3K9$3g2J5L8X3g2D9i4K6u0r3L8h3q4F1K9h3k6W2M7%4c8Q4x3V1k6Q4x3V1u0J5k6h3k6K6i4@1f1@1i4@1t1^5i4@1q4p5i4@1f1$3i4K6V1H3i4K6W2o6i4@1f1%4i4@1t1@1i4@1p5J5i4@1f1#2i4@1q4r3i4@1t1&6i4@1f1#2i4@1u0m8i4K6V1@1i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1#2i4K6R3$3i4K6R3#2i4@1f1$3i4@1p5H3i4@1t1^5i4@1f1#2i4K6R3^5i4K6R3$3i4@1f1$3i4K6V1@1i4@1q4r3 android-msm-redbull-4.19。
我们编译的是pixle 5 的安卓12源码,所以对应的分支是
1 | android-msm-redbull-4.19-android12 |
确定了内核源码的具体分支后,就可以下载内核源码了。
1 | mkdir kernel && cd kernel |
1 | repo init -u git://mirrors.ustc.edu.cn/aosp/kernel/manifest -b android-msm-redbull-4.19-android12 |
1 | repo sync -j4 |
在拉却内核源码的时候,最好使用代理下载,我使用国内的源下载每次都报错
配置代理
1 2 3 4 | export http_proxy=http://192.168.x.xxx:10809export https_proxy=https://192.168.x.xxx:10809git config --global http.proxy http://192.168.x.xxx:10809git config --global https.proxy https://192.168.x.xxx:10809 |
1 | mkdir kernel && cd kernel |
1 | repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-redbull-4.19-android12 |
1 | repo sync -j4 |
1 | adb shell cat proc/version |
输出
1 | Linux version 4.19.202-g5fbe36ea56f7-ab8008033 (build-user@build-host) (Android (7284624, based on r416183b) clang version 12.0.5 (https://android.googlesource.com/toolchain/llvm-project c935d99d7cf2016289302412d708641d52d2f7ee), LLD 12.0.5 (/buildbot/src/android/llvm-toolchain/out/llvm-project/lld c935d99d7cf2016289302412d708641d52d2f7ee)) #1 SMP PREEMPT Thu Dec 16 06:08:11 UTC 2021 |
其中 g 后面的就是分支号
1 | 5fbe36ea56f7 |
1 | cd private/msm-google |
1 | git checkout 5fbe36ea56f7 |
这里内核源码的编译步骤,参考了大佬oacia的帖子。
从系统的rom包中提取boot.img,进一步通过Android Image Kitchen 对boot.img进行解包。
然后运行 unpackimg.bat,运行之后的窗口请不要关闭,因为输出中有需要后续使用到的参数,将输出的内容复制下来到 txt 中。
这是因为在 Android12 的包中的boot中移除了ramdisk,所以无法提取到任何内容。
解决办法就是 在 pixel 5官方的factory包中去找较低版本的包,例如 Android11 的出厂包。
帖子中解包出来的是boot.img-ramdisk.cpio, 我解包出来的是boot.img-ramdisk.lz4.
将解包出来的boot.img-ramdisk.lz4 放到内核源码根目录。
2.下载mkbootimg.py
地址 c3cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4G2M7%4m8^5M7X3g2X3i4K6u0W2j5$3!0E0i4K6u0r3j5h3&6V1M7X3!0A6k6q4)9J5k6o6p5I4i4K6u0W2x3q4)9J5k6e0m8Q4y4h3k6J5x3U0q4Q4x3V1k6^5M7X3g2X3i4K6u0r3M7%4W2K6N6r3g2E0i4K6u0r3N6r3!0G2L8s2y4Q4x3V1k6E0K9$3u0G2L8%4c8A6L8h3N6Q4x3V1k6E0K9$3u0G2L8%4c8A6L8h3N6Q4x3X3g2H3P5b7`.`.
将下载的mkbootimg.py也放到内核源码根目录。
3.开始编译
1 | BUILD_CONFIG=private/msm-google/build.config.redbull BUILD_BOOT_IMG=1 MKBOOTIMG_PATH=mkbootimg.py VENDOR_RAMDISK_BINARY=boot.img-ramdisk.cpio.lz4 KERNEL_BINARY=Image.lz4 BOOT_IMAGE_HEADER_VERSION=3 KERNEL_CMDLINE="" BASE_ADDRESS=0x00000000 PAGE_SIZE=4096 build/build.sh |
编译出来的vendor_boot.img 会比原来小很多
使用内核源码编译的vendor_boot.img大小

原来的vendor_boot.img大小

修改了代码 记得 git commit 一下啊,不然会显示脏内核
1 2 3 4 | adb reboot bootloaderfastboot flash boot boot.imgfastboot flash vendor_boot vendor_boot.imgfastboot reboot |
更多【Android安全-pixel 5 编译安卓12源码和源码】相关视频教程:www.yxfzedu.com