安卓手机安装双系统教程

教你你如何在安卓手机上安装双系统,本教程需要你对刷机有一定的了解。

准备工作

  • 一台已获取 root 权限了的安卓手机,本教程使用的是中兴的 N958st
  • 对应机型 rom 包一个
  • 安卓内核解包工具
  • adb 调试工具
  • linux 环境 (可选),我使用的是 ubuntu16.04

手机分区

连接 adb

手机重启至 Recovery 模式, 连接电脑。 电脑上打开命令行, 输入 sudo adb shell ,此时进入到手机的 shell。

使用 parted 工具对手机重新分区

我们要在手机上安装双系统,那么问题来了,第二个系统装在哪儿呢?

这就得牺牲我们手机的用户储存空间了,利用分区工具将内置储存分一块出来放置我们的第二个系统。如果不想分割手机的内置储存并且你的外置储存足够快的话,也可以将第二系统安装在外置 sd 卡上。

在分区之前,请注意将内置 sd 卡内的文件做好备份,重新分区会导致文件丢失

ok, 我们开始分区,命令行里输入如下命令

1
sudo parted /dev/block/mmcblk0

进入 parted 的交互环境,输入 m,打印出分区表,我们来看看目前的分区状态

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
GNU Parted 3.2
使用 /dev/block/mmcblk0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: MMC HAG2e (sd/mmc)
Disk /dev/block/mmcblk0: 15.8GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1 17.4kB 67.1MB 67.1MB fat16 modem msftdata
2 67.1MB 67.7MB 524kB sbl1
3 67.7MB 68.2MB 524kB sbl1bak msftdata
4 134MB 134MB 32.8kB DDR
5 201MB 202MB 1049kB aboot
6 202MB 203MB 1049kB abootbak msftdata
7 203MB 204MB 524kB rpm
8 204MB 204MB 524kB rpmbak msftdata
9 204MB 217MB 12.6MB boot
10 217MB 218MB 524kB tz
11 218MB 218MB 524kB tzbak msftdata
12 218MB 219MB 524kB hyp
13 219MB 219MB 524kB hypbak msftdata
14 219MB 219MB 16.4kB sec
15 219MB 220MB 1049kB pad msftdata
16 220MB 222MB 1573kB modemst1
17 222MB 223MB 1573kB modemst2
18 223MB 224MB 1049kB misc
19 224MB 226MB 1573kB fsg
20 226MB 226MB 1024B fsc
21 226MB 226MB 8192B ssd
22 226MB 239MB 12.6MB recovery
23 239MB 247MB 8389kB ext4 persist msftdata
24 247MB 1296MB 1049MB ext4 system msftdata
25 1296MB 1430MB 134MB ext4 cache msftdata
26 1430MB 1456MB 26.2MB customfs msftdata
27 1456MB 1466MB 10.5MB splash
28 1466MB 8634MB 7168MB ext4 userdata msftdata
29 8634MB 10.7GB 2048MB fat32 grow msftres
30 10.7GB 11.7GB 1049MB ext4 system2 msftdata
31 11.7GB 15.8GB 4031MB ext4 data2 msftdata
(parted)

注意这里的第 29 分区,也就是 grow 分区,这就是需要我们操作的分区,它原来的大小是 7128MB,我把它缩小到了 2048MB。把空出来的空间分了两个区,取名为 system2 和 data2。可以根据自己的情况选择合适的大小。由于我平时要安装很多的软件,所以把两个系统的 data 分区都分得很大。

然后将这两个分区都格式化为 ext4 文件系统。

处理第二个 rom 包

分区弄好了,接下来我们要解决的就是如何将第二系统刷入手机。

解包 boot.img

将准备好的 rom 包 解压。这里就需要用到我们的内核解包工具啦。

我是用的是很久以前在国外的 Xda 论坛上下载的一个工具 mkbootimg_tools, 使用方法非常简单,而且可以直接在手机端进行解包。

进入工具目录,将需要解包的 boot.img 放入此目录内

解包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
./mkboot boot.img boot
Unpack & decompress boot.img to boot
kernel : zImage
ramdisk : ramdisk
page size : 2048
kernel size : 7571904
ramdisk size : 1190483
dtb size : 167936
base : 0x80000000
kernel offset : 0x00008000
ramdisk offset : 0x02000000
second_offset : 0x00f00000
tags offset : 0x01e00000
dtb img : dt.img
cmd line : console=null androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3 androidboot.bootdevice=7824900.sdhci androidboot.selinux=permissive
ramdisk is gzip format.
Unpack completed.

这样,就将内核解包到了 boot 目录内

修改 fstab

1
cd ./boot/ramdisk

