• 主页
  • 归档
  • 软件
所有文章 友情链接 关于我

  • 主页
  • 归档
  • 软件

twrp设备树从入门到放弃

2023-12-10

⚠️ 注意:本人非专业 Android 开发者,本文仅供参考,如有错误,欢迎指正!

本文章以适配OPPO Reno5 Pro+ 为例, OPPO Reno5 Pro+ 为 A only 设备, 支持动态分区 , 不兼容 GKI, VNDK 版本 30。

编译服务器系统: Ubuntu 20.04.4 lts

需要准备的东西

  • 可以编译 Android 的高性能 PC 或服务器(需提前预留32gb的ram和100g的设备存储空间)
  • 国际互联网连接
  • 一台root过的OPPO Reno5 Pro+

准备开始

安装编译依赖

1
sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev git

配置 repo

1
2
sudo curl https://storage.googleapis.com/git-repo-downloads/repo > /usr/bin/repo
sudo chmod a+x /usr/bin/repo

同步 TWRP 源码

1
2
3
mkdir twrp && cd twrp
repo init -u https://github.com/minimal-manifest-twrp/platform_manifest_twrp_omni -b twrp-9.0 --depth=1
repo sync

如果安卓版本为安卓10及其以上,请更换网址为:

1
repo init -u https://github.com/minimal-manifest-twrp/platform_manifest_twrp_aosp -b twrp-12.1 --depth=1

注:如果同时安转了python2.7和python3,运行repo时可能会出现以下状况:

1
2
3
4
File "/usr/bin/repo", line 51
def print(self, *args, **kwargs):
^
SyntaxError: invalid syntax

解决方法:

1
/usr/bin/python3 /usr/bin/repo sync

或修改 /usr/bin/repo

1
#!/bin/python

改成

1
#!/bin/python3

源码同步成功后会占用磁盘20g-30g的空间。

初始化编译必要文件

⚠️ 注意:下列步骤将由xxxx替代要适配的手机代号,yyyy代替手机厂商。

不管是编译 Android 还是 TWRP,这些文件都是必要的:

  • Android.mk
  • AndroidProduct.mk
  • BoardConfig.mk
  • twrp_xxxx.mk
    这几个文件可以直接从其他的twrp设备树拿,然后进行修改。

Android.mk、AndroidProduct.mk、twrp_xxxx.mk 一般情况下无需进行修改

编译 TWRP 需要对 BoardConfig.mk 等文件进行修改

修改 BoardConfig.mk

1
DEVICE_PATH := device/yyyy/xxxx

此处定义了设备树的位置。

1
ALLOW_MISSING_DEPENDENCIES := true

由于同步的只有 TWRP 源码,编译时需要打开这个。

1
2
BUILD_BROKEN_DUP_RULES := true
BUILD_BROKEN_ELF_PREBUILT_PRODUCT_COPY_FILES := true

这两个选项可能会解决一些编译错误。当有两个或更多的条目试图将文件复制到相同的目标位置时。这个标志的作用是允许覆盖先前定义的目标命令,而不是报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Architecture
TARGET_ARCH := arm64
TARGET_ARCH_VARIANT := armv8-a
TARGET_CPU_ABI := arm64-v8a
TARGET_CPU_ABI2 :=
TARGET_CPU_VARIANT := generic
TARGET_CPU_VARIANT_RUNTIME := kryo385

TARGET_2ND_ARCH := arm
TARGET_2ND_ARCH_VARIANT := armv8-a
TARGET_2ND_CPU_ABI := armeabi-v7a
TARGET_2ND_CPU_ABI2 := armeabi
TARGET_2ND_CPU_VARIANT := generic
TARGET_2ND_CPU_VARIANT_RUNTIME := kryo385

这里定义要适配的机型的cpu的一些信息。

1
2
TARGET_BOARD_SUFFIX := _64
TARGET_USES_64_BIT_BINDER := true

如果适配的安卓设备的soc是64位soc,且系统也是64位,请启用它。

1
TARGET_OTA_ASSERT_DEVICE := xxxx

