小米MIX 3/2S/2 +关注 已有39216人关注 +发表新主题
KILYH

发烧级手机控

  1. 1324 积分
  2. 282 经验
  3. 520 贡献值
Ta的主页 发消息
签到
连续0天
0人
签到看排名
扫码下载App
一键签到 升级加速
回复

闲置小米2手机改行车记录仪添加充电自动开机功能

发表在 玩法&技巧 2018-06-07 23:31:20  来自PC 复制链接 手机看帖扫一扫!手机看帖更爽 16 6012

      目前手上有个小米2 因为买了新手机所以小米2一直闲置,最近买了辆汽车 汽车需要一个行车记录仪,就想起来手上的小米2配置不低可以当行车记录仪用,但是手机作为行车记录仪有个问题:就是行车记录仪要有按需开关机功能(即汽车钥匙打到通电状态全车通电,充电器给手机充电,行车记录仪自动开机,汽车关闭后供电关闭,行车记录仪检测到充电停止后自动关机),节省电量,作为手机的小米2显然是没有这个功能的,如何给小米2 添加充电自动开机功能是改造中的一个难点,由于本人之前没有任何Android移植开发经验,就上网搜索结果在MIUI论坛上找到了“newsnake81”的《有无大神教教我小米2/2s 的rom如何改成通电自动开机啊?他也面临这个问题,根据他的提示我从ROM包里面提取了boot.img文件并解包找到init.rc文件,根据他的说法 找到 on charger 然后删除charger 再打包刷入就可以跳过关机充电程序直接开机。

     但是根据我对程序的理解这一步不可能实现,因为删除了on charger 只是会不激活充电程序,但是不会往下走,会卡在开机界面,但是楼主说他实现了这个功能,由于没有进一步的信息,只能按照他的指导操作,找到on charger 并且删除charger,打包刷入,结果和我猜测的一样,根本不可能实现充电开机的功能,而卡在了开机MI的界面,俗称卡米。

      进行完这一步之后我确定了了“newsnake81”的方案并不可行。但是由此我知道了init.rc的作用和android的开机顺序。android 开机首先运行固化于处理器内部rom的bootlaoder,bootloader 初始化硬件之后(包括外置的flash存储芯片)然后将位于flash的boot.img 程序复制到内存中去,(boot.img 主要由两部分构成一个是linux kernel (linux 内核) 就是android 底层的linux提供一切基础操作系统的功能,另外一个就是RAMDISK,这个文件实际上是一个内存盘,就是在内存里面开辟一块区域将其作为硬盘使用并且RAMDISK是根目录,外部其他的文件系统全部挂载在在这个根目录下,我用的解包软件boot.img将boot.img 所有的文件全部释放出来可供我们在windows下进行编辑)接着往下说启动顺序,Linux内核加载完成之后开始执行init.c初始化Android,init.c初始化Android 的过程全部写成了一个脚本就是init.rc 在ramdisk的根目录下,init.rc脚本的语言用的AIL 有兴趣的朋友可以去搜索下教程。为什么手机关机充电会进入充电模式的关键就在这里,init.rc里面有一行代码 on charger 意思是如果是充电模式就启动以下代码,这个charger 是怎么来的呢?是内核启动从电源管理芯片传进来的 bootmode,一直传入init.c 文件中 init.c在解析init.rc脚本的候将如果charger模式,请参考以下代码:

