Android源码分析方式

123 阅读3分钟

1、 源码分析方式

-主动调用型,跟着源码一步步一行行的分析(如startActivity)
-被动调用型,即我们可能只知道结果方法,回调方法,需要反推从哪里调用过来的(如Activity的onCreate)

2、日志打印技巧

java端跟踪调用堆栈方法

Log.i("test1","oncreate",new Exception());

/**
 * Send a {@link #INFO} log message and log the exception.
 * @param tag Used to identify the source of a log message.  It usually identifies
 *        the class or activity where the log call occurs.
 * @param msg The message you would like logged.
 * @param tr An exception to log
 */
public static int i(String tag, String msg, Throwable tr) {
    return println(LOG_ID_MAIN, INFO, tag, msg + '\n' + getStackTraceString(tr));
}

3、日志分析

######联系人进程调用startActivity,会最后调用AMS的startActivity 07-18 16:56:49.770 2590 2590 I test1 : client execStartActivity 07-18 16:56:49.770 2590 2590 I test1 : java.lang.Exception 07-18 16:56:49.770 2590 2590 I test1 : at android.app.Instrumentation.execStartActivity(Instrumentation.java:1611) 07-18 16:56:49.770 2590 2590 I test1 : at android.app.Activity.startActivityForResult(Activity.java:4493) 07-18 16:56:49.770 2590 2590 I test1 : at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54) 07-18 16:56:49.770 2590 2590 I test1 : at android.support.v4.app.FragmentActivity.startActivityForResult(Unknown Source:0) 07-18 16:56:49.770 2590 2590 I test1 : at android.app.Activity.startActivityForResult(Activity.java:4451) 07-18 16:56:49.770 2590 2590 I test1 : at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:725) 07-18 16:56:49.770 2590 2590 I test1 : at android.app.Activity.startActivity(Activity.java:4812) 07-18 16:56:49.770 2590 2590 I test1 : at android.app.Activity.startActivity(Activity.java:4780) 07-18 16:56:49.770 2590 2590 I test1 : at com.android.contacts.util.ImplicitIntentsUtil.startActivityInApp(ImplicitIntentsUtil.java:82) 07-18 16:56:49.770 2590 2590 I test1 : at com.android.contacts.util.AccountFilterUtil.startEditorIntent(AccountFilterUtil.java:205) 07-18 16:56:49.770 2590 2590 I test1 : at com.android.contacts.activities.PeopleActivity5.onClick(PeopleActivity.java:542)071816:56:49.77025902590Itest1:atandroid.view.View.performClick(View.java:6294)071816:56:49.77025902590Itest1:atandroid.view.View5.onClick(PeopleActivity.java:542) 07-18 16:56:49.770 2590 2590 I test1 : at android.view.View.performClick(View.java:6294) 07-18 16:56:49.770 2590 2590 I test1 : at android.view.ViewPerformClick.run(View.java:24770) 07-18 16:56:49.770 2590 2590 I test1 : at android.os.Handler.handleCallback(Handler.java:790) 07-18 16:56:49.770 2590 2590 I test1 : at android.os.Handler.dispatchMessage(Handler.java:99) 07-18 16:56:49.770 2590 2590 I test1 : at android.os.Looper.loop(Looper.java:164) 07-18 16:56:49.770 2590 2590 I test1 : at android.app.ActivityThread.main(ActivityThread.java:6494) 07-18 16:56:49.770 2590 2590 I test1 : at java.lang.reflect.Method.invoke(Native Method) 07-18 16:56:49.770 2590 2590 I test1 : at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 07-18 16:56:49.770 2590 2590 I test1 : at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

##########System_server进程的AMS startActivity 打印,从方法堆栈在可以看出属于binder驱动调用,肯定无法看到联系人进程的堆栈 07-18 16:56:49.774 1522 1533 I test1 : system_server startActivity callingPackage == com.android.contacts 07-18 16:56:49.774 1522 1533 I test1 : java.lang.Exception 07-18 16:56:49.774 1522 1533 I test1 : at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4519) 07-18 16:56:49.774 1522 1533 I test1 : at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:121) 07-18 16:56:49.774 1522 1533 I test1 : at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2919) 07-18 16:56:49.774 1522 1533 I test1 : at android.os.Binder.execTransact(Binder.java:697)