此处定义了设备ota时候的机型代号,ota机型检查的时候会检查是否匹配。

1
2
3
4
5
# Bootloader
PRODUCT_PLATFORM := kona
TARGET_BOOTLOADER_BOARD_NAME := kona
TARGET_NO_BOOTLOADER := true
TARGET_USES_UEFI := true

此处定义了bootloader的一些信息。

1
2
BOARD_USES_MTK_HARDWARE := true
BOARD_HAS_MTK_HARDWARE := true

这两个选项仅适用于mtk芯片组。

1
2
# Platform
TARGET_BOARD_PLATFORM := sm8250

此处定义了cpu的代号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# BOARD_BOOTIMG_HEADER_VERSION := 2
# BOARD_KERNEL_BASE := 0x40078000
# BOARD_KERNEL_CMDLINE := ttyMSM0,115200n8 earlycon=msm_geni_serial,0xa90000 androidboot.hardware=qcom androidboot.console=ttyMSM0 androidboot.memcg=1 lpm_levels.sleep_disabled=1 video=vfb:640x400,bpp=32,memsize=3072000 msm_rtb.filter=0x237 service_locator.enable=1 androidboot.usbcontroller=a600000.dwc3 swiotlb=2048 loop.max_part=7 cgroup.memory=nokmem,nosocket reboot=panic_warm kpti=off buildvariant=user
# BOARD_KERNEL_PAGESIZE := 2048
# BOARD_RAMDISK_OFFSET := 0x11088000
# BOARD_KERNEL_TAGS_OFFSET := 0x07c08000
# BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
# BOARD_MKBOOTIMG_ARGS += --ramdisk_offset $(BOARD_RAMDISK_OFFSET)
# BOARD_MKBOOTIMG_ARGS += --tags_offset $(BOARD_KERNEL_TAGS_OFFSET)
# BOARD_KERNEL_IMAGE_NAME := Image
# BOARD_INCLUDE_DTB_IN_BOOTIMG := true
# BOARD_KERNEL_SEPARATED_DTBO := true
# TARGET_KERNEL_CONFIG := xxxx_defconfig
# TARGET_KERNEL_SOURCE := device/yyyy/xxxx

使用源码编译才使用此部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
BOARD_KERNEL_CMDLINE := ttyMSM0,115200n8 earlycon=msm_geni_serial,0xa90000 androidboot.hardware=qcom androidboot.console=ttyMSM0 androidboot.memcg=1 lpm_levels.sleep_disabled=1 video=vfb:640x400,bpp=32,memsize=3072000 msm_rtb.filter=0x237 service_locator.enable=1 androidboot.usbcontroller=a600000.dwc3 swiotlb=2048 loop.max_part=7 cgroup.memory=nokmem,nosocket reboot=panic_warm kpti=off buildvariant=user
TARGET_PREBUILT_KERNEL := $(DEVICE_PATH)/prebuilt/kernel
TARGET_PREBUILT_DTB := $(DEVICE_PATH)/prebuilt/dtb.img
BOARD_PREBUILT_DTBOIMAGE := $(DEVICE_PATH)/prebuilt/dtbo.img
BOARD_INCLUDE_RECOVERY_DTBO := true
BOARD_BOOTIMG_HEADER_VERSION := 2
BOARD_RAMDISK_OFFSET := 0x11088000
BOARD_KERNEL_BASE := 0x40078000
BOARD_KERNEL_TAGS_OFFSET := 0x07c08000
BOARD_KERNEL_PAGESIZE := 2048
BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
BOARD_MKBOOTIMG_ARGS += --ramdisk_offset $(BOARD_RAMDISK_OFFSET)
BOARD_MKBOOTIMG_ARGS += --tags_offset $(BOARD_KERNEL_TAGS_OFFSET)
BOARD_MKBOOTIMG_ARGS += --dtb $(TARGET_PREBUILT_DTB)
BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
BOARD_KERNEL_IMAGE_NAME := kernel

使用预编译内核。你需要提取手机的boot.img并使用Android Image Kitchen来获取预编译内核,dtb和dtbo(如果有)以及cmdline。