is_charger = !strcmp(bootmode, "charger");    INFO("property init\n");    if (!is_charger)       property_load_boot_defaults();    INFO("reading config file\n");    init_parse_config_file("/init.rc");    action_for_each_trigger("early-init", action_add_queue_tail);    queue_builtin_action(wait_for_coldboot_done_action, "wait_for_coldboot_done");    queue_builtin_action(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng");    queue_builtin_action(keychord_init_action, "keychord_init");    queue_builtin_action(console_init_action, "console_init");    /* execute all the boot actions to get us started */    action_for_each_trigger("init", action_add_queue_tail);    /* skip mounting filesystems in charger mode */    if (!is_charger) {        action_for_each_trigger("early-fs", action_add_queue_tail);        action_for_each_trigger("fs", action_add_queue_tail);        action_for_each_trigger("post-fs", action_add_queue_tail);        action_for_each_trigger("post-fs-data", action_add_queue_tail);    }    /* Repeat mix_hwrng_into_linux_rng in case /dev/hw_random or /dev/random     * wasn't ready immediately after wait_for_coldboot_done     */    queue_builtin_action(mix_hwrng_into_linux_rng_action,"mix_hwrng_into_linux_rng");    queue_builtin_action(property_service_init_action,"property_service_init");    queue_builtin_action(signal_init_action, "signal_init");    queue_builtin_action(check_startup_action, "check_startup");    if (is_charger) {        action_for_each_trigger("charger", action_add_queue_tail);    } else {        action_for_each_trigger("early-boot", action_add_queue_tail);        action_for_each_trigger("boot", action_add_queue_tail);    }        /* run all property triggers based on current state of the properties */    queue_builtin_action(queue_property_triggers_action, "queue_property_triggers");




      能看懂代码的朋友会发现如果init.c发现时charger模式就会激活脚本里面 on charger 命令,android 4.4.4 init.rc中on charger 命令跟的是:class_start charger。这个 class charger 在 init.qcom.rc 有定义指的是 位于RAMDISK根目录下的/sbin/chargeonlymode 可执行文件,当系统检测到是充电模式后会执行chargeronlymode 文件进入充电模式(在init.qcom.rc里面也有on charger 相应命令 内容基本一致,但是加入了省电模式的一些命令,修改的候也要删除)。现在关键的问题是如何跳过charger 模式,我之前的思路是按照init.c 文件里的步骤 将on charger 后面的语句替换为 :
trigger  early-fs
trigger fs
trigger post-fs
trigger post-fs-data
trigger early-boot
trigger boot
       以上语句按照init.c里面is_charger=false的加载顺序重新加载,直接跳过on charger 执行挂载文件系统并启动系统,但是思路没问题,现实很残酷,照样卡米 后来我查询到 bootmode 是在bootloader 阶段传入系统参数ro.boot.mode的,很有可能这个参数在其他地方被调用导致发生冲突无法进入系统,所以只在init里面跳过charger 模式看起来是不可能完成的任务,由于手头没有小米的源码,修改源文件实现开机启动也不可能,在正要放弃的候,我像发神经般的在刷完boot.img后输入了一条 :

fastboot reboot 

     而手机在插着电源的情况下重启后竟然无视充电器的存在直接重启进入系统,我意识到在启动阶段调用reboot可能唯一的解决方案。在国外的一个博客上的一个大神也提到了直接调用reboot命令重启可行,另外我在网上查询启动流程也看到一个哥们说他追踪了Android的源代码发现当
在充电模式下长按按钮也是调用reboot重启进入系统的,当充电模式下重启系统检测如果电池电量大于5%,reboot模式下会无视充电器的存在直接进入系统。既然确定方案就开始干,正确的方案在下面:
首先我在ramdisk/sbin 目录下新建一个 reboot.sh 文件 在文件中键入以下代码

#!/system/bin/sh
/system/bin/reboot
这个命令的意思是调用reboot命令重启手机
打开init.rc 
在early-init 命令后面添加:
chmod 0755 /sbin/reboot.sh

chown root system /sbin/reboot.sh
目的是赋予这个批处理文件最高权限,由于我的操作全部是在windows下进行权限和用户组不确定是不是在linux下可用,所以最好在初始化init
的时候直接修改权限确保可执行。
将init.rc 文件中on charger 后面的命令全部删除然后打开 init.qcom.rc找到 on charger 将文件后面的命令删除只保留以下文本:
mount ext4 /dev/block/platform/msm_sdcc.1/by-name/system /system wait ro barrier=1

class_start charger
在同一个文件中找到 charger 的定义将chargeonlymode更换为reboot.sh就是刚才我们新建的文件
service charger /sbin/reboot.shclass charger
这么做的目的是当init.rc执行charger模式时启动的不是充电文件而是我们刚才新建的重启脚本。
完成修改后保存文件重新打包boot.img 把boot.img 拷入adb文件夹(android调试工具所在的目录应该包含fastboot文件) 
按住音量-和开机键让手机进入fastboot模式并连接电脑在电脑上执行
fastboot flash boot boot.img
将修改好的boot.img文件刷入手机,拔掉电池,插上电源就可以启动了。
       以上所有的操作都是基于秋叶随风的纯净版android4.4.4。 MIUI由于可能有文件校验功能导致修改boot.img后不能root所以没有尝试,我个人认为纯净版的Android更适合行车记录仪这种单一的应用环境,开机速度快,省电。MIUI的很多功能是为手机定制的都没有用处。

     另外我认为由于充电模式进入是Android原生代码,所以我认为只要是原生Android都可以用这个思路执行充电开机操作。

     行车记录仪录像软件我采用的时dailyroads 5.1.1版本,安装完成后可以进行设置,主要设置的就是在设置里面设置摄影的分辨率,聚焦方式,对焦方式建议选无限远模式,连续对焦在运动中容易失焦,在自动模式里面设置 断电暂停,自动继续,在后台启动等 ,开始录制视频等,总之这些设置的目的就是实现软件启动后自动录制视频,断电一段时间后停止录制视频,供电恢复后继续录制。
    自动任务方面我使用的tasker4.8版,tasker 主要添加三个任务:1.开机自动启动行车记录仪软件、2.
断电计时关机、3,供电恢复后标志量复位(确保不因为短时间供电中断导致关机)。为什么不用新版,因为Android4.4.4这个版本安装新版总是解析程序包失败,可能时不兼容,4.8的可以完成开机自启程序,断电一定时间后自动关机等功能,tasker 要多说两句不能只设置一个自动关机的配置文件,实现断电延时关机,因为汽车供电很不稳定如果中途熄火了你再打火,供电恢复了,但是由于你只设置了自动关机任务,一旦供电停止,tasker就会执行关机脚本延时关机,如果在等待关机的时间内供电恢复,但是对不起tasker还是会关机,你只能等再次开机浪费很多时间,如果你建立两个任务建立一个全局变量,在掉电的时候给这个全局变量赋值为0,供电恢复的时候设置这个全局变量为1,如果掉电发生了,这时全局变量为零,再过一段时间你检测全局变量如果全局变量是0的话说明现在供电没有恢复自动关机,如果全局变量不是0说明供电恢复了不执行关机命令,这样就减少了因供电不稳定导致关机情况的发生,所以需要建立两个配置文件共同对一个全局变量操作,一个是掉电,一个是供电。

     整个教程写到这里就完成了,这个行车记录仪接入汽车的ACC电源后能实现车钥匙打到ACC后自动开机录像,中途短时间断电不影响录像,关掉钥匙后延时一定时间自动关机。完整的行车记录仪功能,如果你愿意花10元钱去某宝买个广角摄像头粘再后改上就更好了。由于车在保养,等安装在车上后再补充车载效果!



扫描二维码,手机查看本帖
发表
最新评论 | 正序排列
只看楼主|楼层直达:
  • benhur_w   骨灰级手机控 发表于 03-15 22:38:06 ·来自PC 只看该作者 15#

    小米3可以改么

    回复 举报

  • Mi_599976733   潜力级手机控 发表于 11-17 22:21:46 ·来自PC 只看该作者 14#

    可以付费咨询吗

    回复 举报

  • 乔峰321   神仙级手机控 发表于 10-30 08:04:01 ·来自PC 只看该作者 13#
    sbin文件夹怎么建reboot.sh,修改完打包怎么没有reboot.sh文件

    回复 举报

  • 乔峰321   神仙级手机控 发表于 10-30 07:45:29 ·来自PC 只看该作者 12#
    Mi_35338316 发表于 2018-08-15 01:01:31

    你这样太麻烦了,简单点把sbin/chargeonlymode文件里改成#!/system/bin/reboot这样就好了

    本人小白一个 chargeonlymode用什么软件改

    回复 举报

  • Mi_2169664615   潜力级手机控 发表于 10-28 11:16:16 ·来自PC 只看该作者 11#
    Mi_2169664615 发表于 2018-10-28 11:14:17

    自动关机和中途恢复供电不关机tasker设置:配置文件(非电源任意)关联任务(1,任务-等待30秒;2,系统-重启-关机)配置文件(电源任意)关联任务(任务-停止-非电源任意)

    这样只要在30秒内重新供电就不会关机了

    回复 举报

  • Mi_2169664615   潜力级手机控 发表于 10-28 11:14:17 ·来自PC 只看该作者 10#

    自动关机和中途恢复供电不关机tasker设置:配置文件(非电源任意)关联任务(1,任务-等待30秒;2,系统-重启-关机)

    配置文件(电源任意)关联任务(任务-停止-非电源任意)

    回复 举报

  • Mi_2169664615   潜力级手机控 发表于 10-28 10:56:51 ·来自PC 只看该作者 9#
    Mi_35338316 发表于 2018-08-15 01:01:31

    你这样太麻烦了,简单点把sbin/chargeonlymode文件里改成#!/system/bin/reboot这样就好了

    楼主想得真的复杂,通电自动开机用你的方法简单实用,断电自动关机在tasker里配置关机任务就行,再弄个中途恢复供电直接停止自动关机任务就完事了,还搞什么变量

    回复 举报

  • 小艇1   潜力级手机控 发表于 09-29 14:10:40 ·来自移动端 只看该作者 8#

    楼主能否重新,编辑个简短点的,有些步奏都没说清楚,😂😂

    回复 举报

  • 董驰浩1   高级手机控 发表于 09-10 12:38:21 ·来自PC 只看该作者 7#

    跪求联系,付费咨询。已经私聊你了

    回复 举报

  • Mi_35338316   发烧级手机控 发表于 08-15 01:01:31 ·来自PC 只看该作者 6#

    你这样太麻烦了,简单点把sbin/chargeonlymode文件里改成#!/system/bin/reboot这样就好了

    回复 举报

  • 84BLOCKS   骨灰级手机控 发表于 06-09 10:30:45 ·来自PC 只看该作者 5#

    感觉你非常棒,我就是看不懂

    回复 举报

  • 3642342   高级手机控 发表于 06-08 18:01:11 ·来自PC 只看该作者 4#

    哎,小心你车玻璃被砸哦

    回复 举报

  • 3642342   高级手机控 发表于 06-08 18:01:06 ·来自PC 只看该作者 地板

    哎,小心你车玻璃被砸哦

    回复 举报

  • Mi_944446169   高级手机控 发表于 06-08 16:14:47 ·来自PC 只看该作者 板凳

    只能在后面喊6666,分开说看得懂一点点,连起来完全看不懂

    回复 举报

  • kjdx0631   神仙级手机控 发表于 06-08 07:50:39 ·来自PC 只看该作者 沙发

    高手,不明觉厉的样子

    回复 举报

回复