Android 调试时,如何查找手机Activity在项目中对应的源码

来源:互联网 发布:淘宝打单插件 编辑:程序博客网 时间:2024/06/09 23:20

Andriod开发新手一枚,这是我的第一篇博客,只是想把自己刚刚研究的方法总结一下,且不管写的怎么样吧。

对于一个新手来说,找到APP界面对应的Activity进行调试似乎不那么容易,本文以Settings里面的WALN界面为例进行分析。

手机通过数据线连上电脑,打开Linux的终端,先假设adb命令都会了,通过adb对手机进行调试,先cd进入“项目名/code/LINUX/android”目录下。

(1)adb logcat -c    清楚之前的log

(2)adb logcat | grep "START u0"          同时在手机上打开该界面,会看到如下结果:

08-07 15:11:08.344 1461 2841 I ActivityManager: START u0 {flg=0x8000 cmp=com.android.settings/.Settings$WifiSettingsActivity (has extras)} from uid 1000 on display 0
这样一来,似乎是找到了该界面的Activity在com.android.settings包下面,且为WifiSettingsActivity,如此简单,收工!

可惜,事实总是太残忍,当你搜索该文件:

(3)find . -name AndroidMainfest.xml | xargs grep Settings$WifiSettingsActivity,没找到

   find . -name AndroidMainfest.xml | xargs grep com.android.settings,还是没找到

    find ./packages/apps/Settings/ -name Settings$WifiSettingsActivity*,查找结果为:

./packages/apps/Settings/
./packages/apps/Settings/src/com/android/settings/utils/SettingsDividerItemDecoration.java
./packages/apps/Settings/src/com/android/settings/SettingsInitialize.java
./packages/apps/Settings/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
./packages/apps/Settings/src/com/android/settings/SettingsPreferenceFragment.java
./packages/apps/Settings/src/com/android/settings/Settings.java
./packages/apps/Settings/src/com/android/settings/SettingsDumpService.java
./packages/apps/Settings/src/com/android/settings/SettingsLicenseActivity.java
./packages/apps/Settings/src/com/android/settings/m4/SettingsDashAdapter.java
./packages/apps/Settings/src/com/android/settings/m4/SettingsDashActivity.java
./packages/apps/Settings/src/com/android/settings/widget/SettingsAppWidgetProvider.java
./packages/apps/Settings/src/com/android/settings/location/SettingsInjector.java
./packages/apps/Settings/src/com/android/settings/accessibility/SettingsContentObserver.java
./packages/apps/Settings/src/com/android/settings/SettingsActivity.java
./packages/apps/Settings/src/com/android/settings/SettingsApplication.java
./packages/apps/Settings/tests/app/src/com/android/settings/tests/SettingsLaunchPerformance.java

压根不是我想要的!不放弃,再找: ls packages/apps/Settings/src/com/android/settings/ | grep Wifi,结果为:WifiCallingSettings.java
终于找到了吗?进去看看:vi packages/apps/Settings/src/com/android/settings/WifiCallingSettings.java,现实总是太残忍,压根不是!

千万要坚持住,此路不通,再换一条路就行了。看到你那个界面的英文“提示符”了吗?WALN!!!

(4)grep "WLAN" -r packages/apps/Settings/res/,结果如下:

packages/apps/Settings/res/values-zh-rHK/strings.xml:    <string name="turn_off_wifi_dialog_text">"當可擕式WLAN熱點工作時,Wi-Fi是需要關閉的。如果需要打開Wi-Fi,請關閉可擕式熱點。"</string>
packages/apps/Settings/res/values-zh-rHK/strings.xml:    <string name="turn_off_wifi_dialog_text">"當可擕式WLAN熱點工作時,Wi-Fi是需要關閉的。如果需要打開Wi-Fi,請關閉可擕式熱點。"</string>
packages/apps/Settings/res/values-zh-rCN/arrays.xml:    <item msgid="8281201165558093009">"WLAN扫描"</item>
packages/apps/Settings/res/values-zh-rCN/strings.xml:    <string name="wfc_provisioned_switch_string" msgid="3985406545172898078">"已配置 WLAN 通话"</string>
packages/apps/Settings/res/values-zh-rCN/strings.xml:    <string name="radio_info_ims_reg_status" msgid="7534612158445529715">"IMS 注册:<xliff:g id="STATUS">%1$s</xliff:g>\nLTE 语音通话:<xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nWLAN 语音通话:<xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\n视频通话:<xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT 接口:<xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
cellular_to_wlan
...排除了很多诸如“WALN”、"WLAN扫描"等干扰项后,终于发现了这一行:

