下载地址:
源代码标记和 build:09fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6L8%4g2J5j5$3g2Q4x3X3g2S2L8X3c8J5L8$3W2V1i4K6u0W2j5$3!0E0i4K6u0r3k6r3!0U0M7#2)9J5c8Y4y4W2N6s2g2H3i4K6u0r3M7X3g2X3k6i4u0W2L8X3y4W2i4K6u0r3j5Y4g2A6L8r3c8Q4x3X3c8F1N6h3#2T1k6i4u0K6
谷歌官方镜像:77eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0K6i4K6u0W2k6$3!0G2k6$3I4W2i4K6u0W2j5$3&6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0r3K9h3#2S2k6$3g2K6i4K6y4r3K9r3I4Q4x3@1c8*7K9q4)9J5k6r3y4F1i4K6t1K6M7X3g2V1k6X3W2F1
驱动程序二进制文件:7f3K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0K6i4K6u0W2k6$3!0G2k6$3I4W2i4K6u0W2j5$3&6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0r3k6s2u0A6N6X3g2J5M7#2)9K6c8X3S2D9i4K6y4p5P5X3S2Q4x3X3c8U0L8W2)9J5x3%4u0W2k6r3k6A6L8R3`.`.
内核分支信息:61aK9s2c8@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盘 是编译完源码和内核所用的空间
1. 更换国内源:
安装好系统后,先将Ubuntu的源更换成国内的源,如 清华源、中科大源。这样下载的速度就会很快了。
编辑源列表
1
sudo nano /etc/apt/sources.list
替换默认源
1
2
3
4
5
6
7
8
9
10
11
deb https:
deb-src https:
deb https:
deb-src https:
deb https:
deb-src https:
deb https:
deb-src https:
2. 安装依赖:
配置好源后就可以搭建源码编译的环境了。
1
2
3
4
5
sudo apt-get update
sudo 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
3. 安装Python3:
2020年1月1日起,不再支持 python2,请使用 python3。
1
sudo apt install python3.8
4. 配置个人信息:
分别替换为自己的名字和邮箱(邮箱和名字随便填)
1
2
git config --global user.name YourName
git config --global user.email you@example.com
5. 安装 Repo 工具
1
2
3
mkdir ~/bin
curl https:
chmod a+x ~/bin/repo
如果下载不下来,可以用下面的命令试试
1
2
3
4
mkdir ~/bin
PATH=~/bin:$PATH
curl -sSL
'b3eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4k6i4u0J5K9i4c8Q4x3X3c8Y4L8$3!0Y4L8r3g2K6L8%4g2J5j5$3g2Q4x3X3g2H3M7X3!0^5P5g2)9J5k6i4g2K6N6r3y4D9N6h3N6Q4x3X3g2G2M7X3N6Q4x3V1k6Y4K9i4c8Q4x3X3c8J5k6i4m8G2i4K6u0r3i4K6u0n7i4K6u0r3L8h3q4K6N6r3g2J5i4K6u0r3M7X3g2H3L8#2)9K6c8X3k6G2M7X3#2S2N6q4)9K6c8q4c8q4h3q4c8Q4x3U0M7`.
|base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
6. 创建工作目录
7. 下载 12 源码
在这里 61bK9s2c8@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)
8. 初始化 Repo
注意,repo 默认的使用的地址是 REPO_URL = 'b71K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4k6i4u0J5K9i4c8Q4x3X3g2Y4L8$3!0Y4L8r3g2K6L8%4g2J5j5$3g2Q4x3X3g2U0L8$3#2Q4x3V1k6Y4K9i4c8Q4x3X3c8J5k6i4m8G2i4K6t1%4
这里需要修改 REPO_URL,否则会出现无法下载的情况.
修改方法:打开 ~/bin/repo, 把 REPO_URL
一行替换成下面的:
1
REPO_URL =
'01fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4k6i4u0J5K9i4c8Q4x3X3c8Y4L8$3!0Y4L8r3g2K6L8%4g2J5j5$3g2Q4x3X3g2H3M7X3!0^5P5g2)9J5k6i4g2K6N6r3y4D9N6h3N6Q4x3X3g2G2M7X3N6Q4x3V1k6Y4K9i4c8Q4x3X3c8J5k6i4m8G2i4K6t1%4
9. 拉取源码:
10. 同步代码
最好是晚上同步代码,大约一个半小时就同步完成了,我在白天同步过,6个多小时都没有同步完
也可以使用下面的脚本同步。
1
2
3
4
5
6
7
8
#!/bin/bash
python3 ~/bin/repo sync -j4
while
[ $? -ne 0 ]
do
echo
"======sync failed ,re-sync again======"
sleep 3
python3 ~/bin/repo sync -j4
done
11.下载对应的驱动
驱动程序需要在这里下载 e59K9s2c8@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 驱动二进制文件 下载地址 591K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0K6i4K6u0W2k6$3!0G2k6$3I4W2i4K6u0W2j5$3&6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0r3k6s2u0A6N6X3g2J5M7#2)9K6c8X3S2D9i4K6y4p5P5X3S2Q4x3X3c8U0L8W2)9J5x3%4u0W2k6r3k6A6L8R3`.`.
下载完成后将驱动文件解压,放入aosp
文件的根目录。
下载的内容解压后,是两个 sh 文件,以 Pixel 5 为例,在代码根目录执行,用 Enter 向下翻页,直到最后手动输入 I ACCEPT.
使用Enter快速向下翻页的时候,翻到到第8的时候最好改为单点Enter,不然容易直接跳过去。
12. 编译AOSP源码
增加swap内存
如果内存不够,会在99%的时候显示编译失败
增加10G swap内存空间,不然会内存不够,如果你的硬盘空间够大,可以分配更大的内存空间。
1
dd
if
=/dev/zero of=swapfile bs=1M count=30000
mkswap创建交换文件:
swapon激活
查看
13. 编译源码
-user:代表这是编译出的系统镜像是可以用来正式发布到市场的版本,其权限是被限制的(如,没有root权限,不能dedug等)
-userdebug:在user版本的基础上开放了root权限和debug权限。
-eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),还附带了许多debug工具。
设置构建环境
选择目标设备
这里我选择 aosp_redfin-userdebug,就选 30:
开始编译
第一次编译,大约需要4个小时,最好不要修改任何代码,不然一报错就要重新开始
编译过程 编译完成
编译完成后,可以将下面的命令写成一个脚本,如12.sh,这样就不用每次输入命令了。
1
2
3
source build/envsetup.sh
lunch 30
make -j8
编译完的镜像会在/out/target/product/redfin 文件中,redfin 是设备代号,redfin 表示 Pixel 5。
13.刷机
先去e33K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0K6i4K6u0W2k6$3!0G2k6$3I4W2i4K6u0W2j5$3&6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0r3K9h3#2S2k6$3g2K6i4K6y4r3K9r3I4Q4x3@1c8*7K9q4)9J5k6r3y4F1i4K6t1K6M7X3g2V1k6X3W2F1i4@1f1@1i4@1t1^5i4K6S2n7i4@1f1^5i4@1u0p5i4@1u0p5i4@1f1#2i4@1q4r3i4@1t1&6i4@1f1#2i4@1u0m8i4K6V1@1i4@1f1^5i4@1t1H3i4@1t1%4i4@1f1$3i4@1q4p5i4K6S2o6i4@1f1#2i4@1q4q4i4K6V1^5i4@1f1$3i4K6V1$3i4@1t1&6i4@1f1&6i4K6V1#2i4K6W2o6i4@1f1#2i4K6R3K6i4K6S2r3i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1#2i4@1t1H3i4K6R3$3i4@1f1$3i4K6R3&6i4K6S2n7i4@1f1$3i4K6W2o6i4@1u0m8i4@1f1#2i4K6R3^5i4@1t1%4i4@1f1$3i4K6R3^5i4K6V1H3i4@1f1^5i4@1p5$3i4K6R3I4i4@1f1%4i4@1u0o6i4K6V1$3i4@1f1^5i4@1q4r3i4K6V1I4i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1^5i4@1t1H3i4@1t1%4i4@1f1$3i4@1q4p5i4K6S2o6i4@1f1#2i4@1q4q4i4K6V1^5i4@1f1$3i4K6V1$3i4@1t1&6i4@1f1&6i4K6V1#2i4K6W2o6i4@1f1#2i4K6R3K6i4K6S2r3i4@1f1%4i4K6R3&6i4K6R3^5i4@1f1$3i4K6W2o6i4@1q4o6i4@1f1K6i4K6R3H3i4K6R3J5
如果刷机的时候报错,只要将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 fastboot
fastboot flash product product.img
fastboot flash system_ext system_ext.img
fastboot flash vbmeta_system vbmeta_system.img
fastboot flash system system.img
fastboot reboot
如果使用上面命令刷完无法开机,可以把谷歌的官方镜像全部换成自己编译出来的镜像,再刷一次就可以了。
如果刷入使用了下面编译的内核,刷机的时候要先刷入使用源码编译出来的内核文件,再刷入系统镜像,不然可能会无法开机
14. 一些改机代码
添加抓包证书
把抓包证书放在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);
}
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();
}
method->Invoke(soa.Self(), args, arg_array->GetNumBytes(), result, shorty);
}
这个find("xxxxxxx")中的xxxxxxx根据自己的需要来填写。
内核编译
官方构建内核文档:45bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6L8%4g2J5j5$3g2Q4x3X3g2S2L8X3c8J5L8$3W2V1i4K6u0W2j5$3!0E0i4K6u0r3k6r3!0U0M7#2)9J5c8Y4y4W2N6s2g2H3i4K6u0r3j5Y4g2A6L8r3c8Q4x3V1k6T1N6h3W2D9k6r3W2F1k6#2)9J5k6s2m8A6P5r3g2D9i4K6u0V1K9$3g2J5L8X3g2D9M7#2)9K6c8X3S2D9i4K6y4p5P5X3S2Q4x3X3c8U0L8W2)9J5x3%4y4#2M7s2m8G2M7Y4c8W2k6q4)9J5k6r3E0W2M7X3&6W2L8q4)9J5k6r3u0J5j5h3&6U0K9r3g2K6
1. 查询内核分支
在cceK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6L8%4g2J5j5$3g2Q4x3X3g2S2L8X3c8J5L8$3W2V1i4K6u0W2j5$3!0E0i4K6u0r3k6r3!0U0M7#2)9J5c8Y4y4W2N6s2g2H3i4K6u0r3j5Y4g2A6L8r3c8Q4x3V1k6T1N6h3W2D9k6r3W2F1k6#2)9J5k6s2m8A6P5r3g2D9i4K6u0V1K9$3g2J5L8X3g2D9M7H3`.`. 中查看pixel5设备对应的内核分支信息。
设备
仓库分支
Pixel 5 (redfin)
android-msm-redbull-4.19-android14-qpr3
通过查找,我们知道了Pixel 5 的分支是android-msm-redbull-4.19-android14-qpr3,内核版本为 4.19。内核源码的代号是
那我么就在e82K9s2c8@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
2. 下载内核源码
确定了内核源码的具体分支后,就可以下载内核源码了。
创建工作目录
1
mkdir kernel && cd kernel
下载分支源码
更新repo,拉取内核源码
在拉却内核源码的时候,最好使用代理下载,我使用国内的源下载每次都报错 配置代理
1
2
3
4
export http_proxy=http:
export https_proxy=https:
git config --global http.proxy http:
git config --global https.proxy https:
1
mkdir kernel && cd kernel
4. 查看内核版本
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:
其中 g 后面的就是分支号
5. 切换分支
1
git checkout 5fbe36ea56f7
6. 编译内核
这里内核源码的编译步骤,参考了大佬oacia的帖子。
提取boot.img
从系统的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
地址 a0bK9s2c8@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 bootloader
fastboot flash boot boot.img
fastboot flash vendor_boot vendor_boot.img
fastboot reboot
[培训]科锐逆向工程师培训第53期2025年7月8日开班!