然后替换cmdline。

再将预编译内核放入引用的路径。这里引用的路径是$(DEVICE_PATH)/prebuilt/

1
2
3
4
5
6
7
8
9
10
11
# Android Verified Boot
BOARD_AVB_ENABLE := true
BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS += --set_hashtree_disabled_flag
BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS += --flags 2
BOARD_AVB_RECOVERY_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_RECOVERY_ALGORITHM := SHA256_RSA4096
BOARD_AVB_RECOVERY_ROLLBACK_INDEX := 1
BOARD_AVB_RECOVERY_ROLLBACK_INDEX_LOCATION := 1
BOARD_AVB_VBMETA_SYSTEM := product system
BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 1

此处定义了avb的一些信息。

1
2
# Metadata
BOARD_USES_METADATA_PARTITION := true

在twrp中使用metadata分区。

1
2
# Hack: prevent anti rollback
PLATFORM_SECURITY_PATCH := 2127-12-31

加入补丁更新日期来回避防回滚机制。

1
2
3
4
# Partitions
BOARD_FLASH_BLOCK_SIZE := 262144
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 134217728
BOARD_BOOTIMAGE_PARTITION_SIZE := 167772160

此处定义了boot分区和recovery分区的大小,以及块大小。修改分区大小时要注意单位是b而不是kb。

1
2
3
4
5
# Dynamic Partition
BOARD_SUPER_PARTITION_SIZE := 10200547328
BOARD_SUPER_PARTITION_GROUPS := qti_dynamic_partitions
BOARD_QTI_DYNAMIC_PARTITIONS_SIZE := 10200547328
BOARD_QTI_DYNAMIC_PARTITIONS_PARTITION_LIST := system system_ext product vendor odm

此处定义了动态分区的信息。可按需修改。

1
2
3
4
5
6
7
8
# File systems
BOARD_HAS_LARGE_FILESYSTEM := true
BOARD_SYSTEMIMAGE_PARTITION_TYPE := ext4
BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE := f2fs
BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_USERIMAGES_USE_EXT4 := true
TARGET_USERIMAGES_USE_F2FS := true
TARGET_COPY_OUT_VENDOR := vendor

此处依次定义了system,vendor和data分区的文件系统,以及vendor分区的相对路径。

1
2
# Fstab
TARGET_RECOVERY_FSTAB := $(DEVICE_PATH)/recovery/root/system/etc/recovery.fstab

此处定义了fstab的位置。可提取recovery中的ramdisk.cpio中的进行使用。

1
2
3
4
5
6
7
8
9
10
11
# TWRP Configuration
TW_THEME := portrait_hdpi
TW_BRIGHTNESS_PATH := "/sys/devices/soc/c900000.qcom\x2cmdss_mdp/c900000.qcom\x2cmdss_mdp:qcom\x2cmdss_fb_primary/leds/lcd-backlight/brightness"
TW_MAX_BRIGHTNESS := 255
TW_DEFAULT_BRIGHTNESS := 155
TW_EXTRA_LANGUAGES := ture
TW_IGNORE_MISC_WIPE_DATA := true
TW_SCREEN_BLANK_ON_BOOT := true
TW_NO_EXFAT_FUSE := true
TW_INCLUDE_CRYPTO := true
TARGET_CRYPTFS_HW_PATH := vendor/qcom/opensource/commonsys/cryptfs_hw

此处依次定义了twrp要使用的主题,亮度调节的内核节点,亮度调节,添加亚洲语言, 是否在 wipe data 时忽略 misc,是否添加加密,解密所需依赖源码路径等信息。

注:亮度调节的内核节点语言根据本机的位置进行修改。

1
2
3
TW_USE_TOOLBOX := true 
TWRP_INCLUDE_LOGCAT := true
TARGET_USES_LOGD := true

此处定义了twrp是否启用调试功能,例如toolbox,logcat等。

1
2
3
4
# Include some binaries
TW_INCLUDE_LIBRESETPROP := true
TW_INCLUDE_RESETPROP := true
TW_INCLUDE_REPACKTOOLS := true

