Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 通過AS調試android源碼 看Activity的啟動過程(1)

通過AS調試android源碼 看Activity的啟動過程(1)

編輯:關於Android編程

看源碼重要性不多說了,本文通過跟蹤代碼學習android根activity(由Laucher啟動的activity)的啟動過程。

1 源碼的下載與編譯(網上很多教程),在此說一下我的方法
我是windows下安裝ubutun 16.04虛擬機(站硬盤80G),在ubuntu上下載和編譯源碼,生成android.iml和android.ipr文件,然後想打開as工程一樣open這個android.ipr文件,然後配置JDK和SDK sdk的android版本和源碼的版本保持一致,然後運行一個對應的nexus 虛擬機(如果有nexus手機直接連接就行了),然後在Launcher.java 的 startActivity(View v,Intent intent ,int flag)上打斷點debug com.android.launcher進程,隨便啟動一個app程序就會跳刀斷點停止,就可以跟蹤代碼了。
Launcher.startActivity

當點擊一個app的圖標,Launcher通過startActivity把view,intent,flag傳遞進來,通過debugger可以看到intent的一些信息
1組件的action、category
2組建信息對象 mComponent 通過mCompoent可以獲取組件類名包名

接著比較易懂調用Activity的startActivity,最終跳轉到startActivityForResult

mToken 是一個Ibinder 它和applicationThread用於和ActivityManagerService 進程間通信

接著step into mInstrumentation.execStartActivity

重點在ActivityManagerNative.getDefault().startActivity
看一下getDefault方法

static public IActivityManager getDefault() {
    return gDefault.get();
}

根據gDefault.get()返回一個IActivityManager
ActivityManager沒有放到AMS類家族裡那麼想要用ActivityManager的方法就要用它的代理類ActivityManagerProxy
那麼gDefault.get()就返回一個ActivityManagerProxy負責ActivityManager的工作。
那麼gDefault如何獲取這個代理的呢?

ServiceManager.getService(“activity”)得到ActivityManagerService的代理對象,
然後通過asInterface(ams)將 創建一個ActivityManagerProxy(IBinder),然後通過ActivityManagerProxy的內部AMS代理對象mRomote向AMS發送一個類型為TRANSACTION類型的進程間通信請求。
這樣根Activity啟動的第一步完成,下次說第二步。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved