一.目的:
我现在的目的:学会根踪源码的某个模块的运行轨迹。如查看源码中电话本Contacts的执行方式,查看Browser的工作方式(各类中各方法功能实现)
二.有效的方法:
大多数教程都介绍采用debug方式来根踪;这样其实有很多不方便的地方,比如咱们不知道哪个类的功能,不好确定你的当前操作的准确地点。
所以,我采取android最神奇的发明:Log语句,它的神奇在于--在真机上运行时Log出来的打印数据也可以在控制台上显示。
/* package */ void clearHistory(Context context) { // WU0WU Log.v(LOGTAG, "***wu:***" + getClass().getName() + "-->clearHistory()"); ContentResolver resolver = context.getContentResolver(); Browser.clearHistory(resolver); Browser.clearSearches(resolver); }
这面的Log语句是我习惯的写法:
1.//wu0wu是我在源码上加的我本人修改的标记(和源码的代码区分)
2.我在Log的打印数据中先加我的标记:***wu:***"这样在logcat信息里一目了然。
3.在根着getClass().getName()这样就可以打印出当前方法调用所在的类名。一下子就可以定位类的位置。
4."-->clearFormData()"是我在某个类里的所有方法里都加入了上面的那句Log语句,所以这里是当前方法名。一下子定位当前的方法调用位置。
三.编译模块
1.我们在源码的com.android.contacts包下的所有类的所有方法都加这句Log语句。
2.在ubuntn的终端命令窗口中进入源码文件夹,执行. build/envsetup.sh (.后面有空格)
3.使用mmm来编译指定目录的模块,如Contacts:
mmm packages/apps/Contacts
4.编译完后生成两个文件:
out/target/product/generic/data/app/ContactsTests.apk
out/target/product/generic/system/app/
Contacts.apk
5. 使用make snod重新生成system.img
6. 运行模拟器emulator
7.在 emulator中操作Contacts(你想查看的模块,这样你在adb logcat中就能一眼看到你所加的Log标记了)
四.在Logcat中查看显示结果
adb logcat