使用git查阅Android M中Doze相关代码
使用git阅读代码,主要用到这几条命令:
git log
git show
git diff
建议没使用过git的读者先阅读下面的文章:
1. Git教程 - 廖雪峰的官方网站
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
2. Git Community Book 中文版(基本用法、中级技能)
http://gitbook.liuhui998.com/index.html
管理修改
–stat输出修改的统计信息
git跟踪并管理的是修改,而非文件。之所以这样说,是因为每个commit
记录的都是修改。
–stat
用于统计修改信息。列出修改的文件和修改的行数。
查看git仓库的三个命令git log
、git show
、 git diff
,都可以加上--stat
选项列出所修改的文件。所以印证了,git里面能看到的都是修改,git管理的是修改。
git log
git show
git diff
diff格式
diff –gita/f1 b/f1
index6f8a38c..449b072 100644
— a/f1
+++ b/f1
@@ -1,7 +1,7@@
a
a
a
-a
+b
a
a
a
第二部分,变动的位置用两个@作为起首和结束。
@@ -1,7 +1,7@@
前面的”-1,7”分成三个部分:减号表示第一个文件(即f1),”1”表示第1行,”7”表示连续7行。合在一起,就表示下面是第一个文件从第1行开始的连续7行。同样的,”+1,7”表示变动后,成为第二个文件从第1行开始的连续7行。
diff格式的说明,参考《读懂diff - 阮一峰的网络日志》中,五、合并格式的diff
查找代码步骤
在commit message中搜索关键字
git log --stat--grep='doze'
加上—stat后,可以定位到哪个文件与本模块相关。
查看某个文件的修改
–fileName
fileName为任意文件名,查看指定文件的提交信息。(注:文件名应该放到参数的最后位置,通常在前面加上–并用空格隔开表示是文件。)
git log --stat--reverse -- ./services/core/java/com/android/server/DeviceIdleController.java
查找该作者那一段时间的提交
–author=someone
查询指定作者的提交记录
$ git log --author='DianneHackborn'
--since,--affter
–since,–affter
仅显示指定时间之后的提交(不包含当前日期)
–until,–before
仅显示指定时间之前的提交(包含当前日期)
寻找代码责任人(何时由和人添加)
git blame[filename]
得到整个文件的每一行的详细修改信息:包括SHA串,日期和作者:
也可以用”-L”参数在命令(blame)中指定开始和结束行:
git blame -L 160,+10 sha1_file.c
在历史修改中搜索
使用gitlog –grep=''
只搜索commitmessage, -S搜索修改的代码)
gitlog -S
通过查询文件的变更内容来检索出指定提交日志注:-S后没有”=”,与查询内容之间也没有空格符
你也可以用”-L”参数在命令(blame)中指定开始和结束行:
例子:在Android M源码上搜索doze mode相关的代码:
在commit message中搜索,定位到相关的commit
git log --stat--grep='doze'
阅读log后,发现commit4a503b1ece485d44c15eb02ec2bcd464b46e6f7f
中,“Separate battery whitelists”是doze的一个重要特性。对DeviceIdleController.java*文件进行了最多的修改。所以定位到DeviceIdleController.java。
查找该文件修改历史。
加—reverse
后,方便查看最早提交的commit
git log --stat --reverse --./services/core/java/com/android/server/DeviceIdleController.java
commit 8ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18
Author: Dianne Hackbornhackbod@google.com
Date: TueMar 17 17:00:24 2015 -0700
Firststab at device idle mode.
……..
…/com/android/server/DeviceIdleController.java | 424++++++++++++++++++++
1 filechanged, 424 insertions(+)
根据修改行数的多少和commit message的描述。记录几重要版本
commit 88e98dfa59e68a860d8c3b462ec03bc0b06d6b5c
commit88e98dfa59e68a860d8c3b462ec03bc0b06d6b5c
以及记录作者Dianne Hackborn。
doze mode涉及哪些文件?
git log8ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18 --stat
…/android/hardware/display/DisplayManager.java | 3+-
core/java/android/net/INetworkPolicyManager.aidl | 3+-
core/java/android/os/BatteryStats.java | 82 +++-
…/com/android/internal/app/IBatteryStats.aidl | 1 +
…/com/android/internal/os/BatteryStatsImpl.java | 129++++–
…/com/android/server/DeviceIdleController.java | 424++++++++++++++++++++
…/android/server/am/ActivityManagerService.java | 8+
…/com/android/server/am/BatteryStatsService.java| 26 +-
…/android/server/job/JobSchedulerService.java | 4 +-
…/server/net/NetworkPolicyManagerService.java | 31+-
services/java/com/android/server/SystemServer.java| 1 +
11 fileschanged, 649 insertions(+), 63 deletions(-)
这些是我们需要了解的文件。其中,DeviceIdleController.java修改的行数最多(424行),所以他就是重点研究内容。
根据作者查找相关代码:
发现本文件的提交者和主要的维护者是Dianne Hackborn。为查找相关信息:
1. google这个人名;
2. 查找作者的提交:git log --author='DianneHackborn' –stat
如果发现提交太多,就指定搜索临近时间的commit:
git log--author='Dianne Hackborn' --stat --after={2015-07-18} --before={2015-08-01} –reverse
或
git log--author='Dianne Hackborn' --stat --since={2015-03-17} --until={2015-04-18}--reverse
当遇到不能理解的代码
找出代码是在哪一个commit中提交的
git blame sha1_file.c
或
git blame -L 160,+10sha1_file.c
或
git log-S'val->intval = batt_info->fRSOC+1;' -p --drivers/power/O2_power/oz8806_battery.c
所以规范的commit是很有用的,可以参考网上”GIT_COMMIT_规范要求“相关的文章。