平时在进行整机开发的过程中,遇到不熟悉的模块或三方应用,可以通过如下方法找到当前界面显示java文件
1.通过monitor工具
工具在android sdk里面,目录如下:
sdk/tools/monitor
启动后界面如下
a)查看应用包名和UI界面,找到界面相关的View id或string id
b)然后通过grep命令,在源代码里面找到对文件应的布局文件
//以字符串为例,因为布局文件id很多地方都是共用的,很难找到是具体哪个地方在用
chadm@chadm-HP-ZHAN-66-Pro-G1:~/project/android/android10/packages/apps/Settings$ grep -rn '允许手机在接触' --include=*.xml res/
res/values-zh-rCN/strings.xml:849: <string name="nfc_quick_toggle_summary" product="default" msgid="5961264333260120898">"允许手机在接触其他设备时交换数据"</string>
chadm@chadm-HP-ZHAN-66-Pro-G1:~/project/android/android10/packages/apps/Settings$ grep -rn 'nfc_quick_toggle_summary' --include=*.xml res/xml/
res/xml/connected_devices_advanced.xml:35: android:summary="@string/nfc_quick_toggle_summary"
小技艺:
尽量找比较特殊的字符或ID,能缩小范围,提高效率
c)找到使用布局文件的java代码,离找到对应代码逻辑就很接近了
chadm@chadm-HP-ZHAN-66-Pro-G1:~/project/android/android10/packages/apps/Settings$ grep -rn 'connected_devices_advanced' --include=*.java ./
./src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java:64: return R.xml.connected_devices_advanced;
./src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java:98: sir.xmlResId = R.xml.connected_devices_advanced;
找到最终目标文件 :
AdvancedConnectedDeviceDashboardFragment
2.通过adb命令
找到当前界面,以通话为例
chadm@chadm-HP-ZHAN-66-Pro-G1:~/project/android/android10/packages/apps/Settings$ adb shell dumpsys activity | grep mResumed
mResumedActivity: ActivityRecord{519ab3b u0 com.android.dialer/.main.impl.MainActivity t66}
找到界面后,直接找到了对应的java文件
MainActivity
3.通过log查看启动类
使用 adb logcat 命令,可以看到启动一个应用的时候有如下打印:
08-22 19:30:25.743 1350 1450 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.dialer/.main.impl.MainActivity bnds=[637,1133][839,1345] (has extras)} from uid 10103
对应的是ActivityStarter里面的startActivity方法,同时还能看到caller uid,即是哪个应用启动的