##########System_server进程的AMS一切处理完毕,需要通知联系人进程拉起新的Activity 07-18 16:56:49.779 1522 1533 I test1 : system_server app.thread.scheduleLaunchActivity 07-18 16:56:49.779 1522 1533 I test1 : java.lang.Exception 07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:1457) 07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStackSupervisor.startSpecificActivityLocked(ActivityStackSupervisor.java:1580) 07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2726) 07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2255) 07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2094) 07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1486) 07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:1413) 07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:7442) 07-18 16:56:49.779 1522 1533 I test1 : at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:317) 07-18 16:56:49.779 1522 1533 I test1 : at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2919) 07-18 16:56:49.779 1522 1533 I test1 : at android.os.Binder.execTransact(Binder.java:697)

##########通过binder通信调用到了联系人进程的scheduleLaunchActivity方法 07-18 16:56:49.800 2590 2703 D test1 : scheduleLaunchActivity 07-18 16:56:49.800 2590 2703 D test1 : java.lang.Exception 07-18 16:56:49.800 2590 2703 D test1 : at android.app.ActivityThreadApplicationThread.scheduleLaunchActivity(ActivityThread.java:787)071816:56:49.80025902703Dtest1:atandroid.app.IApplicationThreadApplicationThread.scheduleLaunchActivity(ActivityThread.java:787) 07-18 16:56:49.800 2590 2703 D test1 : at android.app.IApplicationThreadStub.onTransact(IApplicationThread.java:196) 07-18 16:56:49.800 2590 2703 D test1 : at android.os.Binder.execTransact(Binder.java:697)

##########联系人应用的主线程调用Activity的onCreate方法 07-18 16:56:49.808 2590 2590 I test1 : Activity onCreate 07-18 16:56:49.808 2590 2590 I test1 : java.lang.Exception 07-18 16:56:49.808 2590 2590 I test1 : at android.app.Activity.onCreate(Activity.java:995) 07-18 16:56:49.808 2590 2590 I test1 : at android.support.v4.app.SupportActivity.onCreate(SupportActivity.java:66) 07-18 16:56:49.808 2590 2590 I test1 : at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:290) 07-18 16:56:49.808 2590 2590 I test1 : at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:84) 07-18 16:56:49.808 2590 2590 I test1 : at com.android.contacts.activities.AppCompatTransactionSafeActivity.onCreate(AppCompatTransactionSafeActivity.java:33) 07-18 16:56:49.808 2590 2590 I test1 : at com.android.contacts.AppCompatContactsActivity.onCreate(AppCompatContactsActivity.java:81) 07-18 16:56:49.808 2590 2590 I test1 : at com.android.contacts.activities.ContactEditorActivity.onCreate(ContactEditorActivity.java:315) 07-18 16:56:49.808 2590 2590 I test1 : at android.app.Activity.performCreate(Activity.java:7005) 07-18 16:56:49.808 2590 2590 I test1 : at android.app.Activity.performCreate(Activity.java:6996) 07-18 16:56:49.808 2590 2590 I test1 : at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) 07-18 16:56:49.808 2590 2590 I test1 : at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731) 07-18 16:56:49.808 2590 2590 I test1 : at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 07-18 16:56:49.808 2590 2590 I test1 : at android.app.ActivityThread.-wrap11(Unknown Source:0) 07-18 16:56:49.808 2590 2590 I test1 : at android.app.ActivityThreadH.handleMessage(ActivityThread.java:1589)071816:56:49.80825902590Itest1:atandroid.os.Handler.dispatchMessage(Handler.java:106)071816:56:49.80825902590Itest1:atandroid.os.Looper.loop(Looper.java:164)071816:56:49.80825902590Itest1:atandroid.app.ActivityThread.main(ActivityThread.java:6494)071816:56:49.80825902590Itest1:atjava.lang.reflect.Method.invoke(NativeMethod)071816:56:49.80825902590Itest1:atcom.android.internal.os.RuntimeInitH.handleMessage(ActivityThread.java:1589) 07-18 16:56:49.808 2590 2590 I test1 : at android.os.Handler.dispatchMessage(Handler.java:106) 07-18 16:56:49.808 2590 2590 I test1 : at android.os.Looper.loop(Looper.java:164) 07-18 16:56:49.808 2590 2590 I test1 : at android.app.ActivityThread.main(ActivityThread.java:6494) 07-18 16:56:49.808 2590 2590 I test1 : at java.lang.reflect.Method.invoke(Native Method) 07-18 16:56:49.808 2590 2590 I test1 : at com.android.internal.os.RuntimeInitMethodAndArgsCaller.run(RuntimeInit.java:438) 07-18 16:56:49.808 2590 2590 I test1 : at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

image.png