网上盛传UFS 3.0如何快法(androbench软件测试结果),顺序读取1000+MB/s,顺序写入600+MB/s,但涉及到drivedroid这个软件,我们要测试的是USB与电脑连接后的传输速度。
先说明一下,我的手机型号是GM1917,8+256。型号不符的不能随便刷内核!
先找一根USB3.0的数据线,手机原装的充电线,数据传输都是2.0的,2.0的理论速度是480Mb/s,也就是60Mb/s,由于协议的原因,最高一般只有30MB/s左右。后面我们就提到数据线到底是2.0的,还是3.0的,由于手机的接口是type-c的,所以数据线选择双type-c的数据线,或者type-c - usb3.0_A口的数据线。在USB固态硬盘(NVME的固态持续写入速度>2000MB/s)速度足够快的情况下,笔记本与台式机的typc-c传输速度的理论峰值主要取决于主板上的type-c芯片,供电稳定性,以及最后的USB数据线。type-c芯片用的最多的有两种,5Gb/s(625MB/s),10Gb/s(1250MB/s)笔记本大多使用5Gb/s的,台式机以前也用5Gb/s,现在很多使用10Gb/s,当然也有最新的USB3.2 2x2,也就是20Gb/s(2500MB/s)。
1. adb pull/push(USB)速度测试:
首先要开启adb服务,也就是USB调试模式。先打开手机的设置界面,拉到底,点<关于手机>,点击4次版本号,进入开发者模式,提示开发者模式已打开,然后返回上一层,进入<系统选项>,拉到下面<开发者选项>,进入后,拉到下面,打开USB调式模式。
将手机经USB数据线连接至电脑,在网站https://developer.android.google.cn/studio/releases/platform-tools上找到适用于windows的platform-tools工具,我下载到的是platform-tools_r31.0.3-windows也就是r31.0.3版本(后面的adb/fastboot都是使用版本r31.0.3)。解压到自己选定的目录,进入目录,按住shift键后,鼠标右键,点击”在此处打开powershell窗口“,输入cmd,然后再输入adb devices,看到设备后,就可以开始adb pull/push速度测试了。我选择的是win10的ISO镜像安装文件(cn_windows_10_consumer_editions_version_1903_x64_dvd_8f05241d),大小为4.56G。
1加7pro测试结果:写入117.8MB/s,读取138.9MB/s。
1加8T测试结果:写入168.4MB/s,读取143.1MB/s。
已经超过100MB/s的持续读写速度,USB2.0的数据线是办不到的。
2. 内核打补丁,编译
1加7pro的系统版本是OOS 11.0(Oxygen OS)以上,具体应该是有三个版本11.0.0.2,11.0.1.1,11.0.2.1(当前版本)。
讨论过传输速度的问题了,接下来再进入正题,drivedroid软件的使用问题:还是按照以前的做法,先对内核源码打补丁,编译后再刷机,并安装magisk进行root。
内核源码:https://github.com/freak07/Kirisakura_OP7Pro_A11
补丁:https://www.aliyundrive.com/s/1mZQzKKiVd8
打补丁,主要是针对大于2.1GB镜像无法读取的问题,只需要使用命令:
patch -p1 < oneplus7pro_2.1G_ISO.patch
再正常编译就OK了,然后在目录/out/arch/arm64/boot里找到dtbo.img和Image.gz替换Kirisakura_Guacamole_R_1.1.6.zip压缩包里的两个文件,手机开发者选项里肯定勾上“OEM解锁”,fastboot 模式下可以看下当前的启动分区,因为android11.0以后强制启用A/B分区,也就是两套分区,一套用户数据,理论上都可以用进入系统 ,更新系统时,往往都会启用另外一套分区。所以刷固件或内核时,尽量避免刷乱了,一定要知道自己刷的是哪一套分区。
fastboot oem unlock
fastboot getvar current-slot
刷入内核之前,先在网址下载一个lineage OS 18.1的recovery image(LineageOS Downloads),现阶段twrp-3.5.2_9-0-guacamole不支持OOS11.0,所以用一下lineage OS的recovery ,在刷入它的recovery之前可以先测试一下(oneplus7pro的recovery和boot在一个分区)。
fastboot boot lineage-18.1-20210725-recovery-guacamole.img
fastboot模式下,输入这个命令过1分钟左右,如果启动进入系统 了,说明这个recovery是有效的,如果卡在fastboot,不能进系统,那就不能刷入,需要另想办法。
成功进入系统的话,再直接用adb进入fastboot模式:
adb reboot bootloader
再刷入recovery image:
fastboot flash boot lineage-18.1-20210725-recovery-guacamole.img
重启进入recovery:(按音量上下键选择reovery,再按电源键选择,或者)
fastboot reboot recovery
进入recovery后,先对现有的系统启动分区备份,因为我们先前已经知道启动分区是a还是b了,
选择Advanced,再点击倒数第二个Enable ADB,电脑端输入:
adb shell
ls -l /dev/block/by-name/ | grep boot
结果就是下面的:
F:\Flash\platform-tools>adb shell
OnePlus7Pro:/ # ls -l /dev/block/by-name/ | grep boot
lrwxrwxrwx 1 root root 16 1970-01-10 21:43 boot_a -> /dev/block/sde11
lrwxrwxrwx 1 root root 16 1970-01-10 21:43 boot_b -> /dev/block/sde39
OnePlus7Pro:/ #
dd if=/dev/block/sde11 of=/tmp/boot_a.img
或者
dd if=/dev/block/sde39 of=/tmp/boot_b.img
再把启动镜像pull到电脑上:
exit
adb pull /tmp/boot_a.img .\
或者
adb pull /tmp/boot_b.img .\
接下来,选择第二项apply update,点击apply from ADB,电脑端输入:
adb sideload Kirisakura_Guacamole_R_1.1.6.zip
按音量上下键选择Yes,按电源键刷入内核,如果内核启动不了系统,黑屏或者卡住了,同时按住音量上下键与电源键,三键按大约10秒后, 会强制重启,手机轻振的时候(手机关机,要重启了),只按住音量下键与电源键,过一会进入recovery(如果按住音量上键电源键,进入fastboot模式,注意电源键在fastboot下有确定功能,音量上/下键有选择功能,千万不要长按,不然又重启了);进入fastboot模式,强刷原来的启动镜像。
fastboot flash boot boot_a.img
或者:
fastboot flash boot boot_b.img
刷入镜像如果成功,可以再刷一下magisk23.0(https://www.aliyundrive.com/s/1mZQzKKiVd8),同样是在recovery模式下用adb sideload模式刷入,drivedroid就可以正常使用了。
2.1 UDF格式iso文件读取
2021.6.26.https://www.kernel.org内核网站上有提交UDF格式读取补丁的([1/6] usb:gadget:mass-storage: Improve the signature of SCSI handler function - Patchwork (kernel.org)),前几天才发现,花了点时间,打完补丁编译了一下,然后刷入手机。这个补丁与上面的2.G补丁是冲突的,只能2选1,在内核源码的根目录下直接打上我做好的补丁:
patch -p1 < oneplus7pro_udf_total.patch
正常编译,重复上面2.1G ISO补丁的程序 。
测试结果:好消息是UDF格式镜像读取完全没有问题,windows 7,windows 10直接可以drivedroid安装;坏消息是普通的CDFS格式显示文件结构损坏无法读取。当然用ultra ISO软件读取虚拟光盘是完全没有问题的,镜像文件大小也不受限制,而且普通的镜像文件用ultras ISO软件打开后,只要点击属性,并勾选上UDF,保存后的镜像文件也可以正常读取。
镜像为windows xp sp3中文镜像,勾选UDF。
3. Drivedroid读写速度测试:
经过反复测试,平均读取速度55MB/s左右,峰值可到62MB/s;写入速度平均45MB/s,最低36MB/s,最高61MB/s,波动较大。总的来说,读写速度连adb pull/push的USB读写速度的一半都到不了(又是协议问题吗?),当然比以前测试的三星Note2,红米4Prime,和LG V30要快得多了。距离理想的最低要求:70MB/s速度还是有些差距。
3.1 传输速度提升
网上看了一下USB2.0传输速度问题,改注册表的事。win10下,按win键+x,以管理员权限运行powershell,把“id=”后面的数值替换为自己的USB硬件vid和pid,所谓的vid与pid就是自己手机/vendor/etc/init/hw/init.qcom.usb.rc里cofigfs加载mass_storage功能时的idVendor和idProduct,v表示vendor,p表示product,即为厂商代号与产品代号。然后运行下面的代码(或者把id修改后,保存为bat格式,右键以管理员权限运行,也是可以的)
cmd
set id=05C6F000
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbstor\%id%
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbstor\%id%" /v MaximumTransferLength /t reg_dword /d 2097120 /f
完成命令后重启电脑,再进行传输:
读写4.5G的wim格式文件,连续读取速度峰值直接破100MB/s,平均速度也超过90MB/s,虚拟U盘的持续写入速度要差很多,平均在60MB/s,最低45MB/s,最高92MB/s,起伏很大。这个效果已经比得上中高端的U盘(非flash闪存)了。
这样看来,速度还是相当不错的,看到1加8T的adb pull/push速度 ,drivedroid的读写速度还有提升的空间。前面提起过,在保证连接端(电脑硬盘)读写速度足够快的情况下,传输速度与芯片,供电稳定性和数据线关系最大,数据线肯定是满足的,就剩下手机上的供电稳定性与type-c芯片的关系了。
4. Magisk root带来的麻烦:
magisk root后,它会用自己的一部分文件替换掉系统文件,尤其是我们使用drivedroid时的几个USB相关的文件,比如/vendor/init/hw/init.qcom.usb.rc,这个文件里有厂商的代号,1加的是0x2A70,小米的是0x...,这个代码被统一替换成高通的0x05C6,或者说init.qcom.usb.rc本来就是高通的原版配置文件,手机厂商会在这个文件上进行修改,但magisk又把它改成原来的了,虽然1加7Pro在使用drivedroid暂时没有出问题,但我在小米8等其它手机上就发现了冲突,手机厂商代码混乱,手机直接无法识别。
未完(等待后续是否有更好的内核补丁)。。。。。。