此处定义twrp编译时引用的第三方库。

1
TARGET_USES_MKE2FS := true

此处添加了mke2fs,可将分区格式化成f2fs。

1
TW_DEFAULT_LANGUAGE := zh_CN

此处设置了启动twrp时的默认语言为中文。

1
TW_OZIP_DECRYPT_KEY := 0000

此处定义了刷入ozip时解密ozip的秘钥。

1
2
3
AB_OTA_UPDATER := true
BOARD_USES_RECOVERY_AS_BOOT := true
BOARD_BUILD_SYSTEM_ROOT_IMAGE := true

如果是 A/B 分区的话还得加入这些。

修改 device.mk

1
LOCAL_PATH := device/yyyy/xxxx

定义local_path变量,一般有这一行就够了。

1
PRODUCT_USE_DYNAMIC_PARTITIONS := true

是否启用动态分区。如果设备是动态分区就启用。

1
2
3
4
# Crypto
PRODUCT_PACKAGES += \
qcom_decrypt \
qcom_decrypt_fbe

此处添加解密所需依赖。

1
2
3
# Soong namespaces
PRODUCT_SOONG_NAMESPACES += \
$(LOCAL_PATH)

此处定义Soong namespaces的路径。

注:下述内容需要设备为A/B分区。

1
AB_OTA_UPDATER := true

此处定义了是否启用A/B支持。

1
2
3
4
AB_OTA_PARTITIONS += \
boot \
system \
vendor

此处定义了使用 A/B 特性的分

1
2
3
4
5
AB_OTA_POSTINSTALL_CONFIG += \ 
RUN_POSTINSTALL_system=true \
POSTINSTALL_PATH_system=system/bin/otapreopt_script \
FILESYSTEM_TYPE_system=ext4 \
POSTINSTALL_OPTIONAL_system=true

此处定义了A/B分区ota的一些选项。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PRODUCT_PACKAGES += \
otapreopt_script \
cppreopts.sh \
update_engine \
update_verifier \
update_engine_sideload

# Boot control
PRODUCT_PACKAGES += \
android.hardware.boot@1.0-impl \
android.hardware.boot@1.0-service \
bootctrl.sm8250 \

PRODUCT_PACKAGES_DEBUG += \
bootctl

PRODUCT_STATIC_BOOT_CONTROL_HAL := \
bootctrl.sm8250 \
libcutils \
libgptutils \
libz

此处定义了需要引用的包。

修改完成后,在 twrp_xxxx.mk 里调用

1
$(call inherit-product, device/yyyy/xxxx/device.mk)

配置 TWRP 分区表

可以从本机recovery里提取一份recovery.fstab并放在之前引用的位置。我这里引用的是recovery/root/system/etc/recovery fastb

然后新建文件twrp.flags并放在与recovery.fastb相同的路径。

twrp.flags文件示例:

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
29
# mount point   fstype     device                                   device2                       flags
# 定义挂载点 定义文件系统类型 定义挂载原块文件路径 定义一些特性
# Other partitions
/boot emmc /dev/block/bootdevice/by-name/boot flags=backup=1;display="Boot";flashimg=1
/recovery emmc /dev/block/bootdevice/by-name/recovery flags=backup=1;display="Recovery";flashimg=1
/dtbo emmc /dev/block/bootdevice/by-name/dtbo flags=backup=1;display="Dtbo";flashimg=1
/cache ext4 /dev/block/bootdevice/by-name/cache flags=backup=1;display="Cache";wipeingui
/metadata ext4 /dev/block/bootdevice/by-name/metadata flags=display="Metadata";wrappedkey
/data f2fs /dev/block/bootdevice/by-name/userdata flags=fileencryption=aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized+wrappedkey_v0,metadata_encryption=aes-256-xts:wrappedkey_v0,keydirectory=/metadata/vold/metadata_encryption