packages/apps/Settings/res/values/strings.xml:    <string name="cellular_to_wlan_title">Cellular->WLAN</string>

简直就是雪中送谈啊!

(5)grep cellular_to_wlan_title -r packages/apps/Settings/src/,结果还是找不到。

(6)grep cellular_to_wlan_title -r packages/apps/Settings/res/ --exclude=strings.xml,在res里面找找,结果:

packages/apps/Settings/res/xml/wifi_advanced_settings.xml:            android:title="@string/cellular_to_wlan_title"

(7)vi packages/apps/Settings/res/xml/wifi_advanced_settings.xml,进去看看,发现:

<ListPreference
            android:key="cellular_to_wlan"
            android:title="@string/cellular_to_wlan_title"
            android:persistent="false"
            android:entries="@array/cellcular2wifi_entries"
            android:entryValues="@array/cellcular2wifi_values" />

找到了title为@string/cellular_to_wlan_title对应的key为cellular_to_wlan。

(8)grep cellular_to_wlan -r packages/apps/Settings/src,结果为:
packages/apps/Settings/src/com/android/settings/wifi/AdvancedWifiSettings.java:    private static final String KEY_CELLULAR_TO_WLAN = "cellular_to_wlan";
packages/apps/Settings/src/com/android/settings/wifi/AdvancedWifiSettings.java:    private static final String CELLULAR_TO_WLAN_CONNECT_TYPE = "cellular_to_wlan_type";
packages/apps/Settings/src/com/android/settings/wifi/AdvancedWifiSettings.java:    private static final String KEY_CELLULAR_TO_WLAN_HINT = "cellular_to_wlan_hint";
packages/apps/Settings/src/com/android/settings/wifi/AdvancedWifiSettings.java:    private static final String CELLULAR_TO_WLAN_HINT = "cellular_to_wlan_hint";
packages/apps/Settings/src/com/android/settings/wifi/AdvancedWifiSettings.java:            if (getResources().getBoolean(R.bool.cellular_to_wlan_hint)) {
packages/apps/Settings/src/com/android/settings/wifi/AdvancedWifiSettings.java:                        getResources().getString(R.string.cellular_to_wlan_hint_toast),
看到private static final String KEY_CELLULAR_TO_WLAN = "cellular_to_wlan",要找的源码应该就在AdvancedWifiSettings.java里面。
(9)grep KEY_CELLULAR_TO_WLAN -r packages/apps/Settings/src,结果为:
packages/apps/Settings/src/com/android/settings/wifi/AdvancedWifiSettings.java:    private static final String KEY_CELLULAR_TO_WLAN = "cellular_to_wlan";
packages/apps/Settings/src/com/android/settings/wifi/AdvancedWifiSettings.java:    private static final String KEY_CELLULAR_TO_WLAN_HINT = "cellular_to_wlan_hint";
packages/apps/Settings/src/com/android/settings/wifi/AdvancedWifiSettings.java:                (ListPreference) findPreference(KEY_CELLULAR_TO_WLAN);
packages/apps/Settings/src/com/android/settings/wifi/AdvancedWifiSettings.java:        mCellularToWlanHintPref = (CheckBoxPreference) findPreference(KEY_CELLULAR_TO_WLAN_HINT);
packages/apps/Settings/src/com/android/settings/wifi/AdvancedWifiSettings.java:        if (KEY_CELLULAR_TO_WLAN.equals(key)) {
packages/apps/Settings/src/com/android/settings/wifi/AdvancedWifiSettings.java:        if (KEY_CELLULAR_TO_WLAN_HINT.equals(key)) {
当看到findPreference(KEY_CELLULAR_TO_WLAN)时,说明手机Settings里的WALN界面对应的源码在AdvancedWifiSettings.java中。大功告成!








阅读全文
0 0
原创粉丝点击