论初次修改 Android framework 代码
背景
公司产品需求,需要修改系统 framework 层的部分界面显示,包括声音调节、亮度调节、长按电源关机等。
准备
我并不是白手起步,有负责硬件的同学帮我搭建编译环境、vim 编辑环境(一些辅助插件)。由于 android 源码结构太过复杂,不建议强记,但是它的层次还是要大概清楚,比如 framework层 -> base -> core,policy,package,大部分的需求,在这三个包里面进行代码的修改即可。
Note:以下所有操作均在 Ubtuntu 14.04 LTS 系统上完成。
修改音量调节
- 开始:代码定位
对于不熟悉 android 源码的同学,比如我,选择的入手点很重要,首先是代码、界面的定位,找到需要修改的类和布局文件,这需要一点点耐心。先来看看原生的界面显示:
这是我用三星s6调节音量的界面,仅供参考。
看看这张图片有什么亮点,咳咳,是特点,细心的同学的已经发现了,界面上有一个文本:铃声(不同的设备(手机)、不同的场景显示的文本不一样,也有不显示文本的奇葩系统,不管是哪种情况,最多只是增加了定位的难度而已,其实 android 源码的结构不会发生太大的变化)。文本有时候显示的是:音量、声音、媒体,不幸的是,公司的设备不显示任何文本文字。
首先进入到 android -> framework -> base 目录下,下文不做特殊说明,都是在此目录下,执行以下命令:
grep "铃声" -r *
该命令是在当前目录及子目录中,寻找所有使用“铃声”的文件,大致结果如下(仅供参考):
很容易就看出,这些文本文字都定义在 strings.xml 资源文件中,然后我们根据任意资源名称再次搜索,这里我们就选择第一个,命令如下:
grep "volume_ringtone" -r *
结果如下:
偶偶,结果好多,我只截取了部分,不过也能看出搜索答案了,搜索结果还是在 string.xml 文件中,没有 java 文件,没有布局文件,这表示我们的搜索结果是不对的(沮丧脸)。Why? 因为设备不是显示“铃声”,用它进行搜索当然无结果咯,就像女朋友想买一个包包,你却给她买了台电脑一样。
这个时候你就需要不断的用不同的关键词搜索,用甜言蜜语去哄女盆友。我用了:声音、音量、语音等,功夫不负有心人,终于让我试出来了。搜索“语音”,结果如下:
用上图红框中的 serviceClassVoice 进行搜索,结果如下:
终于不再是清一色的 strings.xml 文件了,这一步基本算是完成了。最后仔细看了看,居然搜索“音声”也能搜索出来,wtf!
Note:在没有文本提示的情况下,只能大概的推测出中文文本,或者翻译成英文进行搜索,这不能缺乏耐心哦~~
- 定位 java 文件
根据第一步找到的 volume_adjust_item.xml 文件,进一步定位 java 文件,命令如下:
grep volume_adjust_item -r *
结果如下图所示:
很容易就找到了 VolumePanel.java 文件,这就是调节音量的核心代码文件,至于怎么蹂躏它,就看你的本事了。
总结
学到了很多命令,以及 Vim 编辑器的使用,以及编译推送命令。比如 /查找、hjkl方向键、n和shift+n、adb push、adb pull、stop、start等。
以调节音量为例子,以此类推,调节亮度,调节关机界面等,都是差不多的步骤。