# System
/system ext4 /dev/block/bootdevice/by-name/system flags=slotselect;display="System";backup=1;wipeingui
/system_image emmc /dev/block/bootdevice/by-name/system flags=slotselect;flashimg=1
/vendor ext4 /dev/block/bootdevice/by-name/vendor flags=slotselect;display="Vendor";backup=1;wipeingui
/vendor_image emmc /dev/block/bootdevice/by-name/vendor flags=slotselect;flashimg=1
/product ext4 /dev/block/bootdevice/by-name/product flags=slotselect;display="Product";backup=1
/product_image emmc /dev/block/bootdevice/by-name/product flags=slotselect;flashimg=1
/odm ext4 /dev/block/bootdevice/by-name/odm display="ODM";logical
/odm_image emmc /dev/block/bootdevice/by-name/odm flags=display="ODM";flashimg;backup=1
/system_ext ext4 /dev/block/bootdevice/by-name/system_ext logical
/system_ext_image emmc /dev/block/bootdevice/by-name/system_ext flags=slotselect;flashimg=1

/system erofs /dev/block/bootdevice/by-name/system display="system";logical
/vendor erofs /dev/block/bootdevice/by-name/vendor display="Vendor";logical
/product erofs /dev/block/bootdevice/by-name/product display="Product";logical
/odm erofs /dev/block/bootdevice/by-name/odm display="ODM";logical
/system_ext erofs /dev/block/bootdevice/by-name/system_ext display="system_ext";logical

/usbstorage vfat /dev/block/sdg1

关于 flags:

  • 如果是 A/B 设备,请给使用 A/B 特性的分区定义 slotselect
  • 用 backup 来定义可备份分区
  • display 用来自定义分区名
  • encryptable 来定义加密类型
  • removable 用来定义可否热拔插

如果是A/B分区,还需要添加recovery.wipe:

1
2
3
4
5
6
7
8
9
10
# All the partitions to be wiped (in order) under recovery.
/dev/block/bootdevice/by-name/system_a
/dev/block/bootdevice/by-name/system_b
/dev/block/bootdevice/by-name/vendor_a
/dev/block/bootdevice/by-name/vendor_b
/dev/block/bootdevice/by-name/userdata
# Wipe the boot partitions last so that all partitions will be wiped
# correctly even if the wiping process gets interrupted by a force boot.
/dev/block/bootdevice/by-name/boot_a
/dev/block/bootdevice/by-name/boot_b

init.rc

不同机型,init 部分也不一样

可以复制recovery.img里面的

bootctrl 和 gpt-utils

如果你的设备采用 A/B 分区,那必须编译这两个组件

确保 tree 里面有编译 bootctrl 和 gpt-utils

这两个东西可以从其它机型的 tree 里面拿,通用的

开始编译

上面的东西都配置好后就可以开始编译了

1
2
3
4
cd twrp
. build/envsetup.sh
lunch twrp_xxxx-eng
mka bootimage

如果设备不是 A/B 分区

1
mka recoveryimage

制作卡刷包

需要再BoardConfig.mk加入

1
2
USE_RECOVERY_INSTALLER := true
RECOVERY_INSTALLER_PATH := device/yyyy/xxxx/installer

新建以下目录:

1
2
3
4
5
installer
installer/META-INF/
installer/META-INF/com
installer/META-INF/com/google
installer/META-INF/com/google/android/

添加magiskboot到installer目录

添加update-binary到installer/META-INF/com/google/android/目录:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/sbin/sh

tmp=/tmp/twrp-install

if [ "$3" ]; then
zip=$3
console=/proc/$$/fd/$2
# write the location of the console buffer to /tmp/console for other scripts to use
echo "$console" > /tmp/console
else
console=$(cat /tmp/console)
[ "$console" ] || console=/proc/$$/fd/1
fi

print() {
if [ "$1" ]; then
echo "ui_print $1" > "$console"
else
echo "ui_print " > "$console"
fi
echo
}

abort() {
[ "$1" ] && {
print "Error: $1"
print "Aborting..."
}
cleanup
print "Failed to patch boot image!"
exit 1
}

cleanup() {
[ "$zip" ] && rm /tmp/console
}

extract() {
rm -rf "$2"
mkdir -p "$2"
unzip -o "$1" -d "$2" || abort "Failed to extract zip to $2!"
}

