调试需要注意选对进程,有时代码调试断点时,并非表面看起来所在包进程
例如:Status.java
/packages/apps/Settings/src/com/android/settings/deviceinfo/Status.java
代码路径在Settings中,默认以为是com.android.settings进程,发现断点处竟然是勾选上的。
但是点击About phone-> Status发现并不能断到断点处。
查询源码发现对应的Activity为Settings$StatusActivity,再看AndroidMenifest文件得到了答案,其被指定了别的进程,即com.android.phone。
/packages/apps/Settings/res/xml/device_info_settings.xml
<PreferenceScreen android:key="status_info"
android:title="@string/device_status"
android:summary="@string/device_status_summary">
<intent android:action="android.intent.action.MAIN"
android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.Settings$StatusActivity" />
</PreferenceScreen>
/packages/apps/Settings/AndroidManifest.xml
<!-- Runs in the phone process since it needs access to the Phone object -->
<activity android:name=".Settings$StatusActivity"
android:label="@string/device_status_activity_title"
android:theme="@style/Theme.SubSettingsDialogWhenLarge"
android:process="com.android.phone">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
</intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.deviceinfo.Status" />
</activity>
调试时,需要断com.android.phone才行,效果如下。
[小结]
因此,调试时需要特别注意相关声明,以及其跑的上下文。