- 目的需求:在手机关机状态下,若是通电,则自动开机.
- 使用场景:手机做4G路由器热点使用;备用手机常年通电做转发短信未接来电;做车载导航行车记录仪等;
- 方法思路:确定手机关机状态下充电时会调用什么脚本命令,然后在脚本命令中添加入重启指令。
步骤预览:
- 提取手机boot.img镜像
- 解包boot.img镜像
- 修改init.rc文本
- 打包boot.img
- 刷入修改后的boot.img到手机
- 完成,测试
实践环境:
- 手机: Redmi Note5; Android 版本 9; MIUI 版本10 9.9.3开发版;
- 电脑: windows10
- 工具: ADB, Fastboot, Bootimg [工具下载:把你的旧手机改造成车载导航.zip]
1. 提取手机boot.img镜像
- 1.1. 手机打开USB调试(开发者选项)
- 1.2. 手机USB连接电脑
- 1.3. 在CMD窗口cd到adb.exe的路径,输入“adb devices”来检测一下链接状况。
1 2 3 |
C:\platform-tools>adb devices List of devices attached 63d76abf device #连接成功 |
- 1.4. 输入“adb shell”,回车,再输入“su”回车,这注意看,提示符应该已经从$符号变成了#号。
- 1.5. 输入命令搜索"find /dev/block/platform/ -name by-name"来找到"by-name"文件夹路径
1 2 3 4 |
2|:/dev # find /dev/block/platform/ -name by-name find /dev/block/platform/ -name by-name find /dev/block/platform/ -name by-name /dev/block/platform/soc/c0c4000.sdhci/by-name //找到需要的路径 |
- 1.6. 输入命令列出搜索到的文件夹"ls -al /dev/block/platform/soc/c0c4000.sdhci/by-name",找到boot对应文件名称为"mmcblk0p58"
1 2 3 4 5 6 7 8 9 10 11 |
ls -al /dev/block/platform/soc/c0c4000.sdhci/by-name total 0 drwxr-xr-x 2 root root 1320 1970-01-01 08:02 . drwxr-xr-x 3 root root 1380 1970-01-01 08:02 .. lrwxrwxrwx 1 root root 21 1970-01-01 08:02 abl -> /dev/block/mmcblk0p25 lrwxrwxrwx 1 root root 21 1970-01-01 08:02 ablbak -> /dev/block/mmcblk0p26 lrwxrwxrwx 1 root root 21 1970-01-01 08:02 apdp -> /dev/block/mmcblk0p11 lrwxrwxrwx 1 root root 21 1970-01-01 08:02 bk1 -> /dev/block/mmcblk0p49 lrwxrwxrwx 1 root root 21 1970-01-01 08:02 bk2 -> /dev/block/mmcblk0p51 lrwxrwxrwx 1 root root 21 1970-01-01 08:02 bluetooth -> /dev/block/mmcblk0p38 lrwxrwxrwx 1 root root 21 1970-01-01 08:02 boot -> /dev/block/mmcblk0p58 //找到boot对应文件名称为"mmcblk0p58" |
- 1.7. 开始提取,输入“dd if=/dev/block/mmcblk0p58 of=/sdcard/boot.img”,这里的"mmcblk0p58"就是刚才上面找到的boot对应文件.
- 1.8. 把提取的"boot.img"文件拷贝到电脑
2. 解包boot.img镜像
- 2.1. 电脑上把拷贝的boot.img和bootimg.exe放在相同目录下。最好单独建个目录,把这两个文件放进去,因为后续会产生很多文件,以免混乱。
- 2.2 . CMD到bootimg.exe目录下执行“bootimg --unpack-bootimg” 解包 //路径不能有中文.否则报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
C:\platform-tools\bootimg>bootimg --unpack-bootimg arguments: [bootimg file] bootimg file: boot.img output: kernel[.gz] ramdisk[.gz] second[.gz] base: 0x0 ramdisk_addr: 0x1000000 second_addr: 0xf00000 tags_addr: 0x100 page_size: 4096 name: "" cmdline: "console=ttyMSM0,115200,n8 androidboot.console=ttyMSM0 earlycon=msm_serial_dm,0xc170000 androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x37 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 sched_enable_hmp=1 sched_enable_power_aware=1 service_locator.enable=1 swiotlb=1 firmware_class.path=/vendor/firmware_mnt/image loop.max_part=7 buildvariant=user" padding_size=4096 arguments: [ramdisk file] [directory] ramdisk file: ramdisk.gz directory: initrd output: cpiolist.txt compress: True |
3. 修改init.rc文本
- 3.1. 解包boot.img后会获得"initrd"文件夹,里面有我们需要修改的"init.rc"文件
- 3.2. 使用EmEditor修改init.rc文件,在"on charger"这一项目添加"setprop sys.powerctl reboot"
1 2 3 |
on charger class_start charger #这段自带不用删也可以,而且听说某些系统需要先进入charger流程,否则会卡第一屏 setprop sys.powerctl reboot #添加进这段 |
- 3.3. 修改init.rc完毕,保存.
4. 打包boot.img
- 4.1. 现在要把修改的文件重新打包成boot.img。还是回到刚才的cmd窗口。输入“bootimg --repack-bootimg”回车。程序会自动把文件打包回去。现在目录下就会变成3个文件,一个程序bootimg.exe,一个原始文件boot-old.img,一个新生成的文件boot-new.img。
5. 刷入修改后的boot.img到手机
- 5.1. 把boot-new.img拷贝到adb.exe所在的目录,并且重命名为boot.img,在此目录打开命令窗口。
- 5.2. 把手机进入到fastboot的状态。关机,同时按住音量减和电源键。这时你的手机会进入fastboot的状态,准备开始写入boot.img。
- 5.3. 在命令窗口输入“fastboot flash boot boot.img”回车,开始刷写boot.img。因为文件很小,几秒钟就提示完成了。
- 5.4. 输入“fastboot reboot”回车,会重启手机
6. 完成,测试
- 6.1 操作完以上步骤,就实现了安卓关机状态通电自动开机.
- 6.2 测试1: 关机,保持usb线供电,数秒后自动开机.
- 6.3 测试2: 关机.拔掉usb线,然后插入usb线,数秒后自动开机.
- 完成.
参考资料