print "#########################################"
print "# TWRP installer #"
print "#########################################"

# Unpack the installer
[ "$zip" ] && {
print "Unpacking the installer..."
extract "$zip" "$tmp"
}
cd "$tmp"
toolname="/magiskboot"
tool="$tmp$toolname"
targetfile="/boot.img"
target="$tmp$targetfile"

chmod 755 "$tool"

print "Running boot image patcher on slot A..."
dd if=/dev/block/bootdevice/by-name/boot_a "of=$target"
"$tool" --unpack boot.img
cp -f ramdisk-recovery.cpio ramdisk.cpio
"$tool" --repack boot.img
dd if=new-boot.img of=/dev/block/bootdevice/by-name/boot_a
rm boot.img
rm dtb
rm kernel
rm new-boot.img
rm ramdisk.cpio
print "Running boot image patcher on slot B..."
dd if=/dev/block/bootdevice/by-name/boot_b "of=$target"
"$tool" --unpack boot.img
cp -f ramdisk-recovery.cpio ramdisk.cpio
"$tool" --repack boot.img
dd if=new-boot.img of=/dev/block/bootdevice/by-name/boot_b

print "Boot image patching complete"

#cleanup
print "Done installing TWRP!"

注:A/B分区可能需要准备installer/META-INF/MANIFEST.MF,installer/META-INF/CERT.SF,installer/META-INF/CERT.RSA



-------------本文结束感谢您的阅读-------------



  • linux
  • android
  • twrp
  • build

扫一扫,分享到微信

微信分享二维码
Android boot.img 文件的解包、修改与重打包小记
3DS折腾linux小记
  1. 1. ⚠️ 注意:本人非专业 Android 开发者,本文仅供参考,如有错误,欢迎指正!
    1. 1.1. 需要准备的东西
    2. 1.2. 准备开始
      1. 1.2.1. 安装编译依赖
    3. 1.3. 配置 repo
    4. 1.4. 同步 TWRP 源码
    5. 1.5. 初始化编译必要文件
    6. 1.6. 修改 BoardConfig.mk
    7. 1.7. 修改 device.mk
    8. 1.8. 配置 TWRP 分区表
    9. 1.9. init.rc
    10. 1.10. bootctrl 和 gpt-utils
    11. 1.11. 开始编译
    12. 1.12. 制作卡刷包

预览:

0  字
2 评论
  • Latest
  • Oldest
  • Hottest
好2024-09-08
Firefox129.0Android 13

需要那么高配的服务器吗,俺没有

河中影2024-05-02
旁遮普Edge118.0Windows 11

谢谢你的教程 看不懂 但是很厉害

Powered by Waline v2.15.8
© 2025 dpkg123
本站已苟活 2 年 84 天 0 小时 12 分钟 56 秒
Hexo Theme Yilia by Litten
萌ICP备20231955号
  • 所有文章
  • 友情链接
  • 关于我

