Android自动重启多次的实现

作者:Aningsk ,本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。
 

这里记录了如何实现了让Android设备自动重启,但更有价值的是让Android开机去启动我们自己的脚本的方法。

在做一个项目的时候需要进行可靠性测试,其中包括重启5000和读写文件时重启5000次,这样的可靠性测试。当然让人去手工重启Android设备这么多次,的确不科学;所以我花了一些时间来研究Android如何能够自动重启。

我的想法是:让Android设备启动时,自动调用一个脚本,在这个脚本中执行reboot命令;同时还要记录次数。记录次数就是将一个数字写入文件保存就好,每次执行这个脚本时读取这个文件。关键是如何让Android设备在启动时去调用我们写的脚本。

一开始我进了一个误区,就是想在Linux的启动脚本中添加我想要的功能,但没有成功啊。后来发现Android对Linux的启动做了修改,Android设备启动过程不再是像Linux的PC那样的执行顺序了,Android有自己的一套不同于Linux的启动流程。

 

别的不多说了,直接写过程与遇到的问题。也是自己用于备忘。其中也存在着一些错误疏漏,因为第一次弄,我也是尝试着搞的。希望大家能够指正。

硬件环境:Joey2(CPU:CSR primaII)

软件环境:Android 4.2.2 ;Linux kernel 3.10.16

下面的两步参考了http://www.linuxidc.com/Linux/2012-05/60717.htm (Android教程:开机自动执行Shell脚本)

 

1.首先(其实这一步有点失败),我们是要在设备的文件系统中添加我们的脚本,所以我们改的是Android的文件系统,所在路径:安卓源码目录/system/core/rootdir/etc 。在这个目录下可以看到在设备的/etc下出现的文件。在这里我新建了文件init.test.sh。

touch init.test.sh

当然要写入点儿内容。我想通过这样,在编译文件系统时,将这个文件加入到设备的/etc下。

我的操作:修改在安卓源码目录/system/core/rootdir下的Android.mk文件,添加

copy_from += etc/init.test.sh

(我以为这样可以在重新烧写设备后在/etc下出现init.test.sh,可是最后没有出现,不清楚原因啊。后来用一种蹩脚的方法弥补了。)

 

2.然后,要使Android开机能够去运行这个脚本需要更改设备对应的init.rc文件。所在路径:安卓源码目录/device/csr/common/init.rc(这个路径的名字,不同平台是不一样的,我这里是CSR的CPU)添加:

chmod 755 /system/etc/init.test.sh

chown root shell /system/etc/init.test.sh

service just-test /system/etc/init.test.sh

        class main

        oneshot

以上前两行是为了让init.test.sh有可执行权限。然后的是为了让Android开机运行这个脚本(作为一个叫just-test的服务,服务名可以随便起的)

 

做完上面的编译Android时,会报一个错误,大概意思是说init.test.sh不在ALL_PREBUILT中,所以在安卓源码目录/system/core/rootdir/Android.mk中,我把ALL_PREBUILT的相关内容注释掉了,例如:

#ALL_PREBUILT += $(file)

#$(INSTALLED_RAMDISK_TARGET): $(file)

但实际上编译完成,烧录进去后,在/etc下并没有出现我加的init.test.sh文件。之后也没有通过编译文件系统的方法,加入这个文件;可能是与ALL_PREBUILT有关,但不知道怎么处理。希望有会弄的大神教我啊。所以,我考虑使用adb push将这个脚本放到设备的/etc目录下。但是,发现系统盘是只读的,所以我修改了文件系统的读写权限。

 

3.修改文件系统的读写权限。安卓源码目录/device/csr/common/init.rc中我将可疑的地方都加上了写权限,比如:mount ext4 /dev/block/mmcblk0p6 /system rw。这里的"rw"原本就是"ro"的。然后重新编译烧写,Android设备的文件系统就是可读可写的了。再将init.test.sh用adb push进去;或者直接在里面创建一个并编辑。

 

init.test.sh的内容大概是这样的:

#!/system/bin/sh

times=5000

ls /data/count > /dev/null

if [ $? != 0 ] 

then

        touch /data/count

        echo 1 > /data/count

fi

num=`cat /data/count`

if [ $num –le $times ] 

then 

        sleep 20

        num=`expr $num + 1`

        echo $num > /data/count

        reboot

fi

exit 0

 

在Android里的脚本与纯Linux里的脚本有点不同。Android的是用/system/bin/sh而Linux的常常是/bin/bash。另外就是注意在Android里有的脚本命令是不支持的,比如file命令。(具体支持哪些命令与busybox有关)我最后用了ls来代替,那句话的作用就是检测/data/count是否存在,$?为0则是存在,不为0则是不存在,file和ls在这方面是一样的。然后是慎用cd:切换路径去执行某项工作,一定要cd - 再切换回去;否则就改变了Android启动时所在的路径,Android就启动不了。

 

经过如上的瞎搞,Android就会开机调用我们自己的脚本,然后重启5000次。

 

Aningsk

2014-8-20

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值