在上一篇文章中有提过,编译出来的内核并不能顺利启动,接下来就是调试,找到文件hybris-boot.img解包,具体工具可以看我之前关于M8的帖子。

unpackbootimg -i hybris-boot.img

解包出来的文件

hybris-boot.img          hybris-boot.img-hash        hybris-boot.img-ramdiskoff
hybris-boot.img-base     hybris-boot.img-kerneloff   hybris-boot.img-secondoff
hybris-boot.img-board    hybris-boot.img-pagesize    hybris-boot.img-tagsoff
hybris-boot.img-cmdline  hybris-boot.img-ramdisk.gz     hybris-boot.img-zImage
hybris-boot.img-dtb      

下载twrp-3.2.3-1-m8.img,同样解包,然后替换hybris-boot.img-dtbhybris-boot.img-zImagetwrp-3.2.3-1-m8.img里面,然后在Bootloader下面直接启动,能启动成功,说明编译出来的内核是没有问题的,Bootloader是能直接启动镜像而不需要刷入到boot分区或者recover分区,这样能节省很多时间。

fastboot boot new.img

解包hybris-boot.img-ramdisk.gz,在Ubuntu下面直接双击解压出hybris-boot.img-ramdisk然后再次双击挂载就可以了,查看里面的init文件,发现不是二进制文件,而是shell脚本,其实就是这个脚本:https://github.com/Halium/hybris-boot/blob/master/init-script,我们主要关心,怎样在开机之后开启RNDIS,然后进行调试,可以确定的是M8支持RNDIS,这个在正常的lineageOS 14.1下面可以开启。

这是 hybris-boot 开启RNDIS功能的代码,M8开机,然后通过adb调试,发现$ANDROID_USB/enable这个文件不存在,在最新的LineageOS 16.0 的内核上面有,但依旧不能顺利的开启RNDIS

# This sets up the USB with whatever USB_FUNCTIONS are set to
usb_setup() {
      write $ANDROID_USB/enable        0
      write $ANDROID_USB/functions     ""
      write $ANDROID_USB/enable        1
      usleep 500000 # 0.5 delay to attempt to remove rndis function
      write $ANDROID_USB/enable        0
      write $ANDROID_USB/idVendor      18D1
      write $ANDROID_USB/idProduct     D001
      write $ANDROID_USB/iManufacturer "Mer Boat Loader"
      write $ANDROID_USB/iProduct      "$CUSTOMPRODUCT"
      write $ANDROID_USB/iSerial       "$1"
      write $ANDROID_USB/functions     $USB_FUNCTIONS
      write $ANDROID_USB/enable        1
}

通过这个文件发现,M8开启RNDIS是写入/sys/devices/platform/android_usb/usb_function_switch这个文件,查找之后发现应该大部分HTC手机都是这样子,那么上面的命令修改成下面这样子。

usb_setup() {
      #write $ANDROID_USB/enable        0
      #write $ANDROID_USB/functions     ""
      #write $ANDROID_USB/enable        1
      #usleep 500000 # 0.5 delay to attempt to remove rndis function
      #write $ANDROID_USB/enable        0
      #write $ANDROID_USB/idVendor      18D1
      #write $ANDROID_USB/idProduct     D001
      #write $ANDROID_USB/iManufacturer "Mer Boat Loader"
      #write $ANDROID_USB/iProduct      "$CUSTOMPRODUCT"
      #write $ANDROID_USB/iSerial       "$1"
      #write $ANDROID_USB/functions     $USB_FUNCTIONS
      #write $ANDROID_USB/enable        1
      write /sys/devices/platform/android_usb/usb_function_switch 4
}

修改完重新打包之后,再次用新打包的内核启动,可以看到电脑上多出一个适配器,然后Telnet到手机上调试,这个IP在脚本里面可以看到:

telnet 192.168.2.15

查看到data可以正常挂载。