tag:

  • 3DS
  • linux
  • buildroot
  • kernel
  • makefile
  • android
  • OPPO
  • dtc
  • dtb
  • miui
  • coloros
  • 手机
  • shell
  • 刷机工具
  • 二次元
  • 9008
  • 刷机
  • PostmarketOS
  • ROM移植
  • debian
  • Android
  • Root
  • Github
  • CI
  • Linux
  • hexo
  • github
  • 网页加速
  • 虚拟化 Android
  • 内核
  • 编译
  • 哔哩哔哩
  • av10492
  • 猎奇
  • 归档
  • 番剧
  • 别当欧尼酱了
  • twrp
  • build
  • 速通
  • 教程
  • 奇技淫巧
  • TypeScript
  • Github Actions
  • 杂谈
  • 网页搭建
  • android kernel
  • gki
  • 联发科
  • KernelSU
  • kvm
  • vps
  • fastboot
  • alpine
  • 软件源
  • kernelSU
  • 移植
  • 内核编译
  • Kernel
  • web前端

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 内核编译排错

    2025-06-25

    #Android#内核#编译

  • 关于高通gunyah虚拟化的一些研究

    2025-03-03

    #虚拟化 Android

  • 安卓内核编译速通

    2025-02-13

    #Android#内核#编译#速通#教程#奇技淫巧

  • 使用github工作流全自动构建postmarketos刷机包

    2025-02-13

    #手机#刷机#Android#Root#Github#CI#Linux

  • PostmarketOS移植常见问题

    2024-08-12

    #linux#android#刷机#PostmarketOS#ROM移植

  • 本地搭建第三方alpine repo

    2024-03-22

    #linux#alpine#软件源

  • 折腾ts action遇到的其中一个问题

    2024-02-11

    #TypeScript#Github Actions

  • dtc编译教程

    2024-01-29

    #linux#android#dtc#dtb

  • OPPO Reno6 ColorOS13.1内核源码编译记录

    2024-01-15

    #kernel#android#OPPO

  • Android boot.img 文件的解包、修改与重打包小记

    2023-12-24

    #linux#android

  • twrp设备树从入门到放弃

    2023-12-10

    #linux#android#twrp#build

  • 3DS折腾linux小记

    2023-10-06

    #3DS#linux#buildroot#kernel

  • 暂停更新博客通知

    2023-08-08

    #杂谈

  • Makefile入门

    2023-08-04

    #linux#makefile

  • linux电脑给手机进行9008刷机

    2023-07-28

    #linux#9008#刷机

  • 浅谈安卓内核的碎片化

    2023-07-19

    #kernel#android#android kernel#gki

  • 哔哩哔哩危险地带部分补档

    2023-06-28

    #哔哩哔哩#av10492#猎奇

  • 使用dh_make快速构建deb

    2023-06-22

    #linux#debian

  • linux解压payload.bin和转换system.new.dat.br

    2023-06-18

    #linux#android#刷机

  • 浅谈联发科设备玩机的可能性

    2023-05-15

    #刷机#联发科#KernelSU#kvm

  • 给OPPO Reno6移植kernelSU

    2023-05-10

    #linux#kernelSU#移植#内核编译#Kernel

  • 别当欧尼酱了12集归档

    2023-05-02

    #归档#番剧#别当欧尼酱了

  • 珍爱生命,远离小众云

    2023-05-01

    #vps

  • fdt转dtb

    2023-04-30

    #android#dtb

  • coloros和miui

    2023-04-30

    #android#miui#coloros#手机

  • linux刷机工具箱

    2023-04-29

    #linux#shell#刷机工具

  • 简单写一个shell刷机脚本之进阶篇

    2023-04-29

    #linux#shell#刷机#fastboot

  • 简单写一个shell刷机脚本

    2023-04-29

    #linux#shell#刷机

  • linux娘

    2023-04-12

    #linux#二次元

  • 使用netlify加快博客访问速度

    2023-04-12

    #hexo#github#网页加速

  • hexo博客源码备份

    2023-04-10

    #hexo#github#web前端

  • 新博客

    2023-04-10

    #hexo#网页搭建

  • Hello World

    1970-01-01

  • note现在暂不考虑申请新的友链
  • 图床
  • 留言板
  • 原来的博客
  • Adminzhangの个人博客
  • cyp0633的blog
  • 小码同学
  • U.M.R-Powered-Blog
  • 秋澪Akimio
  • ialtone的小站
  • PiCpo的阁楼
  • artiga033
  • 柏园猫のBlog
  • 欠陥電気の摸鱼小池
  • 洛仙璃の幻梦
  • 木屐落在水洼了
  • 湛蓝的调色板
  • SakuraKooi的Blog
  • 新世界的大门
  • 沨鸾的小窝
  • Revincx
  • JIPA233の小窝
  • Mufanc
  • Fika
  • Pinpe的物语
  • 残夜的小博客
透明小菜鸡一枚<br><br>目前正在学习C++和C<br>正在移植postmarketOS到k30pro上<br>本博客使用github-page作为网页托管平台,netlify提供cdn加速服务。<br>不知道为啥yilia主题改不了下面的文字。<br>总之欢迎来到这里!