[置顶] Android开机铃声教程,所有Rom,不论CM还是官方,不论是2.3还是4.0,原则上都适用

分类: rom修改 1026人阅读 评论(0) 收藏 举报 android 脚本 文本编辑 import include 扩展

虽然我个人对开机铃声并没有什么需求,但鉴于很多机油需要,而网络上有没有一篇我认为讲解足够到位的开机铃声教程,所以就抽空写下了这篇教程。
要实现开机铃声,从原理上来讲,不是很复杂,只需在 boot.img 中的 ramdisk 中的 init 脚本中加上相关初始化指令,在系统某个目录(通常是media目录)加入铃声文件即可。
但是,为了便于控制开机铃声的开关或者从根本上取消开机铃声,我下面讲的方法要考虑更加全面些,也更复杂些。
我会写得比较啰嗦,因为会讲一些原理,而不是单纯地讲步骤,请耐心看,或者仅看我着色的文字。

1.首先,我们需要一个开机铃声文件,文件名随便取没关系,这里以 boot.mp3 为例。
我们需要把这个文件放进Rom里,位置随便放也没关系,只要你在后面的步骤中做相应的修改即可。
这里以放到 /system/media/audio/ui 目录下为例。

2.好了,文件放好后,我们得让它播放,怎么做呢?
在 /system/bin 目录下添加一个播放服务即可。
其实这个播放服务的位置也不是必须在 /system/bin 目录下,如果你放在其他地方,那么你需要在后面的步骤中做相应的修改。
这里以放在 /system/bin 目录为例。
现在的问题是,这个程序怎么写?需要用到什么语言?复杂吗?
其实,很简单的,步骤如下:
新建文本文档,名字同样可以随便取,去掉 “.txt” 扩展名,这里以 bootsound 为例,如果你用了其他名字,那么你需要在后面的步骤中做相应的修改。
用记事本等文本编辑工具打开这个文件,写入如下内容
#!/system/bin/sh
bprop=/system/build.prop
play=$(cat $bprop | egrep -c -i -o ro.config.play.bootsound=1)
if [ "$play" = "1" ]; then
stagefright -a -o /system/media/audio/ui/boot.mp3
fi
exit 0

这段程序很简单易懂,我来翻译一下给大家听:
bprop 指向的是 /system/build.prop 文件;
ro.config.play.bootsound 是 bpro 里的一行内容;
play是一个 bool 值(bool值可以理解为,当条件为真时它的值等于1,否则等于0);
只有在 brop 里的 ro.config.play.bootsound 等于 1时,play为真,即play的值等于1;
如果play等于1,那么就播放 /system/media/audio/ui/boot.mp3 这个文件,否则就什么都不做。
至于怎么播放的,其实是调用的 /system/bin 下的 stagefright,这又是另一个故事了,我们此处不必深究。

翻译完毕。


然后这里要注意的是:
程序最后一定要留一行空行;
ro.config.play.bootsound 这个属性的名字你可以随便改,比如改成 ro.bingo.bootsound 也是可行的,前提是你在build.prop里添加属性行时也得这么写(下面会讲到)。
铃声文件的路径也要按照第一步放置的位置进行修改。
其实高手们应该还可以看出其他的一些可以自定义的地方,不过那些没多大意义,我就不赘述了,免得把人弄晕了。

3.相信你已经猜到了,这一步的内容就是往build.prop里面添加属性
打开 /system目录下的 build.prop 文件,在任何你觉得满意的位置添加一行 ro.config.play.bootsound=1(或其他你在上面程序中改过的属性名称)。
这样做相当于为系统添加了一个开机铃声的开关,如果想关闭开机铃声,就修改build.prop中这行的值为 ro.config.play.bootsound=0 即可。
注意,不要添加在开头为 # 号的行,因为 # 号开头表示注释,此行实际效用;
build.prop文件的最后一行也必须留空行;
建议把这行添加在铃声设置的属性行附近,物以类聚,便于寻找和修改。

