前言
- 最近尝试给谷歌nexus 5编译HavocOS (android 11分支),折腾一大堆后终于生成了zip刷机包,结果死活刷不进去,卡在"E1001: Failed to update system image",原因推测是:system分区太小,因为编译时报错提示system镜像过小,所以在编译配置文件中BoardConfig.mk调整过system分区的大小,修改后才编译打包成功。
- 显然只改BoardConfig.mk,只是能正常编译打包,但是手机(物理)上的system分区还是那么大,太大刷不进去
- 为了验证是否是system分区太小缘故,因为编译还生成了system.img的中间文件,这个img是可以用fastboot刷入的,手机usb连接到电脑,进入bootloader模式,运行
fastboot system system.img
,不出意外失败了,而且报错信息为:"remote: 'size too large'",这就验证了是手机/system分区不够大的原因。所以问题就变为了怎么扩增system分区? - 经过网上查找相关教程,最终按这个问题里的答案:https://android.stackexchange.com/questions/216123/android-how-to-increase-system-partition-and-decrease-data-partition尝试成功
准备阶段
- 需要手机解锁bootloader并刷入twrp recovery
- 下载gdisk等工具parted_gdisk_fdisk_mkfs.ext4-ARM.zip,parted_gdisk_fdisk_mkfs.ext4-AARCH64.zip(根据手机CPU架构选择,一般多为arm)
- PC需要先安装好adb
- 如果手机上有重要数据请先备份
- 操作有风险,请谨慎操作,请自行承担风险
开始
手机进入recovery模式
下载解压gdisk,电脑usb连接手机,adb push将gdisk传至手机
1
2adb push gdisk /sbin/
adb push mkfs.ext4 /sbin/运行
1
adb shell
1
2给 gdisk mkfs.ext4赋予可执行权限
chmod +x /sbin/*twrp中选择挂载/system分区,终端运行
df -h
可以看到system分区对应的区块为"/dev/block/platform/msm_sdcc.1/by-name/system",userdata分区对应的区块为"/dev/block/platform/msm_sdcc.1/by-name/userdata",但这个by-name说明是软连接,我们需要获得它真实的区块位置,运行
ls -lah /dev/block/platform/msm_sdcc.1/by-name/system
和ls -lah /dev/block/platform/msm_sdcc.1/by-name/userdata
即可获得可以看到/system分区对应的为"/dev/block/mmcblk0p25",/data分区对应的为"/dev/block/mmcblk0p28",记下这两个值,后面需要使用,不同手机这两个可能跟本文不一样,要以实际情况为准
运行
gdisk /dev/block/mmcblk0
,注意这里没有"p25","p28","p*"输入help可以查看帮助
这里因为要扩增system分区,所以最好的办法是从减小userdata分区的大小来实现
直接调整已有分区大小(增加或者减小),需要下载工具里parted命令(使用方法最开始的链接有,这里没有使用parted,因为使用parted比较繁琐),这里不打算直接调整userdata分区大小,而是将userdata分区和system分区都删除掉,再重新分区
gdisk删除分区
先输入
d
,回车后输入需要删除的分区这里需要删除的为system(25)和userdata(28),这两个数值即为mmcblk0p25和mmcblk0p28里的数字删除后新建分区,输入
n
,然后输入原system分区数字,接着会提示选择分区起始扇区位置,回车默认即可,接着会提示选择分区终止扇区位置,这里选择**"+2G"**,表示分配2GB空间,之后回车默认即可再输入
n
,输入原userdata分区数字,接着会提示选择分区起始扇区位置,回车默认即可,接着会提示选择分区终止扇区位置,这里可以直接回车使用默认即可(这里不使用+*G的原因是,让剩余未分配空间都尽可能利用),然后一路回车即可接下来输入
c
,来重命名新增加的两个分区,选择原system分区的数字,输入名字system,同样的将另一个分区命名为userdata输入
p
,查看所有分区信息,检查分区大小和分区名称是否正确,如下图可以看到25对应分区大小为2GB名称为system,28对应的分区大小为25.2GB名称为userdata,说明修改没有问题接着保存分区的改动,输入:w,按提示选择y即可
最后格式化system分区和userdata分区为ext4
1
2
3
4将mmc0blk0p25修改为实际system分区所在分块
mkfs.ext4 /dev/block/mmc0blk0p25
将mmc0blk0p25修改为实际userdata分区所在分块
mkfs.ext4 /dev/block/mmc0blk0p28至此/system分区大小调整完毕,可以用twrp正常刷入编译的rom包了