准备工作:
- 下载 官方Full-OTA update.zip。从这里找 pro-teammt.ru/firmware-database/?firmware_model=&firmware_page=1 ,搜搜自己的手机型号(可从“关于手机/型号”中查看),比如 荣耀V10高配版为BKL-AL20。下载大于1G甚至2G的FULL-OTA的update.zip文件。下载完成后解压,得到update.app文件
- Huawei update extrator,下载地址:forum.xda-developers.com/showthread.php?t=2433454 ,该软件可解包上述update.app文件,提取出ramdisk.img和vendor.img
- Bootimg.exe,下载地址:github.com/cofface/android_bootimg 这个工具用来解包ramdisk.img
- ROM助手,rom大师,随便什么,能打开vendor.img的。
- 下载supersu beta版,到xda-developor论坛自行下载,本文编写是的版本为supersu beta 2.82 sr5。
开始动手:
6. 解压update.zip得到update.app
7. 用Huawei update extrator解包update.app(解包前,先到设置中,去掉 verify header checksum,否则打不开)
8. 把ramdisk.img和vendor.img提取出来
9. 把ramdisk.img改名为boot.img,并与bootimg.exe放到同一个文件夹
10. 在该文件夹启动cmd(文件→打开命令行提示符),输入bootimg.exe --unpack-bootimg,解包
11. 解包后,编辑initrd文件夹下的init.rc文件,在import /init.${ro.zygote}.rc下添加一行import init.supersu.rc
12. 删除verity_key
13. 解压supersu,把supersu的文件按照这个文件树重新组织,并打包成root.tar (注意,是tar,用tar cvf 命令)
# 压缩文件 C:\android_bootimg-master\root.tar
SuperSU.apk
supersu_install
supersu_install\bin
supersu_install\bin\su
supersu_install\bin\daemonsu
supersu_install\bin\supolicy
supersu_install\bin\supolicy_wrapped
supersu_install\bin\sukernel
supersu_install\xbin
supersu_install\lib
supersu_install\lib\libsupol.so
supersu_install\etc
supersu_install\su.d
supersu_install\file_contexts
supersu_install\supersu_is_here
root.tar与supersu压缩包中文件的对应关系为:
bin/su = bin/daemon=arm64/su
bin/sukernel=arm64/sukernel
bin/supolicy_wrapped=arm64/supolicy
bin/supolicy=arm64/supolicy
lib/libsupol = arm64/libsupol
file_contexts=common/file_contexts
supersu_is_here=common/supersu_is_here
复制完,别忘了chmod +x supolicy 等等
- 复制上面打包好的root.tar到/res/.su下
- 复制fbe_bypass.sh,launch_daemonsu.sh,tar三个文件到/sbin下,修改launch_daemonsu.sh文件,判断/data/adb/su/bin是否存在,如果不存在则解压root.tar到指定目录。【注意,下方的各种代码,英文单引号 ´ 论坛里会自动变掉,请自己复制代码后,把英文引号改正确】
# copy boot image backups
log_print "copying boot image backups from /cache to /data"
cp -f /cache/stock_boot_* /data/. 2>/dev/null
if ($SBIN); then
if [ ! -d "/data/adb/su/bin" ]; then
/sbin/tar xvf /res/.su/root.tar -C /data
fi
上方代码片段的最后三行为需要新增的。
- 给init打补丁:找一台使用supersu2.6以上版本root过的手机,之后在cmd里输入:
adb push init /sdcard/init
adb shell
su
在手机上允许root权限,继续输入
【注意,下方的各种代码,英文单引号 ´ 论坛里会自动变掉,请自己复制代码后,把英文引号改正确】
sed -i ´s/\/system\/etc\/selinux\/plat_sepolicy.cil/\/system\/etc\/selinux\/plat_sepolicy.xxx/g´ /sdcard/init
init文件就打好补丁了,把init文件复制出来,可以使用adb pull
adb pull /sdcard/init init
init文件就拉取到与电脑上adb的同目录了。
用打好补丁的init复制到initrd下,替换官方的init。
12. 给sepolicy打补丁,由于EMUI8使用了split sepolicy,所以ramdisk下没有sepolicy文件,不过你可以从vendor.img中找到他,用ROM助手打开vendor.img,复制/etc/selinux/precompiled_sepolicy出来,改名为sepolicy。之后同样,用已使用supersu2.6版本以上root过的手机,继续操作如下:
adb push sepolicy /sdcard/sepolicy
adb shell
su
supolicy --file /sdcard/sepolicy /sdcard/sepolicy_out --sdk=26
注意,注意!!!千万不要忘记后面的–sdk=26,这是网上各种教程,无论国内国外都没提及的,这里让我踩了好几天的坑!!
这样,sepolicy文件也打好补丁了。把sepolicy_out文件复制出来,改名为sepolicy,放到initrd目录下。
13. 更改 cpiolist.txt 文件,把我们新增的几个文件和文件夹加到里面,这个请参考如下:
compress_level:6
dir . 0755
dir acct 0755
slink bugreports /data/user_de/0/com.android.shell/files/bugreports 0644
dir cache 0770
slink charger /sbin/charger 0644
dir config 0500
slink d /sys/kernel/debug 0644
dir data 0771
slink default.prop system/etc/prop.default 0600
dir dev 0755
dir dload 0755
file dload/update_huawei_dload.zip initrd/dload\update_huawei_dload.zip 0644
slink etc /system/etc 0644
file fstab.zram1024m initrd/fstab.zram1024m 0640
file fstab.zram1280m initrd/fstab.zram1280m 0640
file fstab.zram1536m initrd/fstab.zram1536m 0640
file fstab.zram2240m initrd/fstab.zram2240m 0640
file fstab.zram256m initrd/fstab.zram256m 0640
file fstab.zram512m initrd/fstab.zram512m 0640
file fstab.zram768m initrd/fstab.zram768m 0640
file init initrd/init 0750
file init.environ.rc initrd/init.environ.rc 0750
file init.rc initrd/init.rc 0750
file init.supersu.rc initrd/init.supersu.rc 0750
file init.usb.configfs.rc initrd/init.usb.configfs.rc 0750
file init.usb.rc initrd/init.usb.rc 0750
file init.zygote32.rc initrd/init.zygote32.rc 0750
file init.zygote64_32.rc initrd/init.zygote64_32.rc 0750
dir mnt 0755
dir oem 0755
dir patch 0755
dir patch/cust 0755
dir patch/cust/upper 0755
dir patch/cust/work 0755
dir patch/product 0755
dir patch/product/upper 0755
dir patch/product/work 0755
dir patch/system 0755
dir patch/system/upper 0755
dir patch/system/work 0755
dir patch/vendor 0755
dir patch/vendor/upper 0755
dir patch/vendor/work 0755
dir patch_hw 0755
dir proc 0755
dir res 0755
file res/keys initrd/res\keys 0644
file res/native_packages.xml initrd/res\native_packages.xml 0644
file resetFactory.cfg initrd/resetFactory.cfg 0644
dir res/.su 0750
file res/.su/root.tar initrd/res\.su\root.tar 0750
file rootscan.conf initrd/rootscan.conf 0644
dir sbin 0750
file sbin/adbd initrd/sbin\adbd 0750
file sbin/charger initrd/sbin\charger 0750
file sbin/cota initrd/sbin\cota 0750
file sbin/cust initrd/sbin\cust 0750
file sbin/cust_init initrd/sbin\cust_init 0750
file sbin/factory_reset initrd/sbin\factory_reset 0750
file sbin/fbe_bypass.sh initrd/sbin\fbe_bypass.sh 0700
file sbin/fsck.f2fs_s initrd/sbin\fsck.f2fs_s 0750
file sbin/hdbd initrd/sbin\hdbd 0750
file sbin/huawei_dload initrd/sbin\huawei_dload 0750
file sbin/hw_ueventd initrd/sbin\hw_ueventd 0750
file sbin/kmsgcat initrd/sbin\kmsgcat 0750
file sbin/launch_daemonsu.sh initrd/sbin\launch_daemonsu.sh 0700
file sbin/logctl_service initrd/sbin\logctl_service 0750
file sbin/ntfs-3gd initrd/sbin\ntfs-3gd 0750
file sbin/oeminfo_nvm_server initrd/sbin\oeminfo_nvm_server 0750
file sbin/resize.f2fs_s initrd/sbin\resize.f2fs_s 0750
file sbin/tar initrd/sbin\tar 0750
slink sbin/ueventd ../init 0750
file sbin/volisnotd initrd/sbin\volisnotd 0750
slink sbin/watchdogd ../init 0750
file sbin/xlogcat-early initrd/sbin\xlogcat-early 0750
slink sdcard /storage/self/primary 0644
file sepolicy initrd/sepolicy 0644
dir storage 0751
dir .subackup 0
file .subackup/0000_fstab.zram1024m initrd/.subackup\0000_fstab.zram1024m 0640
file .subackup/0001_fstab.zram1280m initrd/.subackup\0001_fstab.zram1280m 0640
file .subackup/0002_fstab.zram1536m initrd/.subackup\0002_fstab.zram1536m 0640
file .subackup/0003_fstab.zram2240m initrd/.subackup\0003_fstab.zram2240m 0640
file .subackup/0004_fstab.zram256m initrd/.subackup\0004_fstab.zram256m 0640
file .subackup/0005_fstab.zram512m initrd/.subackup\0005_fstab.zram512m 0640
file .subackup/0006_fstab.zram768m initrd/.subackup\0006_fstab.zram768m 0640
file .subackup/0007_init initrd/.subackup\0007_init 0750
file .subackup/0008_init.rc initrd/.subackup\0008_init.rc 0750
file .subackup/0009_verity_key initrd/.subackup\0009_verity_key 0644
file .subackup/index initrd/.subackup\index 0644
dir sys 0755
dir system 0755
file ueventd.rc initrd/ueventd.rc 0644
dir vendor 0755
file version.prop initrd/version.prop 0644
- 最后,重新打包,输入bootimg.exe --repack-ramdisk,看看有没有报错,如果没有,再输入bootimg --repack-bootimg,会生成一个boot-new.img文件。
你就得到了一个内置root权限的boot.img,使用fastboot flash ramdisk boot-new.img 刷到手机里吧。
题外话,你可以不看,仅供部分同学需要:
对于SpilitSepolicy设备,除提取vendor下的precompiled_sepolicy外,还可以自己使用官方文件编译,很简单。
首先找到如下几个文件:
PLAT_CIL="/system/etc/selinux/plat_sepolicy.cil"
MAPPING_CIL=KaTeX parse error: Can't use function '\.' in math mode at position 55: …g | grep -m 1 "\̲.̲cil")
NONPLAT_CIL="/vendor/etc/selinux/nonplat_sepolicy.cil"
POLICY_VERSION=$(cat /sys/fs/selinux/policyvers)
其中MAPPING_CIL在荣耀V10上B132版本上,是/system/etc/selinux/mapping/26.0.cil
之后,使用系统中已经内置的secilc编译,编译格式:
secilc “
P
L
A
T
C
I
L
"
−
M
t
r
u
e
−
c
"
PLAT_CIL" -M true -c "
PLATCIL"−Mtrue−c"POLICY_VERSION” “
M
A
P
P
I
N
G
C
I
L
"
"
MAPPING_CIL" "
MAPPINGCIL""NONPLAT_CIL” -o /sdcard/sepolicy -f /dev/null
如果提示没有权限,你可以先把这些文件都adb pull 出来,之后复制到sdcard上,之后再编译,比如:
【注意,下方的各种代码,英文单引号 ´ 论坛里会自动变掉,请自己复制代码后,把英文引号改正确】
secilc "/sdcard/sepolicy/system/etc/selinux/plat_sepolicy.cil" -M true -c "30" "/sdcard/sepolicy/system/etc/selinux/mapping/26.0.cil" "/sdcard/sepolicy/vendor/etc/selinux/nonplat_sepolicy.cil" -o /sdcard/sepolicy/sepolicy -f /dev/null
这样同样可以得到sepolicy文件,之后再把这个文件用上文所说的方法用supolicy去patch一下,同样可正常使用。
文章转自:https://club.huawei.com/thread-14889191-1-1.html