4.铃声文件有了,播放程序有了,控制开关有了,就差初始化命令了。
打开 /system/etc 目录看看是否有一个叫 init.local.rc 的本地化的初始化脚本(这个中文名字我随便取的)。
<---init开头,rc作为扩展名的,中间带有bt,qcom等有意义字样的,都是初始化脚本。
<---如init.bt.rc、init.qcom.rc分别是蓝牙和高通平台有关的初始化脚本。
<---boot.img解包后的ramdisk里也有初始化脚本,如 init.balde.rc 就是V880这一特定设备的初始化脚本,包含了其分区挂载、服务开启等许多关键内容...
扯得有点远了,回到正题。
如果 /system/etc 目录下有 init.local.rc ,那么恭喜你,马上就要大功告成了。
用文本编辑器打开它,加入如下内容
# Bootsound
service bootsound /system/bin/bootsound
user media
group audio
disabled
oneshot

on property:init.svc.bootanim=running
start bootsound

on property:dev.bootcomplete=1
stop bootsound

上述内容的加入就是告诉系统在每次开机初始化的时候,启动bootsound服务,播放开机铃声。
如果你的bootsound改成了其他名字或者放在其他地方,请在此处做相应修改。
请注意,最后一行依旧要留空。

可是,如果 /system/etc 下没有 init.local.rc 咋办?
有办法,我们需要解包 boot.img ,往里面的更初级的初始化脚本中添加 init.local.rc 脚本支持。
当然,更狠的是,我们还可以直接把上述代码写进那个更初级的初始化脚本里面。
不过这样一来,万一你想改动bootsound的名称或位置,或者你想去掉开机铃声功能时就不那么方便了。
所以我还是建议用记事本等文本编辑程序手动在这里添加一个 init.local.rc 文件,写入上述代码,然后再解包boot.img,添加init.local.rc支持。

5.如何添加 init.local.rc 脚本支持
用Rom厨房等工具解包boot.img,修改其中的 init.rc ,在
# Run sysinit
exec /system/bin/sysinit
的前面添加
# Include extra init file
import /system/etc/init.local.rc

即可。#号后面是注释,可以去掉,但建议写上有意义的内容,方便阅读和修改。
为什么要放在 exec /system/bin/sysinit 的前面呢?
我的理解是 exec /system/bin/sysinit 是执行初始化命令的意思,当然要在执行之前先把初始化脚本import(导入)一下。。。
我也没试过放在其他地方,我见过的有init.local.rc脚本支持的Rom都这样放的,很好奇或者有强迫症的TX可以试一试放在其他位置行不行。
然后就是,重新打包 boot.img ,放入Rom中。

以上教程原则上对CM或是官方,小米或是其他第三方,2.3或是4.0乃至4.1的Rom都是适用的。
到此为止,你的Rom已经支持开机铃声了。


如果你需要bootsound和init.local.rc样板,请访问我的原贴下载附件。

原贴地址:访问原贴,下载附件

http://blog.csdn.net/bingo1991/article/details/7859767

更多相关文章

  1. Android(安卓)RingtoneManager铃声管理
  2. 【MonkeyRunner】eclipse中编写monkeyrunner脚本环境搭建
  3. Windows下载Android全部源码
  4. android 修改开关机铃声
  5. Android中调用startActivity结果导致:java.lang.RuntimeException
  6. Android(安卓)GPS学习 (二) :GPS 服务启动以及初始化流程
  7. TTS在Android中的简单使用
  8. 自定义view-制作一个加载中的圆形
  9. Android底部导航栏实现(一)之BottomNavigationBar

随机推荐

  1. Android(安卓)Studio 出现:Unable to reso
  2. 【Android(安卓)并发编程】android系统架
  3. Android从assets和raw中读取txt文件
  4. Android(安卓)的 KeyEvent : 從 EventHub
  5. LibGDX_1.4: Android(安卓)环境搭建:Eclip
  6. android中的触摸事件处理过程详解
  7. android studio 超长log打印,解决log打印
  8. Android(安卓)HttpClient用法
  9. 发邮件
  10. AndroidのActivity跳转数据通信和跳转动