我们需要修改的是 fstab.qcom 文件, 这个文件相当于 linux 的 /etc/fstab 文件。用文本编辑器编辑这个文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Android fstab file.
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
#TODO: Add 'check' as fs_mgr_flags with data partition.
# Currently we dont have e2fsck compiled. So fs check would failed.
#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
/dev/block/bootdevice/by-name/system /system ext4 ro,barrier=1,discard wait
/dev/block/bootdevice/by-name/userdata /data ext4 nosuid,nodev,barrier=1,noauto_da_alloc,discard wait,check,encryptable=footer
/dev/block/bootdevice/by-name/cache /cache ext4 nosuid,nodev,barrier=1 wait
/dev/block/bootdevice/by-name/persist /persist ext4 nosuid,nodev,barrier=1 wait
/dev/block/bootdevice/by-name/modem /firmware vfat ro,shortname=lower,uid=1000,gid=1000,dmask=227,fmask=337,context=u:object_r:firmware_file:s0 wait
/dev/block/bootdevice/by-name/boot /boot emmc defaults recoveryonly
/dev/block/bootdevice/by-name/recovery /recovery emmc defaults recoveryonly
/dev/block/bootdevice/by-name/misc /misc emmc defaults recoveryonly
/devices/soc.0/7824900.sdhci/mmc_host* auto auto defaults voldmanaged=sdcard0:29,nonremovable,noemulatedsd
/devices/soc.0/7864900.sdhci/mmc_host* auto auto defaults voldmanaged=sdcard1:auto
/devices/platform/msm_hsusb_host/usb1* auto auto defaults voldmanaged=usbdisk:auto

/dev/block/bootdevice/by-name/system 修改为 /dev/block/bootdevice/by-name/system2

/dev/block/bootdevice/by-name/userdata 修改为 /dev/block/bootdevice/by-name/data2

这样就可以将刚才分的区挂载到系统的 /system 和 /data 目录

重新打包内核

修改并保存 fstab.qcom 文件之后,就可以讲内核重新打包回去了。

打包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
./mkboot boot boot_new.img
mkbootimg from boot/img_info.
kernel : zImage
ramdisk : new_ramdisk.gz
page size : 2048
kernel size : 7571904
ramdisk size : 1190483
dtb size : 167936
base : 0x80000000
kernel offset : 0x00008000
ramdisk offset : 0x02000000
tags offset : 0x01e00000
dtb img : dt.img
cmd line : console=null androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3 androidboot.bootdevice=7824900.sdhci androidboot.selinux=permissive
Kernel size: 7571904, new ramdisk size: 1190483, boot_new.img: 8935424.
boot_new.img has been created.
...

这样就把内核重新打包成了 boot_new.img

boot_new.img 替换进 rom 包 中的 boot.img

修改刷机脚本

最后一步,需要将 rom 包 的刷机脚本稍作修改,让它刷入进第二系统分区。

计入 rom 包 目录,刷机脚本是位于 /META-INF/com/google/android 目录下的 updater-script 文件。它控制刷机的流程。

编辑这个文件

1
2
3
4
5
6
7
8
9
10
11
12
13
ui_print("*************************");
ui_print("*^.^ Welcome Flyme5 ^.^*");
ui_print("* ZTE N958St *");
ui_print("* Please wait 8 minutes *");
ui_print("* weibo.com/haohao3344 *");
ui_print("*************************");
show_progress(0.750000, 0);
format("ext4", "EMMC", "/dev/block/bootdevice/by-name/system", "0", "/system");
mount("ext4", "EMMC", "/dev/block/bootdevice/by-name/system", "/system", "");
package_extract_dir("recovery", "/system");
package_extract_dir("system", "/system");
以下省略...

我们需要修改的的就是 format 语句和 mount 语句

format("ext4", "EMMC", "/dev/block/bootdevice/by-name/system", "0", "/system"); 修改为 format("ext4", "EMMC", "/dev/block/bootdevice/by-name/system2", "0", "/system");

mount("ext4", "EMMC", "/dev/block/bootdevice/by-name/system", "/system", ""); 修改为 mount("ext4", "EMMC", "/dev/block/bootdevice/by-name/system2", "/system", "");

重新打包 rom 包

完成以上步骤之后,就可以将 rom 包重新压缩成 zip 文件了。

刷入测试

至此,一个刷入第二系统的刷机包就制作完成了,接下来就是将制作好的刷机包刷入手机测试了。

备份原来系统的 boot 分区

在刷入第二系统之前,需要将原来系统的 boot 分区备份,可以直接使用 TWRP Recovery 的备份功能进行备份。也可以使用 dd 命令进行备份。

刷入 rom 包

备份好 boot 分区之后就可以正式刷入刚才制作好的 rom 包了,刷入方法略。

备份第二系统的 boot 分区

刷入完成之后先别着急开机,需要将刚刷入的 boot 分区进行备份。以便双系统的切换。同样,使用 TWRP Recovery 进行备份。

开机测试

现在就可以开机测试了,不出意外的话开机就可以进入第二个系统了。

双系统切换

第二个系统已经刷进去了,但是如何在两个系统之间进行切换呢?这就要用到刚才备份的两个 boot 分区了。

想要进入哪个系统,恢复对应的 boot 分区就可以了。

很惭愧<br><br>只做了一点微小的工作<br>谢谢大家